@@ -52,107 +52,34 @@ pub struct ArtyExx {
5252}
5353
5454impl ArtyExx {
55- pub unsafe fn new ( ) -> ArtyExx {
56- // Make a bit-vector of all interrupt locations that we actually intend
57- // to use on this chip.
58- // 0001 1111 1111 1111 1111 0000 0000 1000 0000
59- let in_use_interrupts: u64 = 0x1FFFF0080 ;
60-
61- ArtyExx {
62- userspace_kernel_boundary : rv32i:: syscall:: SysCall :: new ( ) ,
63- clic : rv32i:: clic:: Clic :: new ( in_use_interrupts) ,
64- }
65- }
66-
67- pub fn enable_all_interrupts ( & self ) {
68- self . clic . enable_all ( ) ;
69- }
55+ pub unsafe fn new ( ) -> ArtyExx { loop { } }
56+
57+ pub fn enable_all_interrupts ( & self ) { loop { } }
7058
7159 /// Configure the PMP to allow all accesses in both machine mode (the
7260 /// default) and in user mode.
7361 ///
7462 /// This needs to be replaced with a real PMP driver. See
7563 /// https://github.com/tock/tock/issues/1135
76- pub unsafe fn disable_pmp ( & self ) {
77- asm ! ( "
78- // PMP PMP PMP
79- // PMP PMP PMP
80- // PMP PMP PMP
81- // PMP PMP PMP
82- // TODO: Add a real PMP driver!!
83- // Take some time to disable the PMP.
84-
85- // Set the first region address to 0xFFFFFFFF. When using top-of-range mode
86- // this will include the entire address space.
87- lui t0, %hi(0xFFFFFFFF)
88- addi t0, t0, %lo(0xFFFFFFFF)
89- csrw 0x3b0, t0 // CSR=pmpaddr0
90-
91- // Set the first region to use top-of-range and allow everything.
92- // This is equivalent to:
93- // R=1, W=1, X=1, A=01, L=0
94- li t0, 0x0F
95- csrw 0x3a0, t0 // CSR=pmpcfg0
96- "
97- :
98- :
99- :
100- : "volatile" ) ;
101- }
64+ pub unsafe fn disable_pmp ( & self ) { loop { } }
10265
10366 /// By default the machine timer is enabled and will trigger interrupts. To
10467 /// prevent that we can make the compare register very large to effectively
10568 /// stop the interrupt from triggering, and then the machine timer can be
10669 /// used later as needed.
107- pub unsafe fn disable_machine_timer ( & self ) {
108- asm ! ( "
109- // Initialize machine timer mtimecmp to disable the machine timer
110- // interrupt.
111- li t0, -1 // Set mtimecmp to 0xFFFFFFFF
112- lui t1, %hi(0x02004000) // Load the address of mtimecmp to t1
113- addi t1, t1, %lo(0x02004000) // Load the address of mtimecmp to t1
114- sw t0, 0(t1) // mtimecmp is 64 bits, set to all ones
115- sw t0, 4(t1) // mtimecmp is 64 bits, set to all ones
116- "
117- :
118- :
119- :
120- : "volatile" ) ;
121- }
70+ pub unsafe fn disable_machine_timer ( & self ) { loop { } }
12271
12372 /// Setup the function that should run when a trap happens.
12473 ///
12574 /// This needs to be chip specific because how the CLIC works is configured
12675 /// when the trap handler address is specified in mtvec, and that is only
12776 /// valid for platforms with a CLIC.
128- pub unsafe fn configure_trap_handler ( & self ) {
129- asm ! ( "
130- // The csrw instruction writes a Control and Status Register (CSR)
131- // with a new value.
132- //
133- // CSR 0x305 (mtvec, 'Machine trap-handler base address.') sets the
134- // address of the trap handler. We do not care about its old value,
135- // so we don't bother reading it. We want to enable direct CLIC mode
136- // so we set the second lowest bit.
137- lui t0, %hi(_start_trap)
138- addi t0, t0, %lo(_start_trap)
139- ori t0, t0, 0x02 // Set CLIC direct mode
140- csrw 0x305, t0 // Write the mtvec CSR.
141- "
142- :
143- :
144- :
145- : "volatile" ) ;
146- }
77+ pub unsafe fn configure_trap_handler ( & self ) { loop { } }
14778
14879 /// Generic helper initialize function to setup all of the chip specific
14980 /// operations. Different boards can call the functions that `initialize()`
15081 /// calls directly if it needs to use a custom setup operation.
151- pub unsafe fn initialize ( & self ) {
152- self . disable_pmp ( ) ;
153- self . disable_machine_timer ( ) ;
154- self . configure_trap_handler ( ) ;
155- }
82+ pub unsafe fn initialize ( & self ) { loop { } }
15683}
15784
15885impl kernel:: Chip for ArtyExx {
@@ -167,69 +94,22 @@ impl kernel::Chip for ArtyExx {
16794 type UserspaceKernelBoundary = rv32i:: syscall:: SysCall ;
16895 type SysTick = ( ) ;
16996
170- fn mpu ( & self ) -> & Self :: MPU {
171- & ( )
172- }
173-
174- fn systick ( & self ) -> & Self :: SysTick {
175- & ( )
176- }
177-
178- fn userspace_kernel_boundary ( & self ) -> & rv32i:: syscall:: SysCall {
179- & self . userspace_kernel_boundary
180- }
181-
182- fn service_pending_interrupts ( & self ) {
183- unsafe {
184- while let Some ( interrupt) = self . clic . next_pending ( ) {
185- match interrupt {
186- interrupts:: MTIP => machine_timer:: MACHINETIMER . handle_interrupt ( ) ,
187-
188- interrupts:: GPIO0 => gpio:: PORT [ 3 ] . handle_interrupt ( ) ,
189- interrupts:: GPIO1 => gpio:: PORT [ 3 ] . handle_interrupt ( ) ,
190- interrupts:: GPIO2 => gpio:: PORT [ 3 ] . handle_interrupt ( ) ,
191- interrupts:: GPIO3 => gpio:: PORT [ 3 ] . handle_interrupt ( ) ,
192- interrupts:: GPIO4 => gpio:: PORT [ 4 ] . handle_interrupt ( ) ,
193- interrupts:: GPIO5 => gpio:: PORT [ 5 ] . handle_interrupt ( ) ,
194- interrupts:: GPIO6 => gpio:: PORT [ 6 ] . handle_interrupt ( ) ,
195- interrupts:: GPIO7 => gpio:: PORT [ 7 ] . handle_interrupt ( ) ,
196- interrupts:: GPIO8 => gpio:: PORT [ 8 ] . handle_interrupt ( ) ,
197- interrupts:: GPIO9 => gpio:: PORT [ 9 ] . handle_interrupt ( ) ,
198- interrupts:: GPIO10 => gpio:: PORT [ 10 ] . handle_interrupt ( ) ,
199- interrupts:: GPIO11 => gpio:: PORT [ 11 ] . handle_interrupt ( ) ,
200- interrupts:: GPIO12 => gpio:: PORT [ 12 ] . handle_interrupt ( ) ,
201- interrupts:: GPIO13 => gpio:: PORT [ 13 ] . handle_interrupt ( ) ,
202- interrupts:: GPIO14 => gpio:: PORT [ 14 ] . handle_interrupt ( ) ,
203- interrupts:: GPIO15 => gpio:: PORT [ 15 ] . handle_interrupt ( ) ,
204-
205- interrupts:: UART0 => uart:: UART0 . handle_interrupt ( ) ,
206-
207- _ => debug ! ( "Pidx {}" , interrupt) ,
208- }
209-
210- // Mark that we are done with this interrupt and the hardware
211- // can clear it.
212- self . clic . complete ( interrupt) ;
213- }
214- }
215- }
216-
217- fn has_pending_interrupts ( & self ) -> bool {
218- self . clic . has_pending ( )
219- }
220-
221- fn sleep ( & self ) {
222- unsafe {
223- rv32i:: support:: wfi ( ) ;
224- }
225- }
97+ fn mpu ( & self ) -> & Self :: MPU { loop { } }
98+
99+ fn systick ( & self ) -> & Self :: SysTick { loop { } }
100+
101+ fn userspace_kernel_boundary ( & self ) -> & rv32i:: syscall:: SysCall { loop { } }
102+
103+ fn service_pending_interrupts ( & self ) { loop { } }
104+
105+ fn has_pending_interrupts ( & self ) -> bool { loop { } }
106+
107+ fn sleep ( & self ) { loop { } }
226108
227109 unsafe fn atomic < F , R > ( & self , f : F ) -> R
228110 where
229111 F : FnOnce ( ) -> R ,
230- {
231- rv32i:: support:: atomic ( f)
232- }
112+ { loop { } }
233113}
234114
235115/// Trap handler for board/chip specific code.
@@ -238,49 +118,13 @@ impl kernel::Chip for ArtyExx {
238118/// in kernel mode. All we need to do is check which interrupt occurred and
239119/// disable it.
240120#[ export_name = "_start_trap_rust" ]
241- pub extern "C" fn start_trap_rust ( ) {
242- let mut mcause: i32 ;
243-
244- unsafe {
245- asm ! ( "
246- // Read the mcause CSR to determine why we entered the trap handler.
247- // Since we are using the CLIC, the hardware includes the interrupt
248- // index in the mcause register.
249- csrr $0, 0x342 // CSR=0x342=mcause
250- "
251- : "=r" ( mcause)
252- :
253- :
254- : "volatile" ) ;
255- }
256-
257- // Check if the trap was from an interrupt or some other exception.
258- if mcause < 0 {
259- // If the most significant bit is set (i.e. mcause is negative) then
260- // this was an interrupt. The interrupt number is then the lowest 8
261- // bits.
262- let interrupt_index = mcause & 0xFF ;
263- unsafe {
264- rv32i:: clic:: disable_interrupt ( interrupt_index as u32 ) ;
265- }
266- } else {
267- // Otherwise, the kernel encountered a fault...so panic!()?
268- panic ! ( "kernel exception" ) ;
269- }
270- }
121+ pub extern "C" fn start_trap_rust ( ) { loop { } }
271122
272123/// Function that gets called if an interrupt occurs while an app was running.
273124/// mcause is passed in, and this function should correctly handle disabling the
274125/// interrupt that fired so that it does not trigger again.
275126#[ export_name = "_disable_interrupt_trap_handler" ]
276- pub extern "C" fn disable_interrupt_trap_handler ( mcause : u32 ) {
277- // The interrupt number is then the lowest 8
278- // bits.
279- let interrupt_index = mcause & 0xFF ;
280- unsafe {
281- rv32i:: clic:: disable_interrupt ( interrupt_index as u32 ) ;
282- }
283- }
127+ pub extern "C" fn disable_interrupt_trap_handler ( mcause : u32 ) { loop { } }
284128}
285129mod gpio {
286130use core:: ops:: { Index , IndexMut } ;
@@ -298,15 +142,11 @@ pub struct Port {
298142impl Index < usize > for Port {
299143 type Output = GpioPin ;
300144
301- fn index ( & self , index : usize ) -> & GpioPin {
302- & self . pins [ index]
303- }
145+ fn index ( & self , index : usize ) -> & GpioPin { loop { } }
304146}
305147
306148impl IndexMut < usize > for Port {
307- fn index_mut ( & mut self , index : usize ) -> & mut GpioPin {
308- & mut self . pins [ index]
309- }
149+ fn index_mut ( & mut self , index : usize ) -> & mut GpioPin { loop { } }
310150}
311151
312152pub static mut PORT : Port = Port {
0 commit comments