Kernel/vfs - Return matched flags from VFS_SelectNode
[tpg/acess2.git] / KernelLand / Kernel / arch / armv7 / proc.S
1 /*
2  * Acess2 ARM
3  * - By John Hodge (thePowersGang)
4  *
5  * arch/arm7/proc.S
6  * - Process management assembly
7  */
8
9 #include "include/assembly.h"
10
11 .globl KernelThreadHeader
12 @ SP+12: Argument 1
13 @ SP+8: Argument Count
14 @ SP+4: Function
15 @ SP+0: Thread Pointer
16 KernelThreadHeader:
17         ldr r0, [sp],#4
18         @ TODO: Do something with the thread pointer
19         
20         ldr r4, [sp],#4 @ Function
21         @ Get argument
22         ldr r0, [sp],#4
23
24         blx r4
25         
26         ldr r0, =0
27         bl Threads_Exit
28         b .
29
30 .globl SwitchTask
31 @ R0: New stack
32 @ R1: Pointer to where to save old stack
33 @ R2: New IP
34 @ R3: Pointer to save old IP
35 @ SP+0: New address space
36 SwitchTask:
37         push {r4-r12,lr}
38
39         @ Save IP       
40         ldr r4, =.return
41         str r4, [r3]
42         @ Save SP
43         str sp, [r1]
44
45         @ Only update TTBR0 if the task has an explicit address space
46         ldr r1, [sp,#4*10]
47         tst r1, r1
48         mcrne p15, 0, r1, c2, c0, 0     @ Set TTBR0 to r0
49 #       mov r1, #1
50         mcrne p15, 0, r1, c8, c7, 0     @ TLBIALL - Invalid user space
51
52         @ Restore state
53         mov sp, r0
54         bx r2
55
56 .return:
57         pop {r4-r12,pc}
58
59 .extern MM_Clone
60 .extern MM_DumpTables
61 .globl Proc_CloneInt
62 Proc_CloneInt:
63         @ R0: SP Destination
64         @ R1: Mem Destination
65         @ R2: Clear user space
66         push {r4-r12,lr}
67         mov r4, r1      @ Save mem destination
68         str sp, [r0]    @ Save SP to SP dest
69
70         mov r0, r2
71         bl MM_Clone
72         str r0, [r4]    @ Save clone return to Mem Dest
73
74         ldr r0, =Proc_CloneInt_new
75         pop {r4-r12,pc}
76 Proc_CloneInt_new:
77         mov r0, #0
78         pop {r4-r12,pc}
79
80 @ R0: New user SP
81 @ Return: Old user SP
82 .globl Proc_int_SwapUserSP
83 Proc_int_SwapUserSP:
84         cps #31 @ Go to system mode
85         mov r1, sp
86         tst r0, r0      @ Only update if non-zero
87         movne sp, r0
88         mov r0, r1
89         cps #19
90         mov pc, lr
91
92 .section .usertext, "ax"
93 .globl Proc_int_DropToUser
94 @ R0: User IP
95 @ R1: User SP
96 Proc_int_DropToUser:
97         cps #16
98         mov sp, r1
99         mov pc, r0
100 .globl User_Signal_Kill
101 @ R0: Signal
102 User_Signal_Kill:
103         mov r1, r0
104         and r1, #0x00FF
105         orr r1, #0x0200
106         mov r0, #0
107         swi 0
108         b .
109
110 .section .rodata
111 csProc_CloneInt_NewTaskMessage:
112         .asciz "New task PC=%p, R4=%p, sp=%p"
113 csProc_CloneInt_OldTaskMessage:
114         .asciz "Parent task PC=%p, R4=%p, SP=%p"
115
116 @ vim: ft=armv7

UCC git Repository :: git.ucc.asn.au