aarch64: Remove redundant init_stack_frame
The init_stack_frame is the same as the the ESF. No need to have two
separate structs. Consolidate everything into one single struct and make
register entries explicit.
Signed-off-by: Carlo Caione <ccaione@baylibre.com>
diff --git a/arch/arm/core/aarch64/fatal.c b/arch/arm/core/aarch64/fatal.c
index fa256bb..359a610 100644
--- a/arch/arm/core/aarch64/fatal.c
+++ b/arch/arm/core/aarch64/fatal.c
@@ -148,26 +148,16 @@
static void esf_dump(const z_arch_esf_t *esf)
{
- LOG_ERR("x0: 0x%016llx x1: 0x%016llx",
- esf->basic.regs[18], esf->basic.regs[19]);
- LOG_ERR("x2: 0x%016llx x3: 0x%016llx",
- esf->basic.regs[16], esf->basic.regs[17]);
- LOG_ERR("x4: 0x%016llx x5: 0x%016llx",
- esf->basic.regs[14], esf->basic.regs[15]);
- LOG_ERR("x6: 0x%016llx x7: 0x%016llx",
- esf->basic.regs[12], esf->basic.regs[13]);
- LOG_ERR("x8: 0x%016llx x9: 0x%016llx",
- esf->basic.regs[10], esf->basic.regs[11]);
- LOG_ERR("x10: 0x%016llx x11: 0x%016llx",
- esf->basic.regs[8], esf->basic.regs[9]);
- LOG_ERR("x12: 0x%016llx x13: 0x%016llx",
- esf->basic.regs[6], esf->basic.regs[7]);
- LOG_ERR("x14: 0x%016llx x15: 0x%016llx",
- esf->basic.regs[4], esf->basic.regs[5]);
- LOG_ERR("x16: 0x%016llx x17: 0x%016llx",
- esf->basic.regs[2], esf->basic.regs[3]);
- LOG_ERR("x18: 0x%016llx x30: 0x%016llx",
- esf->basic.regs[0], esf->basic.regs[1]);
+ LOG_ERR("x0: 0x%016llx x1: 0x%016llx", esf->x0, esf->x1);
+ LOG_ERR("x2: 0x%016llx x3: 0x%016llx", esf->x2, esf->x3);
+ LOG_ERR("x4: 0x%016llx x5: 0x%016llx", esf->x4, esf->x5);
+ LOG_ERR("x6: 0x%016llx x7: 0x%016llx", esf->x6, esf->x7);
+ LOG_ERR("x8: 0x%016llx x9: 0x%016llx", esf->x8, esf->x9);
+ LOG_ERR("x10: 0x%016llx x11: 0x%016llx", esf->x10, esf->x11);
+ LOG_ERR("x12: 0x%016llx x13: 0x%016llx", esf->x12, esf->x13);
+ LOG_ERR("x14: 0x%016llx x15: 0x%016llx", esf->x14, esf->x15);
+ LOG_ERR("x16: 0x%016llx x17: 0x%016llx", esf->x16, esf->x17);
+ LOG_ERR("x18: 0x%016llx x30: 0x%016llx", esf->x18, esf->x30);
}
#endif /* CONFIG_EXCEPTION_DEBUG */
diff --git a/arch/arm/core/aarch64/thread.c b/arch/arm/core/aarch64/thread.c
index e1fc80f..dc0028b 100644
--- a/arch/arm/core/aarch64/thread.c
+++ b/arch/arm/core/aarch64/thread.c
@@ -16,35 +16,6 @@
#include <wait_q.h>
#include <arch/cpu.h>
-struct init_stack_frame {
- /* top of the stack / most recently pushed */
-
- /* SPSR_ELn and ELR_ELn */
- uint64_t spsr;
- uint64_t elr;
-
- /*
- * Registers restored by z_arm64_exit_exc(). We are not interested in
- * registers x4 -> x18 + x30 but we need to account for those anyway
- */
- uint64_t unused[16];
-
- /*
- * z_arm64_exit_exc() pulls these off the stack and into argument
- * registers before calling z_thread_entry():
- * - x2 <- arg2
- * - x3 <- arg3
- * - x0 <- entry_point
- * - x1 <- arg1
- */
- uint64_t arg2;
- uint64_t arg3;
- uint64_t entry_point;
- uint64_t arg1;
-
- /* least recently pushed */
-};
-
/*
* An initial context, to be "restored" by z_arm64_context_switch(), is put at
* the other end of the stack, and thus reusable by the stack when not needed
@@ -54,14 +25,14 @@
char *stack_ptr, k_thread_entry_t entry,
void *p1, void *p2, void *p3)
{
- struct init_stack_frame *pInitCtx;
+ z_arch_esf_t *pInitCtx;
- pInitCtx = Z_STACK_PTR_TO_FRAME(struct init_stack_frame, stack_ptr);
+ pInitCtx = Z_STACK_PTR_TO_FRAME(struct __esf, stack_ptr);
- pInitCtx->entry_point = (uint64_t)entry;
- pInitCtx->arg1 = (uint64_t)p1;
- pInitCtx->arg2 = (uint64_t)p2;
- pInitCtx->arg3 = (uint64_t)p3;
+ pInitCtx->x0 = (uint64_t)entry;
+ pInitCtx->x1 = (uint64_t)p1;
+ pInitCtx->x2 = (uint64_t)p2;
+ pInitCtx->x3 = (uint64_t)p3;
/*
* - ELR_ELn: to be used by eret in z_arm64_exit_exc() to return
diff --git a/include/arch/arm/aarch64/exc.h b/include/arch/arm/aarch64/exc.h
index 87e9af7..0c9a256 100644
--- a/include/arch/arm/aarch64/exc.h
+++ b/include/arch/arm/aarch64/exc.h
@@ -25,11 +25,28 @@
#endif
struct __esf {
- struct __basic_sf {
- uint64_t spsr;
- uint64_t elr;
- uint64_t regs[20];
- } basic;
+ uint64_t spsr;
+ uint64_t elr;
+ uint64_t x18;
+ uint64_t x30;
+ uint64_t x16;
+ uint64_t x17;
+ uint64_t x14;
+ uint64_t x15;
+ uint64_t x12;
+ uint64_t x13;
+ uint64_t x10;
+ uint64_t x11;
+ uint64_t x8;
+ uint64_t x9;
+ uint64_t x6;
+ uint64_t x7;
+ uint64_t x4;
+ uint64_t x5;
+ uint64_t x2;
+ uint64_t x3;
+ uint64_t x0;
+ uint64_t x1;
};
typedef struct __esf z_arch_esf_t;