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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }