From 490f91ab53e22d90afb1ee37d5148e341ccf538e Mon Sep 17 00:00:00 2001 From: Robert Morris Date: Fri, 28 Aug 2020 05:51:48 -0400 Subject: [PATCH] move panicked check to uart.c --- kernel/console.c | 13 ------------- kernel/printf.c | 2 +- kernel/uart.c | 13 +++++++++++++ user/grind.c | 20 ++++++++++++++++++-- 4 files changed, 32 insertions(+), 16 deletions(-) diff --git a/kernel/console.c b/kernel/console.c index 1885593..d606ed2 100644 --- a/kernel/console.c +++ b/kernel/console.c @@ -33,13 +33,6 @@ void consputc(int c) { - extern volatile int panicked; // from printf.c - - if(panicked){ - for(;;) - ; - } - if(c == BACKSPACE){ // if the user typed backspace, overwrite with a space. uartputc_sync('\b'); uartputc_sync(' '); uartputc_sync('\b'); @@ -66,12 +59,6 @@ int consolewrite(int user_src, uint64 src, int n) { int i; - extern volatile int panicked; // from printf.c - - if(panicked){ - for(;;) - ; - } acquire(&cons.lock); for(i = 0; i < n; i++){ diff --git a/kernel/printf.c b/kernel/printf.c index 1a83284..e1347de 100644 --- a/kernel/printf.c +++ b/kernel/printf.c @@ -121,7 +121,7 @@ panic(char *s) printf("panic: "); printf(s); printf("\n"); - panicked = 1; // freeze output from other CPUs + panicked = 1; // freeze uart output from other CPUs for(;;) ; } diff --git a/kernel/uart.c b/kernel/uart.c index daf9f04..ce89615 100644 --- a/kernel/uart.c +++ b/kernel/uart.c @@ -45,6 +45,8 @@ char uart_tx_buf[UART_TX_BUF_SIZE]; int uart_tx_w; // write next to uart_tx_buf[uart_tx_w++] int uart_tx_r; // read next from uart_tx_buf[uar_tx_r++] +extern volatile int panicked; // from printf.c + void uartstart(); void @@ -85,6 +87,12 @@ void uartputc(int c) { acquire(&uart_tx_lock); + + if(panicked){ + for(;;) + ; + } + while(1){ if(((uart_tx_w + 1) % UART_TX_BUF_SIZE) == uart_tx_r){ // buffer is full. @@ -109,6 +117,11 @@ uartputc_sync(int c) { push_off(); + if(panicked){ + for(;;) + ; + } + // wait for Transmit Holding Empty to be set in LSR. while((ReadReg(LSR) & LSR_TX_IDLE) == 0) ; diff --git a/user/grind.c b/user/grind.c index 14e2aae..d11b20b 100644 --- a/user/grind.c +++ b/user/grind.c @@ -292,8 +292,8 @@ go(int which_child) } } -int -main() +void +iter() { unlink("a"); unlink("b"); @@ -331,3 +331,19 @@ main() exit(0); } + +int +main() +{ + while(1){ + int pid = fork(); + if(pid == 0){ + iter(); + exit(0); + } + if(pid > 0){ + wait(0); + } + sleep(20); + } +}