/* return the size or -1 if error */intget_image_size(constchar*filename){intfd,size;fd=open(filename,O_RDONLY|O_BINARY);if(fd<0)return-1;size=lseek(fd,0,SEEK_END);close(fd);returnsize;}/* return the size or -1 if error */intload_image(constchar*filename,uint8_t*addr){intfd,size;fd=open(filename,O_RDONLY|O_BINARY);if(fd<0)return-1;size=lseek(fd,0,SEEK_END);lseek(fd,0,SEEK_SET);if(read(fd,addr,size)!=size){close(fd);return-1;}close(fd);returnsize;}/* A.OUT loader */structexec{uint32_ta_info;/* Use macros N_MAGIC, etc for access */uint32_ta_text;/* length of text, in bytes */uint32_ta_data;/* length of data, in bytes */uint32_ta_bss;/* length of uninitialized data area, in bytes */uint32_ta_syms;/* length of symbol table data in file, in bytes */uint32_ta_entry;/* start address */uint32_ta_trsize;/* length of relocation info for text, in bytes */uint32_ta_drsize;/* length of relocation info for data, in bytes */};#ifdefBSWAP_NEEDEDstaticvoidbswap_ahdr(structexec*e){bswap32s(&e->a_info);bswap32s(&e->a_text);bswap32s(&e->a_data);bswap32s(&e->a_bss);bswap32s(&e->a_syms);bswap32s(&e->a_entry);bswap32s(&e->a_trsize);bswap32s(&e->a_drsize);}#else#definebswap_ahdr(x)do{}while(0)#endif#defineN_MAGIC(exec)((exec).a_info&0xffff)#defineOMAGIC0407#defineNMAGIC0410#defineZMAGIC0413#defineQMAGIC0314#define_N_HDROFF(x)(1024-sizeof(structexec))#defineN_TXTOFF(x)\(N_MAGIC(x)==ZMAGIC?_N_HDROFF((x))+sizeof(structexec):\(N_MAGIC(x)==QMAGIC?0:sizeof(structexec)))#defineN_TXTADDR(x)(N_MAGIC(x)==QMAGIC?TARGET_PAGE_SIZE:0)#defineN_DATOFF(x)(N_TXTOFF(x)+(x).a_text)#define_N_SEGMENT_ROUND(x)(((x)+TARGET_PAGE_SIZE-1)&~(TARGET_PAGE_SIZE-1))#define_N_TXTENDADDR(x)(N_TXTADDR(x)+(x).a_text)#defineN_DATADDR(x)\(N_MAGIC(x)==OMAGIC?(_N_TXTENDADDR(x))\:(_N_SEGMENT_ROUND(_N_TXTENDADDR(x))))intload_aout(constchar*filename,uint8_t*addr){intfd,size,ret;structexece;uint32_tmagic;fd=open(filename,O_RDONLY|O_BINARY);if(fd<0)return-1;size=read(fd,&e,sizeof(e));if(size<0)gotofail;bswap_ahdr(&e);magic=N_MAGIC(e);switch(magic){caseZMAGIC:caseQMAGIC:caseOMAGIC:lseek(fd,N_TXTOFF(e),SEEK_SET);size=read(fd,addr,e.a_text+e.a_data);if(size<0)gotofail;break;caseNMAGIC:lseek(fd,N_TXTOFF(e),SEEK_SET);size=read(fd,addr,e.a_text);if(size<0)gotofail;ret=read(fd,addr+N_DATADDR(e),e.a_data);if(ret<0)gotofail;size+=ret;break;default:gotofail;}close(fd);returnsize;fail:close(fd);return-1;}/* ELF loader */staticvoid*load_at(intfd,intoffset,intsize){void*ptr;if(lseek(fd,offset,SEEK_SET)<0)returnNULL;ptr=qemu_malloc(size);if(!ptr)returnNULL;if(read(fd,ptr,size)!=size){qemu_free(ptr);returnNULL;}returnptr;}#defineELF_CLASSELFCLASS32#include"elf.h"#defineSZ32#defineelf_worduint32_t