Exemplo n.º 1
0
Arquivo: bootmain.c Projeto: i/xv6
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();
}
Exemplo n.º 2
0
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();
}
Exemplo n.º 3
0
// 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();
}
Exemplo n.º 4
0
Arquivo: loader.c Projeto: chaoys/os
/* 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))();
}
Exemplo n.º 5
0
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;
}
Exemplo n.º 6
0
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);
}
Exemplo n.º 7
0
Arquivo: ulib.c Projeto: asegid/cs537
void*
memset(void *dst, int c, uint n)
{
  stosb(dst, c, n);
  return dst;
}