Mercurial > sarpn
annotate arch/svc.c @ 26:cabcdc3727e3 default tip
arch: implemented swapcontext & fixed few minor issues
author | Josef 'Jeff' Sipek <jeffpc@josefsipek.net> |
---|---|
date | Thu, 12 May 2011 15:56:46 -0400 |
parents | e7b9148156c4 |
children |
rev | line source |
---|---|
21
ca308c8ca41e
beginning of svc support code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
1 #include <psw.h> |
ca308c8ca41e
beginning of svc support code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
2 #include <die.h> |
ca308c8ca41e
beginning of svc support code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
3 |
ca308c8ca41e
beginning of svc support code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
4 #include "svcint.h" |
ca308c8ca41e
beginning of svc support code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
5 |
ca308c8ca41e
beginning of svc support code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
6 void setcontext(struct psw *psw, u64 *regs) |
ca308c8ca41e
beginning of svc support code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
7 { |
ca308c8ca41e
beginning of svc support code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
8 __builtin_memcpy(PSA_PSW_TMP, psw, sizeof(struct psw)); |
ca308c8ca41e
beginning of svc support code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
9 |
ca308c8ca41e
beginning of svc support code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
10 asm volatile( |
ca308c8ca41e
beginning of svc support code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
11 "lmg %%r0,%%r15,%0\n" /* load gpr */ |
ca308c8ca41e
beginning of svc support code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
12 "lpswe %1\n" /* load new psw */ |
ca308c8ca41e
beginning of svc support code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
13 : /* output */ |
ca308c8ca41e
beginning of svc support code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
14 : /* input */ |
ca308c8ca41e
beginning of svc support code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
15 "m" (*regs), |
ca308c8ca41e
beginning of svc support code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
16 "m" (*PSA_PSW_TMP) |
ca308c8ca41e
beginning of svc support code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
17 ); |
ca308c8ca41e
beginning of svc support code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
18 |
ca308c8ca41e
beginning of svc support code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
19 /* unreachable */ |
ca308c8ca41e
beginning of svc support code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
20 die(); |
ca308c8ca41e
beginning of svc support code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
21 } |
ca308c8ca41e
beginning of svc support code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
22 |
26
cabcdc3727e3
arch: implemented swapcontext & fixed few minor issues
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
23
diff
changeset
|
23 void swapcontext(struct psw *oldpsw, u64 *oldregs, |
cabcdc3727e3
arch: implemented swapcontext & fixed few minor issues
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
23
diff
changeset
|
24 struct psw *newpsw, u64 *newregs) |
cabcdc3727e3
arch: implemented swapcontext & fixed few minor issues
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
23
diff
changeset
|
25 { |
cabcdc3727e3
arch: implemented swapcontext & fixed few minor issues
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
23
diff
changeset
|
26 __builtin_memcpy(PSA_PSW_TMP, newpsw, sizeof(struct psw)); |
cabcdc3727e3
arch: implemented swapcontext & fixed few minor issues
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
23
diff
changeset
|
27 |
cabcdc3727e3
arch: implemented swapcontext & fixed few minor issues
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
23
diff
changeset
|
28 __builtin_memset(oldpsw, 0, sizeof(struct psw)); |
cabcdc3727e3
arch: implemented swapcontext & fixed few minor issues
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
23
diff
changeset
|
29 oldpsw->ea = 1; |
cabcdc3727e3
arch: implemented swapcontext & fixed few minor issues
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
23
diff
changeset
|
30 oldpsw->ba = 1; |
cabcdc3727e3
arch: implemented swapcontext & fixed few minor issues
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
23
diff
changeset
|
31 |
cabcdc3727e3
arch: implemented swapcontext & fixed few minor issues
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
23
diff
changeset
|
32 asm volatile( |
cabcdc3727e3
arch: implemented swapcontext & fixed few minor issues
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
23
diff
changeset
|
33 "stmg %%r0,%%r15,%0\n" /* store gpr */ |
cabcdc3727e3
arch: implemented swapcontext & fixed few minor issues
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
23
diff
changeset
|
34 "larl %%r1,0f\n" |
cabcdc3727e3
arch: implemented swapcontext & fixed few minor issues
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
23
diff
changeset
|
35 "stg %%r1,%1\n" /* store the IA */ |
cabcdc3727e3
arch: implemented swapcontext & fixed few minor issues
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
23
diff
changeset
|
36 |
cabcdc3727e3
arch: implemented swapcontext & fixed few minor issues
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
23
diff
changeset
|
37 "lmg %%r0,%%r15,%2\n" /* load gpr */ |
cabcdc3727e3
arch: implemented swapcontext & fixed few minor issues
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
23
diff
changeset
|
38 "lpswe %3\n" /* load new psw */ |
cabcdc3727e3
arch: implemented swapcontext & fixed few minor issues
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
23
diff
changeset
|
39 |
cabcdc3727e3
arch: implemented swapcontext & fixed few minor issues
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
23
diff
changeset
|
40 "0:\n" |
cabcdc3727e3
arch: implemented swapcontext & fixed few minor issues
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
23
diff
changeset
|
41 : /* output */ |
cabcdc3727e3
arch: implemented swapcontext & fixed few minor issues
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
23
diff
changeset
|
42 "=m" (*oldregs), |
cabcdc3727e3
arch: implemented swapcontext & fixed few minor issues
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
23
diff
changeset
|
43 "=m" (oldpsw->ptr) |
cabcdc3727e3
arch: implemented swapcontext & fixed few minor issues
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
23
diff
changeset
|
44 : /* input */ |
cabcdc3727e3
arch: implemented swapcontext & fixed few minor issues
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
23
diff
changeset
|
45 "m" (*newregs), |
cabcdc3727e3
arch: implemented swapcontext & fixed few minor issues
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
23
diff
changeset
|
46 "m" (*PSA_PSW_TMP) |
cabcdc3727e3
arch: implemented swapcontext & fixed few minor issues
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
23
diff
changeset
|
47 ); |
cabcdc3727e3
arch: implemented swapcontext & fixed few minor issues
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
23
diff
changeset
|
48 } |
cabcdc3727e3
arch: implemented swapcontext & fixed few minor issues
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
23
diff
changeset
|
49 |
23
e7b9148156c4
arch: hopefully the rest of the SVC related code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
50 void savecontext(struct psw *psw, u64 *regs) |
e7b9148156c4
arch: hopefully the rest of the SVC related code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
51 { |
e7b9148156c4
arch: hopefully the rest of the SVC related code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
52 __builtin_memcpy(psw, PSA_OLD_SVC_PSW, sizeof(struct psw)); |
e7b9148156c4
arch: hopefully the rest of the SVC related code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
53 __builtin_memcpy(regs, PSA_GPRS, 16*sizeof(u64)); |
e7b9148156c4
arch: hopefully the rest of the SVC related code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
54 } |
e7b9148156c4
arch: hopefully the rest of the SVC related code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
55 |
e7b9148156c4
arch: hopefully the rest of the SVC related code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
56 extern void *SVCINT; |
21
ca308c8ca41e
beginning of svc support code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
57 u64 _SVC_HANDLER; |
ca308c8ca41e
beginning of svc support code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
58 u64 _SVC_STACK; |
ca308c8ca41e
beginning of svc support code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
59 |
26
cabcdc3727e3
arch: implemented swapcontext & fixed few minor issues
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
23
diff
changeset
|
60 void set_svc_handler(u64(*f)(u64, u64, u64, u64, u64), void *stack) |
21
ca308c8ca41e
beginning of svc support code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
61 { |
23
e7b9148156c4
arch: hopefully the rest of the SVC related code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
62 struct psw psw; |
e7b9148156c4
arch: hopefully the rest of the SVC related code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
63 |
21
ca308c8ca41e
beginning of svc support code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
64 if (((u64)stack) & 7) |
ca308c8ca41e
beginning of svc support code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
65 die(); |
ca308c8ca41e
beginning of svc support code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
66 |
ca308c8ca41e
beginning of svc support code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
67 _SVC_HANDLER = (u64) f; |
ca308c8ca41e
beginning of svc support code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
68 _SVC_STACK = (u64) stack; |
23
e7b9148156c4
arch: hopefully the rest of the SVC related code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
69 |
e7b9148156c4
arch: hopefully the rest of the SVC related code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
70 __builtin_memset(&psw, 0, sizeof(struct psw)); |
e7b9148156c4
arch: hopefully the rest of the SVC related code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
71 psw.ea = 1; |
e7b9148156c4
arch: hopefully the rest of the SVC related code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
72 psw.ba = 1; |
e7b9148156c4
arch: hopefully the rest of the SVC related code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
73 psw.ptr = (u64) &SVCINT; |
e7b9148156c4
arch: hopefully the rest of the SVC related code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
74 __builtin_memcpy(PSA_NEW_SVC_PSW, &psw, sizeof(struct psw)); |
21
ca308c8ca41e
beginning of svc support code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
75 } |