explain some of the .option
directives in _enter()
This commit is contained in:
parent
e409015ff8
commit
7d658ad704
13
src/main.rs
13
src/main.rs
|
@ -15,11 +15,16 @@ unsafe extern "C" fn _enter() -> ! {
|
|||
use core::arch::asm;
|
||||
asm!(
|
||||
// before we use the `la` pseudo-instruction for the first time,
|
||||
// we need to set `gp` (google linker relaxation)
|
||||
".option push",
|
||||
".option norelax",
|
||||
// we need to set `gp` (google linker relaxation)
|
||||
".option push", // pushes the current option stack
|
||||
".option norelax", // disable relaxation so we can properly set `gp`
|
||||
// this instruction compiles to:
|
||||
// 1:
|
||||
// auipc gp, %pcrel_hi(_global_pointer)
|
||||
// addi gp, gp, %pcrel_lo(1b)
|
||||
// if relaxation were on, this would simply be `mv gp, gp` or `addi gp, gp, 0`
|
||||
"la gp, _global_pointer",
|
||||
".option pop",
|
||||
".option pop", // pops the current option stack
|
||||
|
||||
// set the stack pointer
|
||||
"la sp, _init_stack_top",
|
||||
|
|
Loading…
Reference in a new issue