/*------------------------------------------------------------------------ * setsegs - initialize the 386 processor *------------------------------------------------------------------------ */ setsegs() { extern int start, etext; struct sd *psd; unsigned int np, npages; npages = sizmem(); maxaddr = (char *)(npages * NBPG - 1); psd = &gdt_copy[1]; /* kernel code segment */ np = ((int)&etext + NBPG-1) / NBPG; /* # code pages */ psd->sd_lolimit = np; psd->sd_hilimit = np >> 16; psd = &gdt_copy[2]; /* kernel data segment */ psd->sd_lolimit = npages; psd->sd_hilimit = npages >> 16; psd = &gdt_copy[3]; /* kernel stack segment */ psd->sd_lolimit = npages; psd->sd_hilimit = npages >> 16; memcpy(gdt, gdt_copy, sizeof(gdt_copy)); initsp = npages*NBPG - 4; }
/*------------------------------------------------------------------------ * setsegs - initialize the 386 processor *------------------------------------------------------------------------ */ setsegs() { extern int start, etext; struct sd *psd; unsigned int np, npages, lostk, limit; npages = sizmem(); /* maxaddr = (char *)(npages * NBPG - 1); */ //maxaddr = (char *)( 1536 * NBPG - 1); /* 10M size */ /* the top 10M is used for backing store */ // new max address 1024 pages: 0x0400000-1 maxaddr = (char *)( 1024 * 4096 - 1); /* 4M size */ psd = &gdt_copy[1]; /* kernel code segment */ np = ((int)&etext + NBPG-1) / NBPG; /* # code pages */ psd->sd_lolimit = np; psd->sd_hilimit = np >> 16; #if 0 psd = &gdt_copy[2]; /* kernel data segment */ psd->sd_lolimit = npages; psd->sd_hilimit = npages >> 16; psd = &gdt_copy[3]; /* kernel stack segment */ psd->sd_lolimit = npages; psd->sd_hilimit = npages >> 16; #endif psd = &gdt_copy[4]; /* bootp code segment */ psd->sd_lolimit = npages; /* Allows execution of 0x100000 CODE */ psd->sd_hilimit = npages >> 16; /* Set the descriptors for the tasks */ /* Main Xinu task */ psd = &gdt_copy[5]; psd->sd_hibase = ((unsigned int) i386_tasks) >> 24; psd->sd_midbase = (((unsigned int) i386_tasks)>>16) & 0xff; psd->sd_lobase = ((unsigned int) i386_tasks) & 0xffff; /* Page Fault handler task */ psd = &gdt_copy[6]; psd->sd_hibase = ((unsigned int) & i386_tasks[1]) >> 24; psd->sd_midbase = (((unsigned int) & i386_tasks[1]) >> 16) & 0xff; psd->sd_lobase = ((unsigned int) & i386_tasks[1]) & 0xffff; blkcopy(gdt, gdt_copy, sizeof(gdt_copy)); /* initial stack must be in physical memory. */ /* initsp = npages*NBPG - 4; */ initsp = 1024*NBPG - 4; }