mm/src/makerom/entry.s

50 lines
1.5 KiB
ArmAsm

#include "PR/asm.h"
#include "PR/regdef.h"
#include "boot.h"
.text
#define PAD_TO 0x60
#define LA(reg, sym) la reg, sym
#if !defined(AVOID_UB)
/* Old assembler workarounds: The makerom tool in the N64 SDK was given the bss segment size as a const
* literal, and since this literal was < 0x10000 it was loaded in one instruction. We don't have access
* to the bss segment size until we link everything so we cannot do the same thing. Instead we must load
* only the lower 16 bits of the bss size for matching.
* When AVOID_UB is enabled, don't do this and instead load the full symbol value, otherwise not all of
* bss may be cleared. */
# if defined(__sgi)
# define LOAD_BSS_SIZE(reg) li reg, %half(_bootSegmentBssSize)
# else
# define LOAD_BSS_SIZE(reg) ori reg, zero, %lo(_bootSegmentBssSize)
# endif
#else
# define LOAD_BSS_SIZE(reg) LA(reg, _bootSegmentBssSize)
#endif
LEAF(entrypoint)
/* Clear boot segment .bss */
LA( t0, _bootSegmentBssStart)
LOAD_BSS_SIZE(t1)
.clear_bss:
sw zero, 0(t0)
sw zero, 4(t0)
addi t0, t0, 8
addi t1, t1, -8
bnez t1, .clear_bss
/* Set up stack and enter program code */
LA( sp, sBootStack + BOOT_STACK_SIZE)
LA( t2, bootproc)
jr t2
END(entrypoint)
#ifdef __sgi
/* IDO can't take absolute differences of symbols so the size of the above is hardcoded */
.space PAD_TO - 0x34
#else
/* Pad to a total size taking into account the size of the above */
.space PAD_TO - (. - entrypoint)
#endif