|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [PATCH 20/40] arm64: implement the __arch_switch_threads
The __arch_switch_threads is used for switching the threads.
This patch implements it, and defines the stack layout.
Change-Id: I195df8a34ad4738c3e3e925e6d7ed1c46eece0c8
Jira: ENTOS-247
Signed-off-by: Huang Shijie <shijie.huang@xxxxxxx>
---
arch/arm/arm64/arm64.S | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++
include/arm/arm64/os.h | 3 +++
2 files changed, 62 insertions(+)
diff --git a/arch/arm/arm64/arm64.S b/arch/arm/arm64/arm64.S
index e16ef95..6dab875 100644
--- a/arch/arm/arm64/arm64.S
+++ b/arch/arm/arm64/arm64.S
@@ -1,6 +1,7 @@
#include "asm.h"
#include <arm64/pagetable.h>
#include <xen/xen.h>
+#include <arm64/os.h>
/* This macro will use the x0/x1/x2/x16 */
#define PRINT(_s) \
@@ -461,3 +462,61 @@ el_invalid(el1_fiq, BAD_FIQ, 1);
el_invalid(el0_fiq, BAD_FIQ, 0);
el_invalid(el1_error, BAD_ERROR, 1);
el_invalid(el0_error, BAD_ERROR, 0);
+
+/*
+ * => x0 = &prev->sp
+ * x1 = &next->sp
+ * <= switch to the next thread
+ *
+ * The stack layout shows below:
+ *
+ * ---------------
+ * | lr |
+ * |---------------|
+ * | User data |
+ * |---------------|
+ * | sp | -----------------
+ * |---------------| |
+ * | x29 | |
+ * |---------------| v
+ * | x28 |
+ * |---------------| CALLEE_SAVED_REGISTERS
+ * | ..... |
+ * |---------------| ^
+ * | x20 | |
+ * |---------------| |
+ * thread->sp --> | x19 | -----------------
+ * |---------------|
+ */
+ENTRY(__arch_switch_threads)
+ /* Store the callee-saved registers and lr(x30) */
+ mov x4, sp
+
+ ldr x2, [x0]
+ 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]
+ stp x29, x4, [x2, #16 * 5]
+
+ add x2, x2, #(CALLEE_SAVED_REGISTERS * 8)
+ add x2, x2, #8 /* skip the user data */
+ str x30, [x2]
+
+ /* Restore the callee-saved registers and lr(x30) */
+ ldr x2, [x1]
+ 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]
+ ldp x29, x4, [x2, #16 * 5]
+
+ add x2, x2, #(CALLEE_SAVED_REGISTERS * 8)
+ add x2, x2, #8 /* skip the user data */
+ ldr x30, [x2]
+
+ mov sp, x4
+ ret
+ENDPROC(__arch_switch_threads)
diff --git a/include/arm/arm64/os.h b/include/arm/arm64/os.h
index 9c36a2c..1ffd99b 100644
--- a/include/arm/arm64/os.h
+++ b/include/arm/arm64/os.h
@@ -1,6 +1,7 @@
#ifndef _ARM64_OS_H_
#define _ARM64_OS_H_
+#ifndef __ASSEMBLY__
static inline void local_irq_disable(void)
{
__asm__ __volatile__("msr daifset, #2": : :"memory");
@@ -32,6 +33,8 @@ static inline void local_irq_enable(void)
#define wmb() dmb(st) /* Full system memory barrier store */
#define rmb() dmb(ld) /* Full system memory barrier load */
+#endif
+
/* The Callee-saved registers : x19 ~ x29, and SP */
#define CALLEE_SAVED_REGISTERS 12
--
2.7.4
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/cgi-bin/mailman/listinfo/minios-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |