diff options
| author | Robert Morris <rtm@csail.mit.edu> | 2020-08-28 05:51:48 -0400 | 
|---|---|---|
| committer | Frans Kaashoek <kaashoek@mit.edu> | 2020-08-28 09:00:41 -0400 | 
| commit | 490f91ab53e22d90afb1ee37d5148e341ccf538e (patch) | |
| tree | 68ce72ea0b6bbb8c375e2506d9d6618f1ba8fd08 | |
| parent | 748809e1b36cd08b21ddfdf79486787cc5c85453 (diff) | |
| download | xv6-labs-490f91ab53e22d90afb1ee37d5148e341ccf538e.tar.gz xv6-labs-490f91ab53e22d90afb1ee37d5148e341ccf538e.tar.bz2 xv6-labs-490f91ab53e22d90afb1ee37d5148e341ccf538e.zip | |
move panicked check to uart.c
| -rw-r--r-- | kernel/console.c | 13 | ||||
| -rw-r--r-- | kernel/printf.c | 2 | ||||
| -rw-r--r-- | kernel/uart.c | 13 | ||||
| -rw-r--r-- | 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); +  } +} | 
