yank out stack overflow checking ugliness

This commit is contained in:
rsc 2007-09-27 20:38:53 +00:00
parent 4f74de0edc
commit c95bde8163
4 changed files with 2 additions and 14 deletions

1
main.c
View file

@ -60,7 +60,6 @@ mpmain(void)
if(cpu() != mp_bcpu()) if(cpu() != mp_bcpu())
lapic_init(cpu()); lapic_init(cpu());
setupsegs(0); setupsegs(0);
asm volatile("movl %0, %%ss" :: "r" (SEG_CPUSTACK << 3));
cpuid(0, 0, 0, 0, 0); // memory barrier cpuid(0, 0, 0, 0, 0); // memory barrier
cpus[cpu()].booted = 1; cpus[cpu()].booted = 1;
popcli(); popcli();

6
proc.c
View file

@ -73,7 +73,7 @@ setupsegs(struct proc *p)
pushcli(); pushcli();
c = &cpus[cpu()]; c = &cpus[cpu()];
c->ts.ss0 = SEG_PROCSTACK << 3; c->ts.ss0 = SEG_KDATA << 3;
if(p) if(p)
c->ts.esp0 = (uint)(p->kstack + KSTACKSIZE); c->ts.esp0 = (uint)(p->kstack + KSTACKSIZE);
else else
@ -84,15 +84,12 @@ setupsegs(struct proc *p)
c->gdt[SEG_KDATA] = SEG(STA_W, 0, 0xffffffff, 0); 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] = SEG16(STS_T32A, (uint)&c->ts, sizeof(c->ts)-1, 0);
c->gdt[SEG_TSS].s = 0; c->gdt[SEG_TSS].s = 0;
c->gdt[SEG_CPUSTACK] = SEG(STA_W|STA_E, 0, (uint)c->stack, 0);
if(p){ if(p){
c->gdt[SEG_UCODE] = SEG(STA_X|STA_R, (uint)p->mem, p->sz-1, DPL_USER); 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_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 { } else {
c->gdt[SEG_UCODE] = SEG_NULL; c->gdt[SEG_UCODE] = SEG_NULL;
c->gdt[SEG_UDATA] = SEG_NULL; c->gdt[SEG_UDATA] = SEG_NULL;
c->gdt[SEG_PROCSTACK] = SEG_NULL;
} }
lgdt(c->gdt, sizeof(c->gdt)); lgdt(c->gdt, sizeof(c->gdt));
@ -143,7 +140,6 @@ copyproc(struct proc *p)
memset(&np->context, 0, sizeof(np->context)); memset(&np->context, 0, sizeof(np->context));
np->context.eip = (uint)forkret; np->context.eip = (uint)forkret;
np->context.esp = (uint)np->tf; np->context.esp = (uint)np->tf;
np->context.ss = SEG_PROCSTACK<<3;
// Clear %eax so that fork system call returns 0 in child. // Clear %eax so that fork system call returns 0 in child.
np->tf->eax = 0; np->tf->eax = 0;

5
proc.h
View file

@ -4,9 +4,7 @@
#define SEG_UCODE 3 #define SEG_UCODE 3
#define SEG_UDATA 4 #define SEG_UDATA 4
#define SEG_TSS 5 // this process's task state #define SEG_TSS 5 // this process's task state
#define SEG_CPUSTACK 6 #define NSEGS 6
#define SEG_PROCSTACK 7
#define NSEGS 8
// Saved registers for kernel context switches. // Saved registers for kernel context switches.
// Don't need to save all the %fs etc. segment registers, // Don't need to save all the %fs etc. segment registers,
@ -24,7 +22,6 @@ struct context {
int esi; int esi;
int edi; int edi;
int ebp; int ebp;
int ss;
}; };
enum proc_state { UNUSED, EMBRYO, SLEEPING, RUNNABLE, RUNNING, ZOMBIE }; enum proc_state { UNUSED, EMBRYO, SLEEPING, RUNNABLE, RUNNING, ZOMBIE };

View file

@ -16,14 +16,10 @@ swtch:
movl %esi, 20(%eax) movl %esi, 20(%eax)
movl %edi, 24(%eax) movl %edi, 24(%eax)
movl %ebp, 28(%eax) movl %ebp, 28(%eax)
movl %ss, %ebx
movl %ebx, 32(%eax)
# Load new registers # Load new registers
movl 4(%esp), %eax # not 8(%esp) - popped return address above movl 4(%esp), %eax # not 8(%esp) - popped return address above
movl 32(%eax), %ebx
movl %ebx, %ss
movl 28(%eax), %ebp movl 28(%eax), %ebp
movl 24(%eax), %edi movl 24(%eax), %edi
movl 20(%eax), %esi movl 20(%eax), %esi