58 lines
1.5 KiB
ArmAsm
58 lines
1.5 KiB
ArmAsm
|
|
// The following definitions were copied from:
|
|
// esp-idf/components/xtensa/include/xtensa/corebits.h
|
|
#define PS_WOE_MASK 0x00040000
|
|
#define PS_OWB_MASK 0x00000F00
|
|
#define PS_CALLINC_MASK 0x00030000
|
|
#define PS_WOE PS_WOE_MASK
|
|
|
|
// Only calling it call_start_cpu0 for consistency with ESP-IDF.
|
|
.section .text.call_start_cpu0
|
|
1:
|
|
.long _stack_top
|
|
.global call_start_cpu0
|
|
call_start_cpu0:
|
|
// We need to set the stack pointer to a different value. This is somewhat
|
|
// complicated in the Xtensa architecture. The code below is a modified
|
|
// version of the following code:
|
|
// https://github.com/espressif/esp-idf/blob/c77c4ccf/components/xtensa/include/xt_instr_macros.h#L47
|
|
|
|
// Disable WOE.
|
|
rsr.ps a2
|
|
movi a3, ~(PS_WOE_MASK)
|
|
and a2, a2, a3
|
|
wsr.ps a2
|
|
rsync
|
|
|
|
// Set WINDOWSTART to 1 << WINDOWBASE.
|
|
rsr.windowbase a2
|
|
ssl a2
|
|
movi a2, 1
|
|
sll a2, a2
|
|
wsr.windowstart a2
|
|
rsync
|
|
|
|
// Load new stack pointer.
|
|
l32r sp, 1b
|
|
|
|
// Re-enable WOE.
|
|
rsr.ps a2
|
|
movi a3, PS_WOE
|
|
or a2, a2, a3
|
|
wsr.ps a2
|
|
rsync
|
|
|
|
// Enable the FPU (coprocessor 0 so the lowest bit).
|
|
movi a2, 1
|
|
wsr.cpenable a2
|
|
rsync
|
|
|
|
// Jump to the runtime start function written in Go.
|
|
call4 main
|
|
|
|
.section .text.tinygo_scanCurrentStack
|
|
.global tinygo_scanCurrentStack
|
|
tinygo_scanCurrentStack:
|
|
// TODO: save callee saved registers on the stack
|
|
j tinygo_scanstack
|