void kinitlong(unsigned long pmemsz) { #if (NEWTMR) uint32_t tmrcnt = 0; #endif /* initialise interrupt management */ #if (VBE) trapinitprot(); #endif /* initialise virtual memory */ vminitlong((uint64_t *)kernpagemapl4tab); #if 0 /* FIXME: map possible device memory */ vmmapseg((uint32_t *)&_pagetab, DEVMEMBASE, DEVMEMBASE, 0xffffffffU, PAGEPRES | PAGEWRITE | PAGENOCACHE); #endif // schedinit(); /* zero kernel BSS segment */ kbzero(&_bssvirt, (uint32_t)&_ebssvirt - (uint32_t)&_bssvirt); /* set kernel I/O permission bitmap to all 1-bits */ kmemset(&kerniomap, 0xff, sizeof(kerniomap)); /* INITIALIZE CONSOLES AND SCREEN */ #if (VBE) vbeinitscr(); #endif #if (VBE) && (NEWFONT) consinit(768 / vbefontw, 1024 / vbefonth); #elif (VBE) consinit(768 >> 3, 1024 >> 3); #endif /* TODO: use memory map from GRUB? */ // vminitphys((uintptr_t)&_epagetab, pmemsz); vminitphys((uintptr_t)&_epagetab, pmemsz); meminit(pmemsz); tssinit(0); #if (VBE) && (NEWFONT) // consinit(768 / vbefontw, 1024 / vbefonth); #elif (VBE) consinit(768 >> 3, 1024 >> 3); #endif #if (SMBIOS) smbiosinit(); #endif #if (PS2DRV) ps2init(); #endif #if (VBE) && (PLASMA) plasmaloop(); #endif #if (VBE) vbeprintinfo(); #endif logoprint(); // vminitphys((uintptr_t)&_ebss, pmemsz - (unsigned long)&_ebss); /* HID devices */ #if (PCI) /* initialise PCI bus driver */ pciinit(); #endif #if (ATA) /* initialise ATA driver */ atainit(); #endif #if (SB16) /* initialise Soundblaster 16 driver */ sb16init(); #endif #if (ACPI) /* initialise ACPI subsystem */ acpiinit(); #endif /* initialise block I/O buffer cache */ if (!bufinit()) { kprintf("failed to allocate buffer cache\n"); while (1) { ; } } /* allocate unused device regions (in 3.5G..4G) */ // pageaddzone(DEVMEMBASE, &vmshmq, 0xffffffffU - DEVMEMBASE + 1); #if (SMP) || (APIC) //#if (SMP) /* multiprocessor initialisation */ // mpinit(); //#endif if (mpncpu == 1) { kprintf("found %ld processor\n", mpncpu); } else { kprintf("found %ld processors\n", mpncpu); } #if (HPET) /* initialise high precision event timers */ hpetinit(); #endif #if (NEWTMR) tmrcnt = apicinitcpu(0); #else apicinitcpu(0); #endif #if (IOAPIC) ioapicinit(0); #endif #endif /* SMP || APIC */ #if (SMP) if (mpmultiproc) { mpstart(); } #endif /* CPU interface */ taskinit(); // tssinit(0); // machinit(); /* execution environment */ procinit(PROCKERN); // k_curtask = &k_curproc->task; // sysinit(); kprintf("DMA buffers (%ul x %ul kilobytes) @ 0x%p\n", DMANCHAN, DMACHANBUFSIZE >> 10, DMABUFBASE); kprintf("VM page tables @ 0x%p\n", (unsigned long)&_pagetab); // kprintf("%ld kilobytes physical memory\n", pmemsz >> 10); kprintf("%ld kilobytes kernel memory\n", (uint32_t)&_ebss >> 10); kprintf("%ld kilobytes allocated physical memory (%ld wired, %ld total)\n", (vmpagestat.nwired + vmpagestat.nmapped + vmpagestat.nbuf) << (PAGESIZELOG2 - 10), vmpagestat.nwired << (PAGESIZELOG2 - 10), vmpagestat.nphys << (PAGESIZELOG2 - 10)); k_curcpu = &cputab[0]; cpuinit(k_curcpu); schedinit(); #if (APIC) apicstarttmr(tmrcnt); #else pitinit(); #endif schedloop(); /* NOTREACHED */ }
int main(int argc, char **argv) { int ch, omode = 0, readonly = 0; vlong length = 0; char *end; bufcnt = Bufcount; offset = 0; setbuf(stdin, NULL); progname = *argv; while ((ch = getopt(argc, argv, "b:dsrm:o:l:")) != -1) { switch (ch) { case 'b': bufcnt = atoi(optarg); break; case 'd': #ifdef O_DIRECT omode |= O_DIRECT; #endif break; case 's': omode |= O_SYNC; break; case 'r': readonly = 1; break; case 'm': setmask(optarg); break; case 'o': offset = strtoll(optarg, &end, 0); if (end == optarg || offset < 0) usage(); break; case 'l': length = strtoll(optarg, &end, 0); if (end == optarg || length < 1) usage(); break; case '?': default: usage(); } } argc -= optind; argv += optind; if (argc != 4 || bufcnt <= 0) usage(); omode |= readonly ? O_RDONLY : O_RDWR; bfd = open(argv[3], omode); if (bfd == -1) { perror("open"); exit(1); } shelf = atoi(argv[0]); slot = atoi(argv[1]); setserial(shelf, slot); size = getsize(bfd); size /= 512; if (size <= offset) { if (offset) fprintf(stderr, "Offset %lld too large for %lld-sector export\n", offset, size); else fputs("0-sector file size is too small\n", stderr); exit(1); } size -= offset; if (length) { if (length > size) { fprintf(stderr, "Length %llu too big - exceeds size of file!\n", offset); exit(1); } size = length; } ifname = argv[2]; sfd = dial(ifname, bufcnt); getea(sfd, ifname, mac); printf("pid %ld: e%d.%d, %lld sectors %s\n", (long) getpid(), shelf, slot, size, readonly ? "O_RDONLY" : "O_RDWR"); fflush(stdout); atainit(); aoe(); return 0; }