All pastes #1514907 Raw Edit

richard

public text v1 · immutable
#1514907 ·published 2009-08-01 15:52 UTC
rendered paste body
#include "elf.h"#include "elf_struct.h"#include "tty.h"#include "task.h"static void print(const char*msg,u32 val) {	con->putval(msg,val);}static void print(const char*msg,void* val) {	con->putval(msg,val);}static void print(const char*msg) {	con->print(msg);}void printProgramHeader(Elf32_Ehdr*header,Elf32_Phdr* ph,Task*t) {// 	Elf32_Word    p_type;                 /* Segment type */	if(ph->p_type==PT_LOAD) {		print("LOAD\n");	} else {		print("Not a loadable section - not bothering.\n");		return;	}// 	print("p_type:",ph->p_type);	print("p_offset:",ph->p_offset);// 	print("p_vaddr:",ph->p_vaddr);// 	print("p_paddr:",ph->p_paddr);// 	print("p_filesz:",ph->p_filesz);// 	print("p_memsz:",ph->p_memsz);// 	print("p_flags:",ph->p_flags);// 	print("p_align:",ph->p_align);	// map the pages it needs.	for(u32 start_map=ph->p_vaddr;start_map<=ph->p_vaddr+ph->p_memsz;start_map+=0x1000) {		t->page_dir.map_anon(start_map,1,1);// 		con->putval("Mapping page at ",start_map);	}	print("header:",header);	print("offset:",ph->p_offset);	void* src=reinterpret_cast<void*>(ph->p_offset+(u32)header);	void* dest=reinterpret_cast<void*>(ph->p_vaddr);	print("Copying from ",src); 	print("To ",dest);// 	print("Size:",ph->p_memsz);	memcpy(dest,src,ph->p_filesz);	if(ph->p_filesz<ph->p_memsz) {		print("Memsize doesn't match filesize, zeroing the rest.\n");		memset((void*)((u32)dest+ph->p_filesz),0,ph->p_memsz-ph->p_filesz);	}// 	print("\nBINDUMP:\n");// 	UNUSED u8* temp=(u8*)src;// 	for(u32 i=0;i<ph->p_memsz/2;++i) {// 		con->puthexbyte(temp[i]);// 	}// 	print("\n");// 	PANIC("TEST");// 	print("DONE!");//   Elf32_Off     p_offset;               /* Segment file offset *///   Elf32_Addr    p_vaddr;                /* Segment virtual address *///   Elf32_Addr    p_paddr;                /* Segment physical address *///   Elf32_Word    p_filesz;               /* Segment size in file *///   Elf32_Word    p_memsz;                /* Segment size in memory *///   Elf32_Word    p_flags;                /* Segment flags *///   Elf32_Word    p_align;}#include "interrupts.h"void finish_off(Elf32_Ehdr*head,Task* t) {	t->regs.eip=head->e_entry;	t->page_dir.map_anon(0xA0000000,1,1);	t->regs.useresp=0xA0000FFC;	t->regs.ebp=0xA0000FFC;// 	IRQHandler::dump_registers(t->regs);	t->page_dir.switch_to_this();// 	regs.print();}void printSectionHeader(Elf32_Shdr* sh) {// 	 sh_name;                /* Section name (string tbl index) */	print("sh_name:",sh->sh_name);	print("sh_type:",sh->sh_type);	print("sh_flags:",sh->sh_flags);	print("sh_addr:",sh->sh_addr);	print("sh_offset:",sh->sh_offset);	print("sh_size:",sh->sh_size);	print("sh_link:",sh->sh_link);	print("sh_info:",sh->sh_info);	print("sh_addralign:",sh->sh_addralign);	print("sh_entsize:",sh->sh_entsize);//       sh_type;                /* Section type *///   Elf32_Word    sh_flags;               /* Section flags *///   Elf32_Addr    sh_addr;                /* Section virtual addr at execution *///   Elf32_Off     sh_offset;              /* Section file offset *///   Elf32_Word    sh_size;                /* Section size in bytes *///   Elf32_Word    sh_link;                /* Link to another section *///   Elf32_Word    sh_info;                /* Additional section information *///   Elf32_Word    sh_addralign;           /* Section alignment *///   Elf32_Word    sh_entsize;}void parseElf(u32 start,Task *t) {// 	 unsigned char e_ident[EI_NIDENT];     /* Magic number and other info *///   Elf64_Half    e_type;                 /* Object file type *///   Elf64_Half    e_machine;              /* Architecture *///   Elf64_Word    e_version;              /* Object file version *///   Elf64_Addr    e_entry;                /* Entry point virtual address *///   Elf64_Off     e_phoff;                /* Program header table file offset *///   Elf64_Off     e_shoff;                /* Section header table file offset *///   Elf64_Word    e_flags;                /* Processor-specific flags *///   Elf64_Half    e_ehsize;               /* ELF header size in bytes *///   Elf64_Half    e_phentsize;            /* Program header table entry size *///   Elf64_Half    e_phnum;                /* Program header table entry count *///   Elf64_Half    e_shentsize;            /* Section header table entry size *///   Elf64_Half    e_shnum;                /* Section header table entry count *///   Elf64_Half    e_shstrndx;             /* Section header string table index */	Elf32_Ehdr* header=reinterpret_cast<Elf32_Ehdr*>(start);	print("Entry point:",header->e_entry);	Elf32_Phdr* pheader=reinterpret_cast<Elf32_Phdr*>(start+header->e_phoff);// 	Elf32_Shdr* sheader=reinterpret_cast<Elf32_Shdr*>(start+header->e_shoff);// 	con->putval("Section header offset:",sheader);// 	con->putval("Program header offset:",pheader);// 	print("pheader count:",header->e_phnum);// 	print("pheader size:",header->e_phentsize);// 	print("sizeof(Phdr):",sizeof(Elf32_Phdr));	//printSectionHeader(sheader);	for(int i=0;i<header->e_phnum;++i) {// 		print("Program header ",i);	printProgramHeader(header,pheader+i,t);	}	finish_off(header,t);}