1#![allow(dead_code)]
14#![deny(
16 clippy::unwrap_used,
17 clippy::expect_used,
18 clippy::panic,
19 clippy::indexing_slicing
20)]
21
22pub const SYS_YIELD: usize = 0;
25pub const SYS_EXIT: usize = 1;
27pub const SYS_PRINT: usize = 2;
29pub const SYS_READ_FILE: usize = 3;
31pub const SYS_WRITE_FILE: usize = 4;
33pub const SYS_WIN_CREATE: usize = 5;
36pub const SYS_WIN_BLIT: usize = 6;
38pub const SYS_WIN_POLL: usize = 7;
40pub const SYS_WIN_CLOSE: usize = 8;
42
43#[no_mangle]
56pub extern "C" fn rust_svc_handler(
57 x0: usize,
58 x1: usize,
59 _x2: usize,
60 syscall_nr: usize, ) -> usize {
62 match syscall_nr {
63 SYS_YIELD => {
64 crate::kernel::scheduler::yield_now();
66 0
67 }
68 SYS_EXIT => {
69 crate::info!("[SYS] Process exiting (exit code={})", x0);
71 crate::kernel::scheduler::exit();
72 }
74 SYS_PRINT => {
75 match crate::kernel::usercopy::user_str(x0, x1, 4095) {
78 Some(s) => crate::println!("[USER ] {}", s),
79 None => crate::error!("[SYS] sys_print: rejected (ptr=0x{:x}, len={})", x0, x1),
80 }
81 0
82 }
83 SYS_WIN_CREATE => crate::kernel::user_win::sys_win_create(x0),
84 SYS_WIN_BLIT => crate::kernel::user_win::sys_win_blit(x0, x1),
85 SYS_WIN_POLL => crate::kernel::user_win::sys_win_poll(x0, x1),
86 SYS_WIN_CLOSE => crate::kernel::user_win::sys_win_close(x0),
87 SYS_READ_FILE => {
88 crate::warn!("[SYS] sys_read_file (not yet implemented)");
91 usize::MAX }
93 SYS_WRITE_FILE => {
94 crate::warn!("[SYS] sys_write_file (not yet implemented)");
97 usize::MAX }
99 _ => {
100 crate::error!(
101 "[SYS] Unknown syscall number {} (x0=0x{:x})",
102 syscall_nr,
103 x0
104 );
105 usize::MAX }
107 }
108}
109
110#[no_mangle]
118pub extern "C" fn rust_data_abort_handler(far: usize, esr: usize) {
119 let dfsc = esr & 0x3F; let wnr = (esr >> 6) & 1; crate::error!("[SYS] === DATA ABORT from EL0 ===");
123 crate::error!("[SYS] FAR_EL1 (fault address): 0x{:016x}", far);
124 crate::error!("[SYS] ESR_EL1: 0x{:08x}", esr);
125 crate::error!(
126 "[SYS] DFSC: 0x{:02x}, WnR: {} ({})",
127 dfsc,
128 wnr,
129 if wnr == 1 { "Write" } else { "Read" }
130 );
131
132 if far >= 0x3C00_0000 {
133 crate::error!("[SYS] -> MMIO region access violation! Killing process.");
134 } else {
135 crate::error!("[SYS] -> Memory access violation! Killing process.");
136 }
137
138 crate::kernel::scheduler::exit();
140}
141
142#[no_mangle]
153pub unsafe extern "C" fn rust_el1_sync_handler(far: usize, esr: usize, tf: *const usize) {
154 let ec = (esr >> 26) & 0x3F;
155 let iss = esr & 0x1FFFFFF;
156
157 crate::println!("==================================================");
158 crate::println!("!!! KERNEL PANIC: EL1 Synchronous Exception !!!");
159 crate::println!("==================================================");
160 crate::println!(" FAR_EL1 (fault address): 0x{:016x}", far);
161 crate::println!(
162 " ESR_EL1 (exception reg): 0x{:08x} (EC: 0x{:02x}, ISS: 0x{:06x})",
163 esr,
164 ec,
165 iss
166 );
167
168 let elr = *tf.add(32);
171 let spsr = *tf.add(33);
172 crate::println!(" ELR_EL1 (Exception PC): 0x{:016x}", elr);
173 crate::println!(" SPSR_EL1 (saved state): 0x{:08x}", spsr);
174
175 crate::println!(" Registers:");
177 for i in 0..16 {
178 let val1 = *tf.add(i);
179 let val2 = *tf.add(i + 16);
180 if i + 16 < 31 {
181 crate::println!(
182 " x{:02}: 0x{:016x} x{:02}: 0x{:016x}",
183 i,
184 val1,
185 i + 16,
186 val2
187 );
188 } else {
189 crate::println!(" x{:02}: 0x{:016x}", i, val1);
190 }
191 }
192
193 loop {
194 unsafe {
195 core::arch::asm!("wfe");
196 }
197 }
198}