Skip to content

Commit

Permalink
overkill: use segments to catch stack overflow (delete before next year)
Browse files Browse the repository at this point in the history
  • Loading branch information
rsc committed Sep 27, 2007
1 parent 8c8b748 commit 39c3fb1
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 2 deletions.
6 changes: 5 additions & 1 deletion proc.c
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ setupsegs(struct proc *p)

splhi();
c = &cpus[cpu()];
c->ts.ss0 = SEG_KDATA << 3;
c->ts.ss0 = SEG_PROCSTACK << 3;
if(p)
c->ts.esp0 = (uint)(p->kstack + KSTACKSIZE);
else
Expand All @@ -84,12 +84,15 @@ setupsegs(struct proc *p)
c->gdt[SEG_KDATA] = SEG(STA_W, 0, 0xffffffff, 0);
c->gdt[SEG_TSS] = SEG16(STS_T32A, (uint)&c->ts, sizeof(c->ts)-1, 0);
c->gdt[SEG_TSS].s = 0;
c->gdt[SEG_CPUSTACK] = SEG(STA_W|STA_E, 0, (uint)c->stack, 0);
if(p){
c->gdt[SEG_UCODE] = SEG(STA_X|STA_R, (uint)p->mem, p->sz-1, DPL_USER);
c->gdt[SEG_UDATA] = SEG(STA_W, (uint)p->mem, p->sz-1, DPL_USER);
c->gdt[SEG_PROCSTACK] = SEG(STA_W|STA_E, 0, (uint)p->kstack, 0);
} else {
c->gdt[SEG_UCODE] = SEG_NULL;
c->gdt[SEG_UDATA] = SEG_NULL;
c->gdt[SEG_PROCSTACK] = SEG_NULL;
}

lgdt(c->gdt, sizeof(c->gdt));
Expand Down Expand Up @@ -140,6 +143,7 @@ copyproc(struct proc *p)
memset(&np->context, 0, sizeof(np->context));
np->context.eip = (uint)forkret;
np->context.esp = (uint)np->tf;
np->context.ss = SEG_PROCSTACK<<3;

// Clear %eax so that fork system call returns 0 in child.
np->tf->eax = 0;
Expand Down
5 changes: 4 additions & 1 deletion proc.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
#define SEG_UCODE 3
#define SEG_UDATA 4
#define SEG_TSS 5 // this process's task state
#define NSEGS 6
#define SEG_CPUSTACK 6
#define SEG_PROCSTACK 7
#define NSEGS 8

// Saved registers for kernel context switches.
// Don't need to save all the %fs etc. segment registers,
Expand All @@ -22,6 +24,7 @@ struct context {
int esi;
int edi;
int ebp;
int ss;
};

enum proc_state { UNUSED, EMBRYO, SLEEPING, RUNNABLE, RUNNING, ZOMBIE };
Expand Down
4 changes: 4 additions & 0 deletions swtch.S
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,14 @@ swtch:
movl %esi, 20(%eax)
movl %edi, 24(%eax)
movl %ebp, 28(%eax)
movl %ss, %ebx
movl %ebx, 32(%eax)

# Load new registers
movl 4(%esp), %eax # not 8(%esp) - popped return address above

movl 32(%eax), %ebx
movl %ebx, %ss
movl 28(%eax), %ebp
movl 24(%eax), %edi
movl 20(%eax), %esi
Expand Down

0 comments on commit 39c3fb1

Please sign in to comment.