void bootmain(void) { struct elfhdr *elf; struct proghdr *ph, *eph; void (*entry)(void); uchar* pa; elf = (struct elfhdr*)0x10000; // scratch space // Read 1st page off disk readseg((uchar*)elf, 4096, 0); // Is this an ELF executable? if(elf->magic != ELF_MAGIC) return; // let bootasm.S handle error // Load each program segment (ignores ph flags). ph = (struct proghdr*)((uchar*)elf + elf->phoff); eph = ph + elf->phnum; for(; ph < eph; ph++){ pa = (uchar*)ph->paddr; readseg(pa, ph->filesz, ph->off); if(ph->memsz > ph->filesz) stosb(pa + ph->filesz, 0, ph->memsz - ph->filesz); } // Call the entry point from the ELF header. // Does not return! entry = (void(*)(void))(elf->entry); entry(); }
void masterboot(void) { struct elfhdr *elf; struct proghdr *ph, *eph; void (*entry)(void); uint8_t* pa; elf = (struct elfhdr*) 0x10000; // scratch space // Read first page off disk read_segment((uint8_t*) elf, PAGESIZE, 0); // Is this a valid ELF? if (elf->magic != ELF_MAGIC) return; // Load each program segment (ignores ph flags) ph = (struct proghdr *) ((uint8_t*) elf + elf->phoff); eph = ph + elf->phnum; for (; ph < eph; ph++) { pa = (uint8_t*) ph->paddr; read_segment(pa, ph->filesz, ph->off); if (ph->memsz > ph->filesz) stosb(pa + ph->filesz, 0, ph->memsz - ph->filesz); } // Call the entry point from the ELF header entry = (void(*)(void))(elf->entry); entry(); }
// koffset is the first byte of the kernel on disk void stage2main(ulong koffset) { ElfHeader *elf; ElfProgHeader *ph, *eph; void (*entry)(void); uchar *pa; cclear(); has_ahci = ahcidetect(); elf = (ElfHeader *)0x10000; readbytes((uchar *)elf, PGSIZE, koffset); if (elf->magic != ELF_MAGIC) panic("stage2main - elf magic"); ph = (ElfProgHeader *)((char *)elf + elf->phoff); eph = ph + elf->phnum; for (; ph < eph; ph++) { pa = (uchar *)ph->paddr; readbytes(pa, ph->filesz, koffset + ph->offset); if (ph->memsz > ph->filesz) stosb(pa + ph->filesz, 0, ph->memsz - ph->filesz); } entry = (void(*)(void))elf->entry; entry(); }
/* never return */ void bootmain(void) { struct elfhdr *eh; struct proghdr *ph, *eph; u8 *pa; eh = (struct elfhdr *)0x10000; readseg((u8 *)eh, 4096, 0); /* FIXME! ELF64 sanity check */ ph = (struct proghdr *)((u8 *)eh + eh->phoff); eph = ph + eh->phnum; for (; ph < eph; ph++) { pa = (u8 *)ph->paddr; readseg(pa, ph->filesz, ph->offset); if (ph->memsz > ph->filesz) { stosb(pa + ph->filesz, 0, ph->memsz - ph->filesz); } } ((void(*)(void))(eh->entry))(); }
void* memset(void *dst, int c, uint n) { if ((int)dst%4 == 0 && n%4 == 0){ c &= 0xFF; stosl(dst, (c<<24)|(c<<16)|(c<<8)|c, n/4); } else stosb(dst, c, n); return dst; }
void * memset(void *b, int c, size_t len) { if (c == 0) { memzero(b, len); } else { #ifdef C_MEMCPY char *bb; for (bb = b; len--; ) *bb++ = c; #else if (len) { stosb(b, c, len); } #endif } return (b); }
void* memset(void *dst, int c, uint n) { stosb(dst, c, n); return dst; }