mirror of
https://github.com/switchbrew/libnx.git
synced 2025-07-03 18:12:14 +02:00
Corrections and adjustments
This commit is contained in:
parent
7cf656f025
commit
024f6358b9
@ -2,14 +2,16 @@
|
|||||||
#include "services/sm.h"
|
#include "services/sm.h"
|
||||||
#include "services/lm.h"
|
#include "services/lm.h"
|
||||||
#include "kernel/mutex.h"
|
#include "kernel/mutex.h"
|
||||||
|
#include "arm/counter.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
static Mutex g_logMutex;
|
static Mutex g_logMutex;
|
||||||
|
|
||||||
/// DiagLogPacketFlags
|
/// DiagLogPacketFlags
|
||||||
typedef enum {
|
typedef enum {
|
||||||
DiagLogPacketFlags_Head = BIT(0), ///< First packet.
|
DiagLogPacketFlags_Head = BIT(0), ///< First packet.
|
||||||
DiagLogPacketFlags_Tail = BIT(1), ///< Last packet.
|
DiagLogPacketFlags_Tail = BIT(1), ///< Last packet.
|
||||||
|
DiagLogPacketFlags_LittleEndian = BIT(2), ///< Whether the packet is little-endian.
|
||||||
} DiagLogPacketFlags;
|
} DiagLogPacketFlags;
|
||||||
|
|
||||||
/// DiagLogPacketHeader
|
/// DiagLogPacketHeader
|
||||||
@ -97,7 +99,8 @@ NX_CONSTEXPR void diagU64ChunkTypeSetValue(DiagU64ChunkType *chunk_type, DiagLog
|
|||||||
chunk_type->value = value;
|
chunk_type->value = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define DIAG_MAX_STRING_LEN 0xFF
|
// Despite the max length is technically 0xFF (length is stored as a byte), N uses this value as the max length strings can have.
|
||||||
|
#define DIAG_MAX_STRING_LEN 0x7F
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
DiagLogDataChunkTypeHeader header;
|
DiagLogDataChunkTypeHeader header;
|
||||||
@ -142,16 +145,12 @@ typedef struct {
|
|||||||
NX_INLINE DiagLogPacket *diagAllocateLogPackets(const size_t msg_len, size_t *out_packet_count) {
|
NX_INLINE DiagLogPacket *diagAllocateLogPackets(const size_t msg_len, size_t *out_packet_count) {
|
||||||
size_t remaining_len = msg_len;
|
size_t remaining_len = msg_len;
|
||||||
size_t packet_count = 1;
|
size_t packet_count = 1;
|
||||||
|
// N allows a max length of 0x7F here instead of 0xFF, but we'll use 0xFF.
|
||||||
while(remaining_len > DIAG_MAX_STRING_LEN) {
|
while(remaining_len > DIAG_MAX_STRING_LEN) {
|
||||||
packet_count++;
|
packet_count++;
|
||||||
remaining_len -= DIAG_MAX_STRING_LEN;
|
remaining_len -= DIAG_MAX_STRING_LEN;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Always send at least 2 packets, a head and a tail.
|
|
||||||
if (packet_count < 2) {
|
|
||||||
packet_count = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
DiagLogPacket *packets = (DiagLogPacket*)calloc(packet_count, sizeof(DiagLogPacket));
|
DiagLogPacket *packets = (DiagLogPacket*)calloc(packet_count, sizeof(DiagLogPacket));
|
||||||
if (packets == NULL) {
|
if (packets == NULL) {
|
||||||
return 0;
|
return 0;
|
||||||
@ -237,6 +236,8 @@ NX_CONSTEXPR u8 *diagLogPayloadEncodeStringChunkType(u8 *payload_buf, DiagString
|
|||||||
return diagLogPayloadEncode(buf, chunk_type->value, chunk_type->header.chunk_len);
|
return diagLogPayloadEncode(buf, chunk_type->value, chunk_type->header.chunk_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
void diagLogImpl(const DiagLogMetadata *metadata) {
|
void diagLogImpl(const DiagLogMetadata *metadata) {
|
||||||
mutexLock(&g_logMutex);
|
mutexLock(&g_logMutex);
|
||||||
Result rc = smInitialize();
|
Result rc = smInitialize();
|
||||||
@ -250,9 +251,10 @@ void diagLogImpl(const DiagLogMetadata *metadata) {
|
|||||||
DiagLogPacket *packets = diagAllocateLogPackets(text_log_len, &packet_count);
|
DiagLogPacket *packets = diagAllocateLogPackets(text_log_len, &packet_count);
|
||||||
if (packet_count > 0 && packets != NULL) {
|
if (packet_count > 0 && packets != NULL) {
|
||||||
DiagLogPacket *head_packet = &packets[0];
|
DiagLogPacket *head_packet = &packets[0];
|
||||||
head_packet->header.flags = DiagLogPacketFlags_Head;
|
head_packet->header.flags |= DiagLogPacketFlags_Head;
|
||||||
|
// If we're sending a single packet, these two packets will be the same.
|
||||||
DiagLogPacket *tail_packet = &packets[packet_count - 1];
|
DiagLogPacket *tail_packet = &packets[packet_count - 1];
|
||||||
tail_packet->header.flags = DiagLogPacketFlags_Tail;
|
tail_packet->header.flags |= DiagLogPacketFlags_Tail;
|
||||||
|
|
||||||
const size_t file_name_len = __builtin_strlen(metadata->source_info.file_name);
|
const size_t file_name_len = __builtin_strlen(metadata->source_info.file_name);
|
||||||
diagStringChunkTypeSetValue(&head_packet->payload.file_name, DiagLogDataChunkKey_FileName, metadata->source_info.file_name, file_name_len);
|
diagStringChunkTypeSetValue(&head_packet->payload.file_name, DiagLogDataChunkKey_FileName, metadata->source_info.file_name, file_name_len);
|
||||||
@ -266,6 +268,12 @@ void diagLogImpl(const DiagLogMetadata *metadata) {
|
|||||||
const char *module = "libnx";
|
const char *module = "libnx";
|
||||||
diagStringChunkTypeSetValue(&head_packet->payload.module_name, DiagLogDataChunkKey_ModuleName, module, __builtin_strlen(module));
|
diagStringChunkTypeSetValue(&head_packet->payload.module_name, DiagLogDataChunkKey_ModuleName, module, __builtin_strlen(module));
|
||||||
|
|
||||||
|
/* TODO: what conversions does N apply to get the UserSystemClock value? it's not just system tick -> seconds
|
||||||
|
const u64 tick = armGetSystemTick();
|
||||||
|
const u64 seconds = armTicksToNs(tick) / 1000000000ul;
|
||||||
|
diagU64ChunkTypeSetValue(&head_packet->payload.user_system_clock, DiagLogDataChunkKey_UserSystemClock, seconds);
|
||||||
|
*/
|
||||||
|
|
||||||
size_t remaining_len = text_log_len;
|
size_t remaining_len = text_log_len;
|
||||||
DiagLogPacket *cur_packet = head_packet;
|
DiagLogPacket *cur_packet = head_packet;
|
||||||
const char *text_log_buf = metadata->text_log;
|
const char *text_log_buf = metadata->text_log;
|
||||||
@ -279,6 +287,8 @@ void diagLogImpl(const DiagLogMetadata *metadata) {
|
|||||||
|
|
||||||
for(size_t i = 0; i < packet_count; i++) {
|
for(size_t i = 0; i < packet_count; i++) {
|
||||||
DiagLogPacket *cur_packet = &packets[i];
|
DiagLogPacket *cur_packet = &packets[i];
|
||||||
|
// We're sending all packets as little-endian.
|
||||||
|
cur_packet->header.flags |= DiagLogPacketFlags_LittleEndian;
|
||||||
cur_packet->header.severity = (u8)metadata->severity;
|
cur_packet->header.severity = (u8)metadata->severity;
|
||||||
cur_packet->header.verbosity = (u8)metadata->verbosity;
|
cur_packet->header.verbosity = (u8)metadata->verbosity;
|
||||||
|
|
||||||
@ -325,7 +335,14 @@ void diagLogImpl(const DiagLogMetadata *metadata) {
|
|||||||
payload_buf = diagLogPayloadEncodeStringChunkType(payload_buf, &cur_packet->payload.process_name);
|
payload_buf = diagLogPayloadEncodeStringChunkType(payload_buf, &cur_packet->payload.process_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = lmLog(log_buf, log_buf_size);
|
// rc = lmLog(log_buf, log_buf_size);
|
||||||
|
char path[0x301] = {};
|
||||||
|
sprintf(path, "sdmc:/%ld-diag.bin", i);
|
||||||
|
FILE *f = fopen(path, "wb");
|
||||||
|
if(f) {
|
||||||
|
fwrite(log_buf, log_buf_size, 1, f);
|
||||||
|
fclose(f);
|
||||||
|
}
|
||||||
free(log_buf);
|
free(log_buf);
|
||||||
if (R_FAILED(rc)) {
|
if (R_FAILED(rc)) {
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user