/* * Copyright 1993,1994,1995 Emin Gun Sirer * MIPSI - Mips Instruction Set Simulator. */ #define _FILEHDR_H 1 #include #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); fseek(fd, N_TXTOFF(ei.fh, ei.ah), 0); { char *tseg,*dseg,*bseg; /* Read the text segment */ tseg = (char *) malloc (ei.ah.tsize); if(fread(tseg, 1, ei.ah.tsize, fd) != ei.ah.tsize) { fclose(fd); error(TopLevel, "Cannot read entire text segment: %s\n", filename); } copy_from_buffer(tseg,ei.ah.text_start,ei.ah.tsize); free(tseg); /* Read the initialized data segment */ dseg = (char *) malloc (ei.ah.dsize); if(fread(dseg, 1, ei.ah.dsize, fd) != ei.ah.dsize) { fclose(fd); error(TopLevel, "Cannot read entire data segment: %s\n", filename); } copy_from_buffer(dseg,ei.ah.data_start,ei.ah.dsize); free(dseg); /* Now create some zero initialized memory */ bseg = (char *) malloc (ei.ah.bsize); bzero(bseg, ei.ah.bsize); copy_from_buffer(bseg,ei.ah.bss_start,ei.ah.bsize); free(bseg); } fclose(fd); return 0; }