]> git.lizzy.rs Git - plan9front.git/blob - sys/src/9/omap4/arch.c
no need to disable fpu in execregs, this is done in procsetup() already
[plan9front.git] / sys / src / 9 / omap4 / arch.c
1 #include "u.h"
2 #include "ureg.h"
3 #include "../port/lib.h"
4 #include "../port/error.h"
5 #include "mem.h"
6 #include "dat.h"
7 #include "fns.h"
8 #include "io.h"
9 #include "arm.h"
10 #include "tos.h"
11
12 void (*proctrace)(Proc *, int, vlong);
13
14 ulong
15 userpc(void)
16 {
17         return dbgpc(up);
18 }
19
20 ulong
21 dbgpc(Proc *p)
22 {
23         Ureg *ureg;
24         
25         ureg = p->dbgreg;
26         if(ureg == 0)
27                 return 0;
28         return ureg->pc;
29 }
30
31 void
32 setkernur(Ureg *ureg, Proc *p)
33 {
34         ureg->pc = p->sched.pc;
35         ureg->sp = p->sched.sp+4;
36         ureg->r14 = (ulong) sched;
37 }
38
39 void
40 setregisters(Ureg *, char *, char *, int)
41 {
42 }
43
44 void
45 procsave(Proc *p)
46 {
47         uvlong t;
48         
49         cycles(&t);
50         p->pcycles += t;
51 }
52
53 void
54 procrestore(Proc *p)
55 {
56         uvlong t;
57
58         cycles(&t);
59         p->pcycles -= t;
60 }
61
62 void
63 procfork(Proc *)
64 {
65 }
66
67 void
68 procsetup(Proc *p)
69 {
70         p->fpstate = FPinit;
71 }
72
73 static void
74 linkproc(void)
75 {
76         spllo();
77         up->kpfun(up->kparg);
78         pexit("kproc exiting", 0);
79 }
80
81 void
82 kprocchild(Proc *p, void (*func)(void *), void *arg)
83 {
84         p->sched.pc = (ulong) linkproc;
85         p->sched.sp = (ulong) p->kstack + KSTACK;
86         p->kpfun = func;
87         p->kparg = arg;
88 }
89
90 void
91 forkchild(Proc *p, Ureg *ureg)
92 {
93         Ureg *cureg;
94         
95         p->sched.sp = (ulong) p->kstack + KSTACK - (sizeof(Ureg) + 8);
96         p->sched.pc = (ulong) forkret;
97         cureg = (Ureg*) (p->sched.sp + 8);
98         memmove(cureg, ureg, sizeof(Ureg));
99         cureg->r0 = 0;
100         p->psstate = 0;
101         p->insyscall = 0;
102 }
103
104 long
105 execregs(ulong entry, ulong ssize, ulong nargs)
106 {
107         ulong *sp;
108         Ureg *ureg;
109         
110         sp = (ulong *) (USTKTOP - ssize);
111         *--sp = nargs;
112         
113         ureg = up->dbgreg;
114         memset(ureg, 0, sizeof *ureg);
115         ureg->psr = PsrMusr;
116         ureg->sp = (ulong) sp;
117         ureg->pc = entry;
118         return USTKTOP - sizeof(Tos);
119 }
120
121 void
122 evenaddr(uintptr addr)
123 {
124         if(addr & 3){
125                 postnote(up, 1, "sys: odd address", NDebug);
126                 error(Ebadarg);
127         }
128 }
129
130 void
131 _dumpstack(ulong sp, ulong pc)
132 {
133         int x;
134         uintptr l, v, i, estack;
135
136         x = 0;
137         x += iprint("ktrace /arm/s9panda %#.8lux %#.8lux <<EOF\n",
138                 pc, sp);
139         i = 0;
140         if(up
141         && (uintptr)&l >= (uintptr)up->kstack
142         && (uintptr)&l <= (uintptr)up->kstack+KSTACK)
143                 estack = (uintptr)up->kstack+KSTACK;
144         else if((uintptr)&l >= (uintptr)(KTZERO - BY2PG)
145         && (uintptr)&l <= (uintptr)KTZERO)
146                 estack = (uintptr)KTZERO;
147         else
148                 return;
149         x += iprint("estackx %p\n", estack);
150
151         for(l = (uintptr)&l; l < estack; l += sizeof(uintptr)){
152                 v = *(uintptr*)l;
153                 if((KTZERO < v && v < (uintptr)etext) || estack-l < 32){
154                         x += iprint("%.8p=%.8p ", l, v);
155                         i++;
156                 }
157                 if(i == 4){
158                         i = 0;
159                         x += iprint("\n");
160                 }
161         }
162         if(i)
163                 iprint("\n");
164         iprint("EOF\n");
165 }
166
167 void
168 printureg(Ureg *ureg)
169 {
170         print("R0  %.8ulx R1  %.8ulx R2  %.8ulx R3  %.8ulx\n", ureg->r0, ureg->r1, ureg->r2, ureg->r3);
171         print("R4  %.8ulx R5  %.8ulx R6  %.8ulx R7  %.8ulx\n", ureg->r4, ureg->r5, ureg->r6, ureg->r7);
172         print("R8  %.8ulx R9  %.8ulx R10 %.8ulx R11 %.8ulx\n", ureg->r8, ureg->r9, ureg->r10, ureg->r11);
173         print("R12 %.8ulx R13 %.8ulx R14 %.8ulx R15 %.8ulx\n", ureg->r12, ureg->r13, ureg->r14, ureg->pc);
174         print("PSR %.8ulx exception %ld\n", ureg->psr, ureg->type);
175 }