예제 #1
0
파일: pci.c 프로젝트: hugh-smtl/linux-2.6
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;
}
예제 #2
0
파일: main.c 프로젝트: mengpq/os
/*======================================================================*
                         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];
	}
}