move the generic arm kernel & exec to arm-native
[AROS.git] / arch / arm-native / kernel / syscall.c
blob58fc4ec657474c25f73b474ba2a18100f6b5cb21
1 /*
2 Copyright © 2013, The AROS Development Team. All rights reserved.
3 $Id$
4 */
6 #include <inttypes.h>
7 #include <aros/kernel.h>
8 #include <aros/libcall.h>
10 #include <aros/arm/cpucontext.h>
12 #include <stddef.h>
13 #include <string.h>
15 #include <proto/exec.h>
16 #include <proto/kernel.h>
18 #include "kernel_cpu.h"
19 #include "kernel_intern.h"
20 #include "kernel_scheduler.h"
21 #include "kernel_intr.h"
22 #include "kernel_syscall.h"
24 extern char * __text_start;
25 extern char * __text_end;
27 #ifndef _CUSTOM
28 #define _CUSTOM NULL
29 #endif
31 #define DREGS(x)
32 #define D(x)
35 __vectorhand_swi:
37 this code currently assumes the caller is in user mode (and will break from any other mode)
39 r0 = passed to c handler, r1/r2 = temp
41 asm (
42 ".globl __vectorhand_swi \n"
43 ".type __vectorhand_swi,%function \n"
44 "__vectorhand_swi: \n"
45 VECTCOMMON_START
46 " add r1, r0, #13*4 \n" // store sp^ in ctx_sp
47 " stm r1, {sp}^ \n"
48 " add r1, r0, #14*4 \n" // store lr^ in ctx_lr
49 " stm r1, {lr}^ \n"
50 " mov fp, #0 \n" // clear fp(??)
52 " bl handle_syscall \n"
53 VECTCOMMON_END
56 void handle_syscall(void *regs)
58 register unsigned int addr;
59 register unsigned int swi_no;
61 /* We determine the SWI number by reading in "tasks"
62 program counter, subtract the instruction from it and
63 obtain the value from there. we also use this to check if
64 we have been called from outwith the kernel's code (illegal!)
67 addr = ((uint32_t *)regs)[15];
68 addr -= 4;
69 swi_no = *((unsigned int *)addr) & 0x00ffffff;
71 D(bug("[KRN] ## SWI %d @ 0x%p\n", swi_no, addr));
73 if (((char*)addr < &__text_start) || ((char*)addr >= &__text_end))
75 D(bug("[KRN] ## SWI : ILLEGAL ACCESS!\n"));
76 return;
78 if (swi_no <= 0x0a || swi_no == 0x100)
80 DREGS(cpu_DumpRegs(regs));
82 switch (swi_no)
84 case SC_CLI:
86 D(bug("[KRN] ## CLI...\n"));
87 ((uint32_t *)regs)[16] |= 0x80;
88 break;
91 case SC_STI:
93 D(bug("[KRN] ## STI...\n"));
94 ((uint32_t *)regs)[16] &= ~0x80;
95 break;
98 case SC_SUPERSTATE:
100 D(bug("[KRN] ## SUPERSTATE... (0x%p ->", ((uint32_t *)regs)[16]));
101 ((uint32_t *)regs)[16] &= ~CPUMODE_MASK;
102 ((uint32_t *)regs)[16] |= (0x80 | CPUMODE_SUPERVISOR);
103 D(bug(" 0x%p)\n", ((uint32_t *)regs)[16]));
104 break;
107 case SC_ISSUPERSTATE:
109 D(bug("[KRN] ## ISSUPERSTATE... "));
110 ((uint32_t *)regs)[0] = !(((((uint32_t *)regs)[16] & CPUMODE_MASK) == CPUMODE_USER) || ((((uint32_t *)regs)[16] & CPUMODE_MASK) == CPUMODE_SYSTEM));
111 D(bug("%d\n", ((uint32_t *)regs)[0]));
112 break;
115 case SC_REBOOT:
117 D(bug("[KRN] ## REBOOT...\n"));
118 asm volatile ("mov pc, #0\n"); // Jump to the reset vector..
119 break;
121 default:
122 core_SysCall(swi_no, regs);
123 break;
126 else
128 D(bug("[KRN] ## SWI : ILLEGAL SWI!\n"));
129 return;
132 D(bug("[KRN] ## SWI returning ..\n"));