Files
ipxe/src/arch/riscv/prefix/sbiprefix.S
Michael Brown b3cbdc86fc [riscv] Place prefix debug strings in .rodata
The GNU assembler does not seem to automatically assume alignment to
an instruction boundary for sections containing assembled code.

Place the prefix debug strings (if present) in .rodata rather than in
.prefix, to avoid potentially creating misaligned code sections.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
2025-05-06 15:51:39 +01:00

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 ".rodata", "a", @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