1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
|
#ifndef _RMONINT_H
#define _RMONINT_H
#include "dbgproto.h"
#include "PR/os_internal.h"
/* mips */
#define MIPS_LWC2_OPCODE 50
#define MIPS_SWC2_OPCODE 58
#define MIPS_LW_OPCODE 35
#define MIPS_SW_OPCODE 43
#define MIPS_BREAK_OPCODE 0xD
#define MIPS_BREAK_MASK 0xFC00003F
#define MIPS_BREAK(code) \
((((code) & 0xFFFFF) << 6) | MIPS_BREAK_OPCODE)
/* R4300 General Purpose Register Indices */
#define GREG_IDX_ZERO 0
#define GREG_IDX_AT 1
#define GREG_IDX_T9 25
#define GREG_IDX_K0 26
#define GREG_IDX_GP 28
#define GREG_IDX_RA 31
#define GREG_IDX_LO 32
#define GREG_IDX_HI 33
#define GREG_IDX_CAUSE 34
#define GREG_IDX_PC 35
#define GREG_IDX_SR 36
/* RSP Scalar Register Indices */
#define SREG_IDX_ZERO 0
#define SREG_IDX_RA 31
#define SREG_IDX_DRAM_ADDR (32 + 0)
#define SREG_IDX_MEM_ADDR (32 + 1)
#define SREG_IDX_RD_LEN (32 + 2)
#define SREG_IDX_PC (32 + 3)
#define SREG_IDX_WR_LEN (32 + 4)
#define SREG_IDX_STATUS (32 + 5)
#define SREG_IDX_DMA_FULL (32 + 6)
#define SREG_IDX_DMA_BUSY (32 + 7)
/* RSP Vector Register Properties */
#define VREG_NUM 32
#define VREG_SIZE 0x10
/* rmon */
#define RMON_MESG_CPU_BREAK 2
#define RMON_MESG_SP_BREAK 4
#define RMON_MESG_FAULT 8
#define RMON_CPU 0
#define RMON_RSP 1
/* "thread id" for rsp */
#define RMON_TID_RSP 1000
/* "thread priority" for rsp */
#define RMON_PRI_RSP 42
/* "thread id" for no thread running */
#define RMON_TID_NOTHREAD 1003
#define RMON_PID_CPU 1002
#define RMON_PID_RSP 1001
/* Largest serviceable read/write memory request */
#define RMON_MAX_XFER_SIZE 1024
/* rmonmain */
void __rmonSendHeader(KKHeader* const block, u32 blockSize, u32 type);
void __rmonSendReply(KKHeader* const block, u32 blockSize, u32 replyType);
void __rmonSendData(char* const block, unsigned int blockSize);
extern int __rmonActive;
/* rmonmisc */
void __rmonInit(void);
void __rmonPanic(void);
extern OSMesgQueue __rmonMQ;
/* rmonmem */
void __rmonWriteWordTo(u32* addr, u32 val);
u32 __rmonReadWordAt(u32* addr);
void __rmonMemcpy(u8* dest, u8* srce, u32 count);
void __rmonCopyWords(u32* dest, u32* srce, u32 count);
extern u8 __rmonUtilityBuffer[];
/* rmonsio */
void __rmonSendFault(OSThread* thread);
void __rmonIOflush(void);
void __rmonIOputw(u32 word);
void __rmonIOhandler(void);
extern void* __osRdb_DbgRead_Buf;
extern u8 rmonRdbReadBuf[];
/* rmonrcp */
int __rmonRCPrunning(void);
void __rmonIdleRCP(void);
void __rmonStepRCP(void);
void __rmonRunRCP(void);
/* rmonbrk */
u32 __rmonGetBranchTarget(int method, int thread, char* addr);
int __rmonSetSingleStep(int thread, u32* instptr);
void __rmonGetExceptionStatus(KKStatusEvent* reply);
void __rmonHitBreak(void);
void __rmonHitSpBreak(void);
void __rmonHitCpuFault(void);
extern u8 __rmonRcpAtBreak;
/* rmonregs */
u32 __rmonGetRegisterContents(int method, int threadNumber, int regNumber);
/* rmontask */
void __rmonMaskIdleThreadInts(void);
OSThread* __rmonGetTCB(int threadNumber);
int __rmonStopUserThreads(int whichThread);
int __rmonGetThreadStatus(int method, int id, KKStatusEvent* reply);
/* rmoncmds */
int __rmonExecute(KKHeader* request);
/* commands */
typedef int (*FUNPTR)();
int __rmonLoadProgram(KKHeader* req);
int __rmonListProcesses(KKHeader* req);
int __rmonGetExeName(KKHeader* req);
int __rmonListThreads(KKHeader* req);
int __rmonThreadStatus(KKHeader* req);
int __rmonStopThread(KKHeader* req);
int __rmonRunThread(KKHeader* req);
int __rmonSetFault(KKHeader* req);
int __rmonGetRegionCount(KKHeader* req);
int __rmonGetRegions(KKHeader* req);
int __rmonGetGRegisters(KKHeader* req);
int __rmonSetGRegisters(KKHeader* req);
int __rmonGetFRegisters(KKHeader* req);
int __rmonSetFRegisters(KKHeader* req);
int __rmonReadMem(KKHeader* req);
int __rmonWriteMem(KKHeader* req);
int __rmonSetBreak(KKHeader* req);
int __rmonClearBreak(KKHeader* req);
int __rmonListBreak(KKHeader* req);
int __rmonSetComm(KKHeader* req);
int __rmonGetSRegs(KKHeader* req);
int __rmonSetSRegs(KKHeader* req);
int __rmonGetVRegs(KKHeader* req);
int __rmonSetVRegs(KKHeader* req);
#endif
|