|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [PATCH v3 22/43] arm64: implement the __arch_switch_threads
The __arch_switch_threads is used for switching the threads.
This patch implements it.
Signed-off-by: Huang Shijie <shijie.huang@xxxxxxx>
---
arch/arm/arm64/arm64.S | 38 ++++++++++++++++++++++++++++++++++++++
include/arm/arm64/os.h | 4 ++++
2 files changed, 42 insertions(+)
diff --git a/arch/arm/arm64/arm64.S b/arch/arm/arm64/arm64.S
index fa3406f..5f55f99 100644
--- a/arch/arm/arm64/arm64.S
+++ b/arch/arm/arm64/arm64.S
@@ -1,5 +1,6 @@
#include "asm.h"
#include <arch_limits.h>
+#include <arm64/os.h>
#include <arm64/pagetable.h>
#include <arm64/traps.h>
#include <xen/xen.h>
@@ -434,3 +435,40 @@ ENTRY(vector_table)
vector_entry el0_fiq_invalid /* FIQ 32-bit EL0 */
vector_entry el0_error_invalid /* Error 32-bit EL0 */
END(vector_table)
+
+/*
+ * => x0 = &prev->sp
+ * x1 = &next->sp
+ * <= switch to the next thread
+ */
+ENTRY(__arch_switch_threads)
+ /* Store the callee-saved registers to prev's struct thread */
+ mov x2, sp
+
+ sub x2, x2, #(CALLEE_SAVED_REGISTERS * 8)
+ stp x19, x20, [x2, #16 * 0]
+ stp x21, x22, [x2, #16 * 1]
+ stp x23, x24, [x2, #16 * 2]
+ stp x25, x26, [x2, #16 * 3]
+ stp x27, x28, [x2, #16 * 4]
+ str x29, [x2, #16 * 5]
+
+ /* Store current sp/ip to prev's struct thread */
+ stp x2, x30, [x0]
+
+ /* Load the sp/ip from next's struct thread */
+ ldp x2, x30, [x1]
+
+ /* Restore the callee-saved registers */
+ ldp x19, x20, [x2, #16 * 0]
+ ldp x21, x22, [x2, #16 * 1]
+ ldp x23, x24, [x2, #16 * 2]
+ ldp x25, x26, [x2, #16 * 3]
+ ldp x27, x28, [x2, #16 * 4]
+ ldr x29, [x2, #16 * 5]
+
+ add x2, x2, #(CALLEE_SAVED_REGISTERS * 8)
+ mov sp, x2
+
+ br x30
+ENDPROC(__arch_switch_threads)
diff --git a/include/arm/arm64/os.h b/include/arm/arm64/os.h
index 89b4002..2d55023 100644
--- a/include/arm/arm64/os.h
+++ b/include/arm/arm64/os.h
@@ -1,6 +1,8 @@
#ifndef _ARM64_OS_H_
#define _ARM64_OS_H_
+#ifndef __ASSEMBLY__
+
#define BUG() __asm__ __volatile("wfi" ::: "memory")
static inline void local_irq_disable(void)
@@ -25,6 +27,8 @@ static inline void local_irq_enable(void)
__asm__ __volatile__("mrs %0, daif":"=r"(x)::"memory"); \
}
+#endif
+
/* The Callee-saved registers : x19 ~ x29 */
#define CALLEE_SAVED_REGISTERS 11
--
2.7.4
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |