source: mainline/boot/arch/riscv64/src/asm.S

Last change on this file was 56210a7a, checked in by Jiří Zárevúcky <zarevucky.jiri@…>, 6 months ago

Update GCC and binutils to latest versions

  • Property mode set to 100644
File size: 3.6 KB
Line 
1#
2# Copyright (c) 2016 Martin Decky
3# All rights reserved.
4#
5# Redistribution and use in source and binary forms, with or without
6# modification, are permitted provided that the following conditions
7# are met:
8#
9# - Redistributions of source code must retain the above copyright
10# notice, this list of conditions and the following disclaimer.
11# - Redistributions in binary form must reproduce the above copyright
12# notice, this list of conditions and the following disclaimer in the
13# documentation and/or other materials provided with the distribution.
14# - The name of the author may not be used to endorse or promote products
15# derived from this software without specific prior written permission.
16#
17# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27#
28
29#include <abi/asmtool.h>
30#include <arch/arch.h>
31#include <arch/mm.h>
32
33#define MCOUNTEREN_CY_MASK 0x00000001
34#define MCOUNTEREN_TM_MASK 0x00000002
35#define MCOUNTEREN_IR_MASK 0x00000004
36
37#define MSTATUS_MPP_MASK 0x00001800
38#define MSTATUS_MPP_USER 0x00000000
39#define MSTATUS_MPP_SUPERVISOR 0x00000800
40#define MSTATUS_MPP_MACHINE 0x00001800
41
42#define MSTATUS_SUM_MASK 0x00040000
43
44#define SATP_PFN_MASK 0x00000fffffffffff
45
46#define SATP_MODE_MASK 0xf000000000000000
47#define SATP_MODE_BARE 0x0000000000000000
48#define SATP_MODE_SV39 0x8000000000000000
49#define SATP_MODE_SV48 0x9000000000000000
50
51.section BOOTSTRAP
52
53.org DEFAULT_MTVEC + TRAP_VECTOR_RESET
54SYMBOL(start)
55 /* Set up machine state */
56 li x1, 0
57 li x2, 0
58 li x3, 0
59 li x4, 0
60 li x5, 0
61 li x6, 0
62 li x7, 0
63 li x8, 0
64 li x9, 0
65 li x10, 0
66 li x11, 0
67 li x12, 0
68 li x13, 0
69 li x14, 0
70 li x15, 0
71 li x16, 0
72 li x17, 0
73 li x18, 0
74 li x19, 0
75 li x20, 0
76 li x21, 0
77 li x22, 0
78 li x23, 0
79 li x24, 0
80 li x25, 0
81 li x26, 0
82 li x27, 0
83 li x28, 0
84 li x29, 0
85 li x30, 0
86 li x31, 0
87
88 /* Set up stack, create stack frame */
89 la sp, boot_stack + BOOT_STACK_SIZE
90 addi sp, sp, -16
91
92 j bootstrap
93
94.text
95
96FUNCTION_BEGIN(jump_to_kernel)
97 /* Enable performance counters access in supervisor mode */
98 csrsi mcounteren, MCOUNTEREN_CY_MASK | MCOUNTEREN_TM_MASK | MCOUNTEREN_IR_MASK
99
100 /* Setup SV48 paging for supervisor mode */
101 la t0, ptl_0
102 srli t0, t0, 12
103
104 li t1, SATP_PFN_MASK
105 and t0, t0, t1
106
107 li t1, SATP_MODE_SV48
108 or t0, t0, t1
109
110 csrw satp, t0
111
112 /* Jump to supervisor mode */
113 csrr t0, mstatus
114
115 li t1, ~MSTATUS_MPP_MASK
116 and t0, t0, t1
117
118 /*
119 * TODO: Enable running with Supervisor User Mode
120 * access disabled.
121 */
122 li t1, MSTATUS_MPP_SUPERVISOR | MSTATUS_SUM_MASK
123 or t0, t0, t1
124
125 csrw mstatus, t0
126
127 /* Entry point address is in a1. */
128 mv ra, a1
129 csrw mepc, ra
130
131 mret
132FUNCTION_END(jump_to_kernel)
133
134FUNCTION_BEGIN(halt)
135 j halt
136FUNCTION_END(halt)
137
138.data
139
140.align PAGE_WIDTH
141SYMBOL(boot_stack)
142 .space BOOT_STACK_SIZE
143
144.section .pt, "aw", @progbits
145
146.align PAGE_WIDTH
147SYMBOL(ptl_0)
148 .fill 256, 8, 0
149 /* Identity mapping for [0; 512G) */
150 .quad 0 + (PTL_DIRTY | PTL_ACCESSED | PTL_EXECUTABLE | PTL_WRITABLE | PTL_READABLE | PTL_VALID)
151 .fill 255, 8, 0
Note: See TracBrowser for help on using the repository browser.