summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Morris <[email protected]>2020-08-28 05:51:48 -0400
committerRobert Morris <[email protected]>2020-08-28 05:51:48 -0400
commitffb2ee074a42ed30a87fd6804682fa62eca13500 (patch)
tree68ce72ea0b6bbb8c375e2506d9d6618f1ba8fd08
parentdb067d24da0b6472afe9ce4165e0868772b11964 (diff)
downloadxv6-labs-ffb2ee074a42ed30a87fd6804682fa62eca13500.tar.gz
xv6-labs-ffb2ee074a42ed30a87fd6804682fa62eca13500.tar.bz2
xv6-labs-ffb2ee074a42ed30a87fd6804682fa62eca13500.zip
move panicked check to uart.c
-rw-r--r--kernel/console.c13
-rw-r--r--kernel/printf.c2
-rw-r--r--kernel/uart.c13
-rw-r--r--user/grind.c20
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);
+ }
+}