Skip to content

Commit a4d43a5

Browse files
committed
feat: 增加 legacy 实现
实现 legacy console putchar 和 legacy console get char Signed-off-by: YdrMaster <[email protected]>
1 parent 38b9783 commit a4d43a5

File tree

1 file changed

+46
-18
lines changed

1 file changed

+46
-18
lines changed

rustsbi-qemu/src/main.rs

Lines changed: 46 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -233,32 +233,60 @@ extern "C" fn fast_handler(
233233
match cause.cause() {
234234
// SBI call
235235
T::Exception(E::SupervisorEnvCall) => {
236-
use sbi_spec::hsm;
237-
let ret = unsafe { SBI.assume_init_mut() }.handle_ecall(
236+
use sbi_spec::{base, hsm, legacy};
237+
let mut ret = unsafe { SBI.assume_init_mut() }.handle_ecall(
238238
a7,
239239
a6,
240240
[ctx.a0(), a1, a2, a3, a4, a5],
241241
);
242-
if ret.is_ok() && a7 == hsm::EID_HSM {
243-
// 关闭
244-
if a6 == hsm::HART_STOP {
245-
local_hsm().stop();
246-
mie::write(mie::MSIE);
247-
trap_vec::load(false);
248-
ctx.regs().pc = _stop as _;
249-
return ctx.call(0);
242+
if ret.is_ok() {
243+
match a7 {
244+
hsm::EID_HSM => {
245+
// 关闭
246+
if a6 == hsm::HART_STOP {
247+
local_hsm().stop();
248+
mie::write(mie::MSIE);
249+
trap_vec::load(false);
250+
ctx.regs().pc = _stop as _;
251+
return ctx.call(0);
252+
}
253+
// 不可恢复挂起
254+
if a6 == hsm::HART_SUSPEND
255+
&& ctx.a0() == hsm::HART_SUSPEND_TYPE_NON_RETENTIVE as usize
256+
{
257+
trap_vec::load(false);
258+
ctx.regs().pc = _stop as _;
259+
return ctx.call(0);
260+
}
261+
}
262+
base::EID_BASE => {
263+
if a6 == base::PROBE_EXTENSION {
264+
if matches!(
265+
ctx.a0(),
266+
legacy::LEGACY_CONSOLE_PUTCHAR | legacy::LEGACY_CONSOLE_GETCHAR
267+
) {
268+
ret.value = 1;
269+
}
270+
}
271+
}
272+
_ => {}
250273
}
251-
// 不可恢复挂起
252-
if a6 == hsm::HART_SUSPEND
253-
&& ctx.a0() == hsm::HART_SUSPEND_TYPE_NON_RETENTIVE as usize
254-
{
255-
trap_vec::load(false);
256-
ctx.regs().pc = _stop as _;
257-
return ctx.call(0);
274+
} else {
275+
match a7 {
276+
legacy::LEGACY_CONSOLE_PUTCHAR => {
277+
print!("{}", ctx.a0() as u8 as char);
278+
ret.error = 0;
279+
ret.value = a1;
280+
}
281+
legacy::LEGACY_CONSOLE_GETCHAR => {
282+
ret.error = unsafe { UART.lock().assume_init_mut() }.receive() as _;
283+
ret.value = a1;
284+
}
285+
_ => {}
258286
}
259287
}
260-
mepc::next();
261288
ctx.regs().a = [ret.error, ret.value, a2, a3, a4, a5, a6, a7];
289+
mepc::next();
262290
ctx.restore()
263291
}
264292
// 其他陷入

0 commit comments

Comments
 (0)