Skip to content

Commit 06f01d3

Browse files
committed
Match kdebugserver
1 parent 66e927b commit 06f01d3

File tree

4 files changed

+88
-8
lines changed

4 files changed

+88
-8
lines changed

splat.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ segments:
329329
- [0x98B70, .data, libultra/io/piacs]
330330
- [0x98B80, .data, libultra/os/rdbsend]
331331
- [0x98B90, data, libultra/vi/vimodes]
332-
- [0x98C80, data, libultra/debug/kdebugserver]
332+
- [0x98C80, .data, libultra/debug/kdebugserver]
333333
- [0x98C90, .data, libultra/libc/xprintf]
334334
- [0x98CE0, .data, libultra/rmon/rmoncmds]
335335
- [0x98DC0, .data, libultra/libc/xlitob]

src/libultra/debug/kdebugserver.c

+86-6
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,91 @@
1-
#include "common.h"
1+
// @DECOMP_OPT_FLAGS=-O1
2+
#include "PR/os_internal.h"
3+
#include "PR/rcp.h"
4+
#include "PR/rdb.h"
5+
#include "bss.h"
26

3-
#pragma GLOBAL_ASM("asm/nonmatchings/libultra/debug/kdebugserver/string_to_u32.s")
7+
extern OSThread *__osRunningThread;
8+
extern u32 __osRdb_IP6_Empty;
49

5-
#pragma GLOBAL_ASM("asm/nonmatchings/libultra/debug/kdebugserver/send_packet.s")
10+
BSS_STATIC u8 kdebugserver_buffer[12]; // original name: buffer
11+
static u32 numChars = 0;
612

7-
#pragma GLOBAL_ASM("asm/nonmatchings/libultra/debug/kdebugserver/clear_IP6.s")
13+
static u32 string_to_u32(u8* s) {
14+
u32 k;
815

9-
#pragma GLOBAL_ASM("asm/nonmatchings/libultra/debug/kdebugserver/send.s")
16+
k = ((s[0] & 0xFF) << 0x18);
17+
k |= ((s[1] & 0xFF) << 0x10);
18+
k |= ((s[2] & 0xFF) << 0x8);
19+
k |= (s[3] & 0xFF);
1020

11-
#pragma GLOBAL_ASM("asm/nonmatchings/libultra/debug/kdebugserver/kdebugserver.s")
21+
return k;
22+
}
23+
24+
static void send_packet(u8* s, u32 n) {
25+
rdbPacket packet;
26+
u32 i;
27+
28+
packet.type = 0xC;
29+
packet.length = n;
30+
31+
for (i = 0; i < n; i++) {
32+
packet.buf[i] = s[i];
33+
}
34+
*(vu32*)RDB_BASE_REG = *(u32*)&packet;
35+
}
36+
37+
static void clear_IP6(void) {
38+
while (!(__osGetCause() & CAUSE_IP6)) {
39+
;
40+
}
41+
*(vu32*)RDB_READ_INTR_REG = 0;
42+
43+
while (__osGetCause() & CAUSE_IP6) {
44+
;
45+
}
46+
}
47+
48+
static void send(u8* s, u32 n) {
49+
u32 ct;
50+
u32 i = 0;
51+
u32 getLastIP6;
52+
53+
if (!__osRdb_IP6_Empty) {
54+
clear_IP6();
55+
getLastIP6 = FALSE;
56+
} else {
57+
getLastIP6 = TRUE;
58+
}
59+
while (n != 0) {
60+
ct = (n < 3) ? n : 3;
61+
send_packet(s + i, ct);
62+
n -= ct;
63+
i += ct;
64+
if (n != 0) {
65+
clear_IP6();
66+
}
67+
}
68+
if (getLastIP6) {
69+
clear_IP6();
70+
}
71+
}
72+
73+
void kdebugserver(rdbPacket packet) {
74+
u32 i;
75+
u32 length;
76+
u8* addr;
77+
78+
for (i = 0; i < 3; i++) {
79+
kdebugserver_buffer[numChars++] = packet.buf[i];
80+
}
81+
82+
if (kdebugserver_buffer[0] == 2) {
83+
send((char*)&__osRunningThread->context, sizeof(__OSThreadContext));
84+
numChars = 0;
85+
} else if (numChars >= 9 && kdebugserver_buffer[0] == 1) {
86+
addr = string_to_u32(&kdebugserver_buffer[1]);
87+
length = string_to_u32(&kdebugserver_buffer[5]);
88+
send(addr, length);
89+
numChars = 0;
90+
}
91+
}

symbol_addrs.txt

-1
Original file line numberDiff line numberDiff line change
@@ -678,7 +678,6 @@ __osRdb_IP6_Empty = 0x80097f80; // size:0x4
678678
osViModePalLan1 = 0x80097f90; // size:0x50
679679
osViModeMpalLan1 = 0x80097fe0; // size:0x50
680680
osViModeNtscLan1 = 0x80098030; // size:0x50
681-
kdebugserver_data_0000 = 0x80098080; // size:0x4
682681
xprintf_data_0000 = 0x80098090;
683682
xprintf_data_0024 = 0x800980b4;
684683
dispatchTable = 0x800980e0; // size:0xe0

undefined_syms.txt

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ __osBaseTimer = 0x800cee90;
2424
piThreadStack = 0x800CD840;
2525
piRamRomThreadStack = 0x800CE9F0;
2626
gMapStreamMapIDTable = 0x800b972c;
27+
kdebugserver_buffer = 0x800cf110;
2728

2829
__fstAddress = 0xA4970;
2930
__file1Address = 0xA4AA0;

0 commit comments

Comments
 (0)