1/*
2 * Copyright 2019, Adrien Destugues, pulkomandy@pulkomandy.tk.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7#include <debugger.h>
8#include <int.h>
9#include <thread.h>
10#include <arch/user_debugger.h>
11
12
13void
14arch_clear_team_debug_info(struct arch_team_debug_info *info)
15{
16}
17
18
19void
20arch_destroy_team_debug_info(struct arch_team_debug_info *info)
21{
22	arch_clear_team_debug_info(info);
23}
24
25
26void
27arch_clear_thread_debug_info(struct arch_thread_debug_info *info)
28{
29}
30
31
32void
33arch_destroy_thread_debug_info(struct arch_thread_debug_info *info)
34{
35	arch_clear_thread_debug_info(info);
36}
37
38
39void
40arch_update_thread_single_step()
41{
42}
43
44
45void
46arch_set_debug_cpu_state(const debug_cpu_state *cpuState)
47{
48	iframe* frame = thread_get_current_thread()->arch_info.userFrame;
49
50	frame->ra  = cpuState->x[ 0];
51	frame->sp  = cpuState->x[ 1];
52	frame->gp  = cpuState->x[ 2];
53	frame->tp  = cpuState->x[ 3];
54	frame->t0  = cpuState->x[ 4];
55	frame->t1  = cpuState->x[ 5];
56	frame->t2  = cpuState->x[ 6];
57	frame->fp  = cpuState->x[ 7];
58	frame->s1  = cpuState->x[ 8];
59	frame->a0  = cpuState->x[ 9];
60	frame->a1  = cpuState->x[10];
61	frame->a2  = cpuState->x[11];
62	frame->a3  = cpuState->x[12];
63	frame->a4  = cpuState->x[13];
64	frame->a5  = cpuState->x[14];
65	frame->a6  = cpuState->x[15];
66	frame->a7  = cpuState->x[16];
67	frame->s2  = cpuState->x[17];
68	frame->s3  = cpuState->x[18];
69	frame->s4  = cpuState->x[19];
70	frame->s5  = cpuState->x[20];
71	frame->s6  = cpuState->x[21];
72	frame->s7  = cpuState->x[22];
73	frame->s8  = cpuState->x[23];
74	frame->s9  = cpuState->x[24];
75	frame->s10 = cpuState->x[25];
76	frame->s11 = cpuState->x[26];
77	frame->t3  = cpuState->x[27];
78	frame->t4  = cpuState->x[28];
79	frame->t5  = cpuState->x[29];
80	frame->t6  = cpuState->x[30];
81	frame->epc = cpuState->pc;
82	restore_fpu((fpu_context*)&cpuState->f[0]);
83}
84
85
86void
87arch_get_debug_cpu_state(debug_cpu_state *cpuState)
88{
89	arch_get_thread_debug_cpu_state(thread_get_current_thread(), cpuState);
90}
91
92
93status_t
94arch_get_thread_debug_cpu_state(Thread* thread, debug_cpu_state* cpuState)
95{
96	iframe* frame = thread->arch_info.userFrame;
97	if (frame == NULL)
98		return B_BAD_DATA;
99
100	cpuState->x[ 0] = frame->ra;
101	cpuState->x[ 1] = frame->sp;
102	cpuState->x[ 2] = frame->gp;
103	cpuState->x[ 3] = frame->tp;
104	cpuState->x[ 4] = frame->t0;
105	cpuState->x[ 5] = frame->t1;
106	cpuState->x[ 6] = frame->t2;
107	cpuState->x[ 7] = frame->fp;
108	cpuState->x[ 8] = frame->s1;
109	cpuState->x[ 9] = frame->a0;
110	cpuState->x[10] = frame->a1;
111	cpuState->x[11] = frame->a2;
112	cpuState->x[12] = frame->a3;
113	cpuState->x[13] = frame->a4;
114	cpuState->x[14] = frame->a5;
115	cpuState->x[15] = frame->a6;
116	cpuState->x[16] = frame->a7;
117	cpuState->x[17] = frame->s2;
118	cpuState->x[18] = frame->s3;
119	cpuState->x[19] = frame->s4;
120	cpuState->x[20] = frame->s5;
121	cpuState->x[21] = frame->s6;
122	cpuState->x[22] = frame->s7;
123	cpuState->x[23] = frame->s8;
124	cpuState->x[24] = frame->s9;
125	cpuState->x[25] = frame->s10;
126	cpuState->x[26] = frame->s11;
127	cpuState->x[27] = frame->t3;
128	cpuState->x[28] = frame->t4;
129	cpuState->x[29] = frame->t5;
130	cpuState->x[30] = frame->t6;
131	cpuState->pc = frame->epc;
132	// TODO: don't assume that kernel code don't use FPU
133	if (thread == thread_get_current_thread())
134		save_fpu((fpu_context*)&cpuState->f[0]);
135	else
136		memcpy(&cpuState->f[0], &thread->arch_info.fpuContext,
137			sizeof(thread->arch_info.fpuContext));
138
139	return B_OK;
140}
141
142
143status_t
144arch_set_breakpoint(void *address)
145{
146	return B_ERROR;
147}
148
149
150status_t
151arch_clear_breakpoint(void *address)
152{
153	return B_ERROR;
154}
155
156
157status_t
158arch_set_watchpoint(void *address, uint32 type, int32 length)
159{
160	return B_ERROR;
161}
162
163
164status_t
165arch_clear_watchpoint(void *address)
166{
167	return B_ERROR;
168}
169
170bool
171arch_has_breakpoints(struct arch_team_debug_info *info)
172{
173	return false;
174}
175