mirror of
https://github.com/ipxe/ipxe
synced 2025-12-08 10:20:24 +03:00
Use compressed relocation records instead of raw Elf_Rela records. This saves around 15% of the total binary size for the all-drivers image bin-riscv64/ipxe.sbi. Signed-off-by: Michael Brown <mcb30@ipxe.org>
142 lines
3.2 KiB
ArmAsm
142 lines
3.2 KiB
ArmAsm
/*
|
|
* Copyright (C) 2024 Michael Brown <mbrown@fensystems.co.uk>.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License as
|
|
* published by the Free Software Foundation; either version 2 of the
|
|
* License, or any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
* 02110-1301, USA.
|
|
*
|
|
* You can also choose to distribute this program under the terms of
|
|
* the Unmodified Binary Distribution Licence (as given in the file
|
|
* COPYING.UBDL), provided that you have satisfied its requirements.
|
|
*/
|
|
|
|
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
|
|
|
|
/** @file
|
|
*
|
|
* SBI position-independent executable prefix
|
|
*
|
|
*/
|
|
|
|
.section ".note.GNU-stack", "", @progbits
|
|
.text
|
|
|
|
/* SBI debug console extension */
|
|
#define SBI_DBCN ( ( 'D' << 24 ) | ( 'B' << 16 ) | ( 'C' << 8 ) | 'N' )
|
|
#define SBI_DBCN_WRITE 0x00
|
|
|
|
/* SBI system reset extension */
|
|
#define SBI_SRST ( ( 'S' << 24 ) | ( 'R' << 16 ) | ( 'S' << 8 ) | 'T' )
|
|
#define SBI_SRST_SYSTEM_RESET 0x00
|
|
#define SBI_RESET_COLD 0x00000001
|
|
|
|
/* ELF machine type */
|
|
#define EM_RISCV 243
|
|
|
|
/*
|
|
* Display progress message via debug console
|
|
*/
|
|
.macro progress message
|
|
#ifndef NDEBUG
|
|
.section ".prefix.data", "aw", @progbits
|
|
progress_\@:
|
|
.ascii "\message"
|
|
.equ progress_\@_len, . - progress_\@
|
|
.size progress_\@, . - progress_\@
|
|
.previous
|
|
li a7, SBI_DBCN
|
|
li a6, SBI_DBCN_WRITE
|
|
li a0, progress_\@_len
|
|
la a1, progress_\@
|
|
mv a2, zero
|
|
ecall
|
|
#endif
|
|
.endm
|
|
|
|
/*
|
|
* SBI entry point
|
|
*/
|
|
.section ".prefix", "ax", @progbits
|
|
.org 0
|
|
.globl _sbi_start
|
|
_sbi_start:
|
|
/* Preserve arguments */
|
|
mv s0, a0
|
|
mv s1, a1
|
|
progress "\nSBI->iPXE"
|
|
|
|
/* Apply dynamic relocations */
|
|
call apply_relocs
|
|
progress " .reloc"
|
|
|
|
/* Zero the bss */
|
|
la t0, _bss
|
|
la t1, _ebss
|
|
1: STOREN zero, (t0)
|
|
addi t0, t0, ( __riscv_xlen / 8 )
|
|
blt t0, t1, 1b
|
|
progress " .bss"
|
|
|
|
/* Set up stack */
|
|
la sp, _estack
|
|
progress " .stack"
|
|
|
|
/* Store boot hart */
|
|
la t0, boot_hart
|
|
STOREN s0, (t0)
|
|
|
|
/* Register device tree */
|
|
la a0, sysfdt
|
|
mv a1, s1
|
|
li a2, -1
|
|
call fdt_parse
|
|
|
|
/* Call main program */
|
|
progress "\n\n"
|
|
call main
|
|
|
|
/* We have no return path, since the M-mode SBI implementation
|
|
* will have jumped to us by setting our start address in MEPC
|
|
* and issuing an MRET instruction.
|
|
*
|
|
* Attempt a system reset, since there is nothing else we can
|
|
* viably do at this point.
|
|
*/
|
|
progress "\niPXE->SBI reset\n"
|
|
li a7, SBI_SRST
|
|
li a6, SBI_SRST_SYSTEM_RESET
|
|
li a0, SBI_RESET_COLD
|
|
mv a1, zero
|
|
ecall
|
|
|
|
/* If reset failed, lock the system */
|
|
progress "(reset failed)\n"
|
|
1: wfi
|
|
j 1b
|
|
.size _sbi_start, . - _sbi_start
|
|
|
|
/* File split information for the compressor */
|
|
.section ".zinfo", "a", @progbits
|
|
.ascii "COPY"
|
|
.word 0
|
|
.word _filesz
|
|
.word 1
|
|
.ascii "BASE"
|
|
.word 0
|
|
.dword _base
|
|
.ascii "ZREL"
|
|
.word _reloc_offset
|
|
.word _reloc_filesz
|
|
.word EM_RISCV
|