/* * Copyright 1993,1994,1995 Emin Gun Sirer * MIPSI - Mips Instruction Set Simulator. */ #define _FILEHDR_H 1 #include #define __mips 1 #define __mips__ 1 #include "MIPS/filehdr.h" #include "MIPS/a.out.h" #include "config.h" #include "main.h" #include "mem.h" /* * format of bootable a.out file headers */ struct execinfo { struct filehdr fh; AOUTHDR ah; }; extern int errno; /* Read a MIPS executable file. Return zero if successful, else non-zero */ extern int readaout(char *filename) { struct execinfo ei; FILE *fd; if((fd = fopen(filename, "r")) == NULL) error(TopLevel,"Cannot open file: %s\n", filename); /* read the fileheader and a.out header in one fell swoop */ if (fread(&ei, 1, sizeof(ei), fd) != sizeof(ei)) { fclose(fd); error(TopLevel, "Bad header\n"); } if((ei.fh.f_magic != MIPSEBMAGIC) && (ei.fh.f_magic != MIPSELMAGIC)) { fclose(fd); error(TopLevel, "File is not a binary executable\n"); } pbreak = ROUND(ei.ah.bss_start + ei.ah.bsize,PGSZ); /* program break */ pstaddress = ei.ah.entry; /* program starting address */ R[REG_GP] = ei.ah.gp_value; #if 0 printf("text_start: 0x%x text_size: 0x%x\n", ei.ah.text_start, ei.ah.tsize); printf("data_start: 0x%x data_size: 0x%x\n", ei.ah.data_start, ei.ah.dsize); printf("bss_start: 0x%x bss_size: 0x%x\n", ei.ah.bss_start, ei.ah.bsize); printf("entry point: 0x%x\n", ei.ah.entry); printf("pbreak: 0x%x\n", pbreak); printf("R[REG_GP]: 0x%x\n", ei.ah.gp_value); #endif make_memory(ei.ah.tsize + 0x4000, pbreak - ei.ah.data_start); /* Read in text section */ fseek(fd, N_TXTOFF(ei.fh, ei.ah), 0); if(fread(mem_address(ei.ah.text_start,C_WRITE), 1, ei.ah.tsize, fd) != ei.ah.tsize) { fclose(fd); error(TopLevel, "Cannot read entire text segment: %s\n", filename); } /* Read in data section */ if(fread(mem_address(ei.ah.data_start,C_WRITE), 1, ei.ah.dsize, fd) != ei.ah.dsize) { fclose(fd); error(TopLevel, "Cannot read entire data segment: %s\n", filename); } /* Zero-initialize the zero-initialized data */ bzero(mem_address(ei.ah.bss_start,C_WRITE), ei.ah.bsize); fclose(fd); return 0; }