static u64 __devinit add_io_space (struct pci_root_info *info, struct acpi_resource_address64 *addr) { struct resource *resource; char *name; u64 base, min, max, base_port; unsigned int sparse = 0, space_nr, len; resource = kzalloc(sizeof(*resource), GFP_KERNEL); if (!resource) { printk(KERN_ERR "PCI: No memory for %s I/O port space\n", info->name); goto out; } len = strlen(info->name) + 32; name = kzalloc(len, GFP_KERNEL); if (!name) { printk(KERN_ERR "PCI: No memory for %s I/O port space name\n", info->name); goto free_resource; } min = addr->minimum; max = min + addr->address_length - 1; if (addr->info.io.translation_type == ACPI_SPARSE_TRANSLATION) sparse = 1; space_nr = new_space(addr->translation_offset, sparse); if (space_nr == ~0) goto free_name; base = __pa(io_space[space_nr].mmio_base); base_port = IO_SPACE_BASE(space_nr); snprintf(name, len, "%s I/O Ports %08lx-%08lx", info->name, base_port + min, base_port + max); /* * The SDM guarantees the legacy 0-64K space is sparse, but if the * mapping is done by the processor (not the bridge), ACPI may not * mark it as sparse. */ if (space_nr == 0) sparse = 1; resource->name = name; resource->flags = IORESOURCE_MEM; resource->start = base + (sparse ? IO_SPACE_SPARSE_ENCODING(min) : min); resource->end = base + (sparse ? IO_SPACE_SPARSE_ENCODING(max) : max); insert_resource(&iomem_resource, resource); return base_port; free_name: kfree(name); free_resource: kfree(resource); out: return ~0; }
/*======================================================================* loadELFFile *======================================================================*/ void loadELF(){ /* 0x1000存放加载的文件数 * 0x1004开始存放文件名,单个字节的 * 0x50000开始,每0x2000个字节放一个bin文件,bin文件的入口为0x400000(4M) */ int i,startAddr; char filename[12]="a.bin"; u8 data[8192]; FILEINFO file; int totalFileAddr=0x1000; u8 totalFile=read_mem_byte(totalFileAddr); for (i=0,startAddr=0x50000; i<totalFile;i++,startAddr+=0x2000){ memset((void *)0x400000+0x2000*i,0,sizeof(data)); memset(data,0,sizeof(data)); readelf(startAddr); memcpy(data,(void *)0x400000+0x2000*i,sizeof(data)); memcpy(file.name,filename,sizeof(filename)); u8 c=read_mem_byte(0x1004+i); if ('A'<=c && c<='Z') c=c-'A'+'a'; file.name[0]=c; file.size=sizeof(data); file.start_pos=new_space(FILESTOREADDR,file.size); write_fileinfo(file); write_data(file.start_pos,data,sizeof(data)); ++filename[0]; } }