The new name and location make more sense: - The instruction used to call into machine mode isn't called "ecall" anymore; it's mcall now. - Having SBI_ in the name is slightly wrong, too: these numbers are not part of the Supervisor Binary Interface, they are just used to forward SBI calls (they could be renumbered arbitrarily without breaking an OS that's run under coreboot). Also remove mcall_dev_{req,resp} and the corresponding mcall numbers, which are no longer used. Change-Id: I76a8cb04e4ace51964b1cb4f67d49cfee9850da7 Signed-off-by: Jonathan Neuschäfer <j.neuschaefer@gmx.net> Reviewed-on: https://review.coreboot.org/18146 Tested-by: build bot (Jenkins) Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
120 lines
2.4 KiB
ArmAsm
120 lines
2.4 KiB
ArmAsm
/*
|
|
* RISC-V supervisor binary interface (SBI) trampoline page
|
|
*
|
|
* Copyright 2016 Jonathan Neuschäfer <j.neuschaefer@gmx.net>
|
|
*
|
|
* 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; version 2 of
|
|
* the License.
|
|
*
|
|
* 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.
|
|
*/
|
|
|
|
#define __ASSEMBLY__
|
|
#include <arch/encoding.h>
|
|
#include <mcall.h>
|
|
|
|
.section ".text.sbi", "ax", %progbits
|
|
|
|
/* align to a page boundary */
|
|
.align RISCV_PGSHIFT
|
|
|
|
.globl sbi_page
|
|
sbi_page:
|
|
|
|
/*
|
|
* None of the SBI entry points is located in the first half of the
|
|
* page
|
|
*/
|
|
.skip 0x800
|
|
|
|
/* -2048: size_t sbi_hart_id(void); */
|
|
li a7, MCALL_HART_ID
|
|
ecall
|
|
jr ra
|
|
.align 4
|
|
|
|
/* -2032: size_t sbi_num_harts(void); */
|
|
li a7, MCALL_NUM_HARTS
|
|
ecall
|
|
jr ra
|
|
.align 4
|
|
|
|
/* -2016: unsigned long sbi_query_memory(unsigned long id,
|
|
memory_block_info *p); */
|
|
li a7, MCALL_QUERY_MEMORY
|
|
ecall
|
|
jr ra
|
|
.align 4
|
|
|
|
/* -2000: int sbi_console_putchar(uint8_t ch); */
|
|
li a7, MCALL_CONSOLE_PUTCHAR
|
|
ecall
|
|
jr ra
|
|
.align 4
|
|
|
|
/* -1984: int sbi_console_getchar(void); */
|
|
li a0, -1 /* failure: Coreboot doesn't support console input */
|
|
jr ra
|
|
.align 4
|
|
|
|
/* -1968: Not allocated */
|
|
ebreak
|
|
.align 4
|
|
|
|
/* -1952: int sbi_send_ipi(size_t hart_id); */
|
|
ebreak
|
|
.align 4
|
|
|
|
/* -1936: int bool sbi_clear_ipi(void); */
|
|
ebreak
|
|
.align 4
|
|
|
|
/* -1920: unsigned long sbi_timebase(void); */
|
|
li a0, 1000000000 /* I have no idea. */
|
|
jr ra
|
|
.align 4
|
|
|
|
/* -1904: void sbi_shutdown(void); */
|
|
li a7, MCALL_SHUTDOWN
|
|
ecall
|
|
jr ra
|
|
.align 4
|
|
|
|
/* -1888: void sbi_set_timer(unsigned long long stime_value); */
|
|
li a7, MCALL_SET_TIMER
|
|
ecall
|
|
jr ra
|
|
.align 4
|
|
|
|
/* -1872: int sbi_mask_interrupt(int which); */
|
|
li a0, 0 # dummy
|
|
jr ra
|
|
.align 4
|
|
|
|
/* -1856: int sbi_unmask_interrupt(int which); */
|
|
li a0, 0 # dummy
|
|
jr ra
|
|
.align 4
|
|
|
|
/* -1840: void sbi_remote_sfence_vm(const uintptr_t* harts,
|
|
size_t asid); */
|
|
ebreak
|
|
.align 4
|
|
|
|
/* -1824: void sbi_remote_sfence_vm_range(const uintptr_t* harts,
|
|
size_t asid, uintptr_t start, uintptr_t size); */
|
|
ebreak
|
|
.align 4
|
|
|
|
/* -1808: void sbi_remote_fence_i(const uintptr_t* harts); */
|
|
ebreak
|
|
.align 4
|
|
|
|
/* Fill the remainder of the page */
|
|
.align RISCV_PGSHIFT
|