source: libcfa/src/concurrency/CtxSwitch-arm64.S@ 70f8bcd2

ADT arm-eh ast-experimental enum forall-pointer-decay jacob/cs343-translation new-ast-unique-expr pthread-emulation qualifiedEnum
Last change on this file since 70f8bcd2 was 8ec4a52, checked in by Peter A. Buhr <pabuhr@…>, 5 years ago

harmonize with 32-bit ARM context switch

  • Property mode set to 100644
File size: 2.7 KB
Line 
1//
2// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
3//
4// CtxSwitch-arm64.S --
5//
6// Author : Peter A. Buhr
7// Created On : Sun Aug 16 07:50:13 2020
8// Last Modified By : Peter A. Buhr
9// Last Modified On : Wed Aug 26 16:24:59 2020
10// Update Count : 25
11//
12
13// The context switch routine requires the initial the stack of a thread to
14// look like the thread has saved its context in the normal manner.
15
16// Offsets must synchronized with the __stack_context_t in invoke.h.
17
18#define PTR_BYTE 8
19#define SP_OFFSET ( 0 * PTR_BYTE )
20#define FP_OFFSET ( 1 * PTR_BYTE )
21
22// Context switch between coroutines/tasks.
23// void __cfactx_switch( struct __stack_context_t * from, struct __stack_context_t * to ) ;
24// Arguments "from" in register x0, "to" in register x1.
25
26#define SAVE 20 * 8
27
28 .file "CtxSwitch-arm64.S"
29 .text
30 .align 2
31 .global __cfactx_switch
32 .type __cfactx_switch, %function
33__cfactx_switch:
34
35 sub sp, sp, #SAVE // push stack
36
37 // Save volatile GP registers x19-x30 on the stack.
38
39 stp x19, x20, [sp, #0x00]
40 stp x21, x22, [sp, #0x10]
41 stp x23, x24, [sp, #0x20]
42 stp x25, x26, [sp, #0x30]
43 stp x27, x28, [sp, #0x40]
44 stp x29, x30, [sp, #0x50] // x29 => fp
45
46 // Save volatile SIMD/FPU registers d8-d15 on the stack.
47
48 stp d8, d9, [sp, #0x60]
49 stp d10, d11, [sp, #0x70]
50 stp d12, d13, [sp, #0x80]
51 stp d14, d15, [sp, #0x90]
52
53 // Save old context in the "from" area.
54
55 mov x4, sp // cannot store sp directly
56 str x4, [x0, #SP_OFFSET]
57 str fp, [x0, #FP_OFFSET]
58
59 // Load new context from the "to" area.
60
61 ldr fp, [x1, #FP_OFFSET]
62 ldr x4, [x1, #SP_OFFSET]
63 mov sp, x4 // cannot store sp directly
64
65 // Load volatile GP registers x19-x30 from the stack.
66
67 ldp x19, x20, [sp, #0x00]
68 ldp x21, x22, [sp, #0x10]
69 ldp x23, x24, [sp, #0x20]
70 ldp x25, x26, [sp, #0x30]
71 ldp x27, x28, [sp, #0x40]
72 ldp x29, x30, [sp, #0x50]
73
74 // Load volatile SIMD/FPU registers d8-d15 from the stack.
75
76 ldp d8, d9, [sp, #0x60]
77 ldp d10, d11, [sp, #0x70]
78 ldp d12, d13, [sp, #0x80]
79 ldp d14, d15, [sp, #0x90]
80
81 add sp, sp, #SAVE // pop stack
82 ret // return to new thread (mov pc, x30)
83
84 .size __cfactx_switch, .-__cfactx_switch
85 .section .note.GNU-stack,"",%progbits // mark no executable stack needed
86
87// Stub to create new stacks which can be context switched to
88// void __cfactx_invoke_stub( void );
89
90 .text
91 .align 2
92 .global __cfactx_invoke_stub
93 .type __cfactx_invoke_stub, %function
94__cfactx_invoke_stub:
95 mov x0, x19 // load main as parameter 0
96 mov x1, x20 // load this as parameter 1
97 mov x30, x21 // load coroutine invoke routine
98 ret // and jmp to it (mov pc, x30)
99 .size __cfactx_invoke_stub, .-__cfactx_invoke_stub
100
101// Local Variables: //
102// mode: c //
103// tab-width: 4 //
104// End: //
Note: See TracBrowser for help on using the repository browser.