diff --git a/kernel/src/arch/riscv32/io.rs b/kernel/src/arch/riscv32/io.rs
index b297e9c..04b7822 100644
--- a/kernel/src/arch/riscv32/io.rs
+++ b/kernel/src/arch/riscv32/io.rs
@@ -33,9 +33,11 @@ fn putchar(c: u8) {
 
 pub fn getchar() -> char {
     let c = if cfg!(feature = "board_k210") {
-        unsafe {
-            while RXDATA.read_volatile() & (1 << 31) == 0 {}
-            (RXDATA as *const u8).read_volatile()
+        loop {
+            let rxdata = unsafe { RXDATA.read_volatile() };
+            if rxdata & (1 << 31) == 0 {
+                break rxdata as u8;
+            }
         }
     } else if cfg!(feature = "m_mode") {
         (super::BBL.mcall_console_getchar)() as u8
diff --git a/kernel/src/shell.rs b/kernel/src/shell.rs
index b8443f3..cce3856 100644
--- a/kernel/src/shell.rs
+++ b/kernel/src/shell.rs
@@ -40,7 +40,7 @@ fn get_line() -> String {
     loop {
         let c = get_char();
         match c {
-            '\u{7f}' /* '\b' */ => {
+            '\u{8}' | '\u{7f}' /* '\b' */ => {
                 if s.pop().is_some() {
                     print!("\u{7f}");
                 }