summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrans Kaashoek <[email protected]>2016-09-02 08:36:14 -0400
committerFrans Kaashoek <[email protected]>2016-09-02 08:36:14 -0400
commitb8fd4cba1367656b464a8ac303e4141107712c39 (patch)
tree79c9cc8d58978ccf4184da731728002e1bec0361
parentae15515d80559ff95b315e3342c3baa00b87be1c (diff)
parentbc8221a59c083811ee2d8c49c0342ea59caa6d51 (diff)
downloadxv6-labs-b8fd4cba1367656b464a8ac303e4141107712c39.tar.gz
xv6-labs-b8fd4cba1367656b464a8ac303e4141107712c39.tar.bz2
xv6-labs-b8fd4cba1367656b464a8ac303e4141107712c39.zip
Merge branch 'master' of g.csail.mit.edu:xv6-dev
-rw-r--r--proc.c7
-rw-r--r--spinlock.c3
-rw-r--r--vm.c2
3 files changed, 9 insertions, 3 deletions
diff --git a/proc.c b/proc.c
index 751d886..9e95529 100644
--- a/proc.c
+++ b/proc.c
@@ -302,7 +302,12 @@ scheduler(void)
}
// Enter scheduler. Must hold only ptable.lock
-// and have changed proc->state.
+// and have changed proc->state. Saves and restores
+// intena because intena is a property of this
+// kernel thread, not this CPU. It should
+// be proc->intena and proc->ncli, but that would
+// break in the few places where a lock is held but
+// there's no process.
void
sched(void)
{
diff --git a/spinlock.c b/spinlock.c
index a5f0b21..bf863ef 100644
--- a/spinlock.c
+++ b/spinlock.c
@@ -102,8 +102,9 @@ pushcli(void)
eflags = readeflags();
cli();
- if(cpu->ncli++ == 0)
+ if(cpu->ncli == 0)
cpu->intena = eflags & FL_IF;
+ cpu->ncli += 1;
}
void
diff --git a/vm.c b/vm.c
index c8b8d35..d9aaa7e 100644
--- a/vm.c
+++ b/vm.c
@@ -27,7 +27,7 @@ seginit(void)
c->gdt[SEG_UCODE] = SEG(STA_X|STA_R, 0, 0xffffffff, DPL_USER);
c->gdt[SEG_UDATA] = SEG(STA_W, 0, 0xffffffff, DPL_USER);
- // Map cpu and curproc -- these are private per cpu.
+ // Map cpu and proc -- these are private per cpu.
c->gdt[SEG_KCPU] = SEG(STA_W, &c->cpu, 8, 0);
lgdt(c->gdt, sizeof(c->gdt));