9 changed files with 58 additions and 53 deletions
@ -0,0 +1,37 @@ |
|||
#include "pcr.h" |
|||
#include "pk.h" |
|||
|
|||
.section .text,"ax",@progbits |
|||
.globl __start |
|||
.ent __start |
|||
__start: |
|||
|
|||
lui $sp, %hi(stack_top) |
|||
add $sp, $sp, %lo(stack_top) |
|||
|
|||
lui $t0, %hi(trap_entry) |
|||
add $t0, $t0, %lo(trap_entry) |
|||
mtpcr $t0, ASM_CR(PCR_EVEC) |
|||
|
|||
mtpcr $x0, ASM_CR(PCR_COUNT) |
|||
mtpcr $x0, ASM_CR(PCR_COMPARE) |
|||
|
|||
li $t0, SR_S | SR_PS | SR_ET | SR_IM | SR_EC | SR_SX |
|||
or $t1, $t0, SR_EF | SR_EV |
|||
mtpcr $t1, ASM_CR(PCR_SR) |
|||
mfpcr $t1, ASM_CR(PCR_SR) |
|||
mtpcr $t0, ASM_CR(PCR_SR) |
|||
|
|||
and $t2, $t1, SR_EF |
|||
lui $t0, %hi(have_fp) |
|||
sw $t2, %lo(have_fp)($t0) |
|||
|
|||
and $t2, $t1, SR_EV |
|||
lui $t0, %hi(have_vector) |
|||
sw $t2, %lo(have_vector)($t0) |
|||
|
|||
lui $t0, %hi(boot) |
|||
jalr.j $t0, %lo(boot) |
|||
#j boot |
|||
|
|||
.end __start |
|||
@ -1,32 +0,0 @@ |
|||
#include "pcr.h" |
|||
#include "pk.h" |
|||
|
|||
void __attribute__((section(".boottext"))) __start() |
|||
{ |
|||
extern char stack_top; |
|||
asm volatile("move $sp,%0" : : "r"(&stack_top-64) : "memory"); |
|||
|
|||
extern char trap_entry; |
|||
register void* te = &trap_entry; |
|||
mtpcr(te,PCR_EVEC); |
|||
|
|||
mtpcr(0,PCR_COUNT); |
|||
mtpcr(0,PCR_COMPARE); |
|||
|
|||
register long sr0 = SR_S | SR_PS | SR_ET | SR_IM | SR_EC; |
|||
if(sizeof(void*) == 8) |
|||
sr0 |= SR_SX; |
|||
|
|||
mtpcr(sr0 | SR_EF, PCR_SR); |
|||
have_fp = mfpcr(PCR_SR) & SR_EF; |
|||
mtpcr(sr0, PCR_SR); |
|||
|
|||
mtpcr(sr0 | SR_EV, PCR_SR); |
|||
have_vector = mfpcr(PCR_SR) & SR_EV; |
|||
mtpcr(sr0, PCR_SR); |
|||
|
|||
extern void boot(); |
|||
register void (*boot_p)() = &boot; |
|||
asm("" : "=r"(boot_p) : "0"(boot_p)); |
|||
boot_p(); |
|||
} |
|||
Loading…
Reference in new issue