]> git.lizzy.rs Git - plan9front.git/blob - sys/src/9/omap4/arch.c
added omap4 kernel prototype
[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 procsave(Proc *)
33 {
34 }
35
36 void
37 procrestore(Proc *)
38 {
39 }
40
41 void
42 procfork(Proc *)
43 {
44 }
45
46 void
47 procsetup(Proc *p)
48 {
49         p->fpstate = FPinit;
50 }
51
52 static void
53 linkproc(void)
54 {
55         spllo();
56         up->kpfun(up->kparg);
57         pexit("kproc exiting", 0);
58 }
59
60 void
61 kprocchild(Proc *p, void (*func)(void *), void *arg)
62 {
63         p->sched.pc = (ulong) linkproc;
64         p->sched.sp = (ulong) p->kstack + KSTACK;
65         p->kpfun = func;
66         p->kparg = arg;
67 }
68
69 void
70 forkchild(Proc *p, Ureg *ureg)
71 {
72         Ureg *cureg;
73         
74         p->sched.sp = (ulong) p->kstack + KSTACK - (sizeof(Ureg) + 8);
75         p->sched.pc = (ulong) forkret;
76         cureg = (Ureg*) (p->sched.sp + 8);
77         memmove(cureg, ureg, sizeof(Ureg));
78         cureg->r0 = 0;
79         p->psstate = 0;
80         p->insyscall = 0;
81 }
82
83 long
84 execregs(ulong entry, ulong ssize, ulong nargs)
85 {
86         ulong *sp;
87         Ureg *ureg;
88         
89         up->fpstate = FPinit;
90         sp = (ulong *) (USTKTOP - ssize);
91         *--sp = nargs;
92         
93         ureg = up->dbgreg;
94         memset(ureg, 0, sizeof *ureg);
95         ureg->psr = PsrMusr;
96         ureg->sp = (ulong) sp;
97         ureg->pc = entry;
98         return USTKTOP - sizeof(Tos);
99 }
100
101 void
102 evenaddr(uintptr addr)
103 {
104         if(addr & 3){
105                 postnote(up, 1, "sys: odd address", NDebug);
106                 error(Ebadarg);
107         }
108 }
109
110 Segment *
111 data2txt(Segment *)
112 {
113         panic("data2txt");
114 }
115
116 void
117 _dumpstack(ulong sp, ulong pc)
118 {
119         int x;
120         uintptr l, v, i, estack;
121
122         x = 0;
123         x += iprint("ktrace /arm/s9panda %#.8lux %#.8lux <<EOF\n",
124                 pc, sp);
125         i = 0;
126         if(up
127         && (uintptr)&l >= (uintptr)up->kstack
128         && (uintptr)&l <= (uintptr)up->kstack+KSTACK)
129                 estack = (uintptr)up->kstack+KSTACK;
130         else if((uintptr)&l >= (uintptr)(KTZERO - BY2PG)
131         && (uintptr)&l <= (uintptr)KTZERO)
132                 estack = (uintptr)KTZERO;
133         else
134                 return;
135         x += iprint("estackx %p\n", estack);
136
137         for(l = (uintptr)&l; l < estack; l += sizeof(uintptr)){
138                 v = *(uintptr*)l;
139                 if((KTZERO < v && v < (uintptr)etext) || estack-l < 32){
140                         x += iprint("%.8p=%.8p ", l, v);
141                         i++;
142                 }
143                 if(i == 4){
144                         i = 0;
145                         x += iprint("\n");
146                 }
147         }
148         if(i)
149                 iprint("\n");
150         iprint("EOF\n");
151 }
152
153 void
154 printureg(Ureg *ureg)
155 {
156         print("R0  %.8ulx R1  %.8ulx R2  %.8ulx R3  %.8ulx\n", ureg->r0, ureg->r1, ureg->r2, ureg->r3);
157         print("R4  %.8ulx R5  %.8ulx R6  %.8ulx R7  %.8ulx\n", ureg->r4, ureg->r5, ureg->r6, ureg->r7);
158         print("R8  %.8ulx R9  %.8ulx R10 %.8ulx R11 %.8ulx\n", ureg->r8, ureg->r9, ureg->r10, ureg->r11);
159         print("R12 %.8ulx R13 %.8ulx R14 %.8ulx R15 %.8ulx\n", ureg->r12, ureg->r13, ureg->r14, ureg->pc);
160         print("PSR %.8ulx exception %ld\n", ureg->psr, ureg->type);
161 }