mirror of
https://github.com/ipxe/ipxe
synced 2025-12-07 18:00:28 +03:00
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>
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 ".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
|