summaryrefslogtreecommitdiff
path: root/src/arch/riscv/sbi.S
blob: 0ff7c3b47d5625e69a6b039fc26c1c4f44201363 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/*
 * 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