Skip to content

Commit b69c4fc

Browse files
committed
fix: for qemu 7.2
Signed-off-by: YdrMaster <ydrml@hotmail.com>
1 parent d80fadf commit b69c4fc

File tree

5 files changed

+24
-17
lines changed

5 files changed

+24
-17
lines changed

README.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -469,22 +469,22 @@ cargo qemu --kernel bench --smp 1
469469
| 栈底(高地址)
470470
| -
471471
| 低权限上下文
472-
| 0 级陷入栈
473-
| 1 级嵌套上下文
474-
| 1 级陷入栈
472+
| `0` 级陷入栈
473+
| `1` 级嵌套上下文
474+
| `1` 级陷入栈
475475
| ……
476-
| n 级嵌套上下文
476+
| `n` 级嵌套上下文
477477

478-
这个线程栈由一次低优先级发生的陷入创建,在栈上压入控制流上下文后开始处理,此时使用的栈空间称为 0 级陷入栈。若处理过程中再次发生陷入,栈指针不动,当前上下文直接压到栈上后开始处理,此时使用的栈空间称为 1 级陷入栈。以此类推,若发生 n 次嵌套陷入后,无法处理,需要挂起等待,则 n 级嵌套处理必须退出,栈顶存放用于恢复 n-1 级陷入处理的 n 级上下文,然后一步恢复另一个线程的最后一个上下文。此时,刚刚创建的那个线程上,共有 n 个内核陷入和一个低权限陷入不能处理,处于挂起状态。只有原来的 n 级陷入处理完成才能依次恢复。
478+
这个线程栈由一次低优先级发生的陷入创建,在栈上压入控制流上下文后开始处理,此时使用的栈空间称为 `0` 级陷入栈。若处理过程中再次发生陷入,栈指针不动,当前上下文直接压到栈上后开始处理,此时使用的栈空间称为 `1` 级陷入栈。以此类推,若发生 `n` 次嵌套陷入后,无法处理,需要挂起等待,则 `n` 级嵌套处理必须退出,栈顶存放用于恢复 `n-1` 级陷入处理的 `n` 级上下文,然后一步恢复另一个线程的最后一个上下文。此时,刚刚创建的那个线程上,共有 `n` 个内核陷入和一个低权限陷入不能处理,处于挂起状态。只有原来的 `n` 级陷入处理完成才能依次恢复。
479479

480-
这种逐级压到同一个栈的方式可以节省栈空间的开销,也会减少同权限陷入不得不换栈导致的缓存失效问题。但也会压住之前到来的陷入无法处理,必须跟着挂起。尤其是新到来的同权限陷入通常和被压住的陷入没什么关系,很可能带来死锁。所以,如果第 n 级上下文无法立即处理,可以选择创建一个挂起状态的新线程,然后恢复处理 n-1 级陷入。只需分配一个新的栈空间,拷贝 n 级陷入栈的数据到新栈上,然后构造一个可恢复这个陷入栈的上下文即可。
480+
这种逐级压到同一个栈的方式可以节省栈空间的开销,也会减少同权限陷入不得不换栈导致的缓存失效问题。但也会压住之前到来的陷入无法处理,必须跟着挂起。尤其是新到来的同权限陷入通常和被压住的陷入没什么关系,很可能带来死锁。所以,如果第 `n` 级上下文无法立即处理,可以选择创建一个挂起状态的新线程,然后恢复处理 `n-1` 级陷入。只需分配一个新的栈空间,拷贝 `n` 级陷入栈的数据到新栈上,然后构造一个可恢复这个陷入栈的上下文即可。
481481

482482
这种从挂起创建的线程栈具有这样的结构:
483483

484484
| 栈底(高地址)
485485
| -
486486
| 无效上下文
487-
| n 级陷入栈
488-
| n+1 级嵌套上下文
487+
| `n` 级陷入栈
488+
| `n+1` 级嵌套上下文
489489

490-
从这个线程恢复时,恢复 n+1 级嵌套上下文将继续执行 n 级陷入栈的处理流程,完成后识别到下一个要恢复的是一个无效的上下文,可以执行一个调度流程,这个栈空间则可回收。
490+
从这个线程恢复时,恢复 `n+1` 级嵌套上下文将继续执行 `n` 级陷入栈的处理流程,完成后识别到下一个要恢复的是一个无效的上下文,可以执行一个调度流程,这个栈空间则可回收。

fast-trap/src/hal/riscv_m.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@ use core::arch::asm;
33

44
macro_rules! exchange {
55
() => {
6-
"csrrw sp, mscratch, sp"
6+
exchange!(sp)
7+
};
8+
9+
($reg:ident) => {
10+
concat!("csrrw ", stringify!($reg), ", mscratch, ", stringify!($reg))
711
};
812
}
913

fast-trap/src/hal/riscv_s.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@ use core::arch::asm;
33

44
macro_rules! exchange {
55
() => {
6-
"csrrw sp, sscratch, sp"
6+
exchange!(sp)
7+
};
8+
9+
($reg:ident) => {
10+
concat!("csrrw ", stringify!($reg), ", sscratch, ", stringify!($reg))
711
};
812
}
913

test-app/src/main.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,10 @@ extern "C" fn rust_main(_hartid: usize, dtb: *const u8) {
7777

7878
if name.starts_with("test") {
7979
unsafe { TEST = parse_address(&name.as_bytes()[5..]) as _ };
80-
} else if name.starts_with("uart") {
80+
} else if name.starts_with("uart") || name.starts_with("serial") {
8181
unsafe {
82-
UART = MaybeUninit::new(MmioSerialPort::new(parse_address(
83-
&name.as_bytes()[5..],
84-
)))
82+
let (_, addr) = name.as_str().unwrap().split_once('@').unwrap();
83+
UART = MaybeUninit::new(MmioSerialPort::new(parse_address(addr.as_bytes())))
8584
};
8685
}
8786
WalkOperation::StepOver

xtask/src/main.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,11 +140,11 @@ impl QemuArgs {
140140
Arch::RISCV64(Mode::Supervisor) => ("riscv64", "-kernel"),
141141
};
142142
Qemu::system(arch)
143-
.args(&["-machine", "virt"])
143+
.args(["-machine", "virt"])
144144
.arg("-nographic")
145145
.arg(mode)
146146
.arg(objcopy(elf, true))
147-
.args(&["-serial", "mon:stdio"])
147+
.args(["-serial", "mon:stdio"])
148148
.optional(&self.gdb, |qemu, gdb| {
149149
qemu.args(["-S", "-gdb", &format!("tcp::{gdb}")]);
150150
})

0 commit comments

Comments
 (0)