summaryrefslogtreecommitdiff
path: root/target-ia64
diff options
context:
space:
mode:
authorJes Sorensen <jes@sgi.com>2009-05-01 12:30:55 +0200
committerAvi Kivity <avi@redhat.com>2009-05-04 11:16:48 +0300
commite895900ee7275bbae76261c5a922e180e5f4d246 (patch)
tree361e0f9b2605126618a45b60242e2ecda394465d /target-ia64
parent0925f805e8b73d31bb2d9fc6a28c6e892fea5b66 (diff)
Remove the dependency for phys_ram_base for ipf.c
Fix ia64 code to use copy_physical_memory_{read,write} in hob and nvram code, removing dependencies of qemu_get_ram_ptr() usage. This results in cleaned up APIs and removal of unnecessary global variables. Signed-off-by: Jes Sorensen <jes@sgi.com> Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'target-ia64')
-rw-r--r--target-ia64/firmware.c73
-rw-r--r--target-ia64/firmware.h6
2 files changed, 46 insertions, 33 deletions
diff --git a/target-ia64/firmware.c b/target-ia64/firmware.c
index ba16bd888..79f846421 100644
--- a/target-ia64/firmware.c
+++ b/target-ia64/firmware.c
@@ -91,12 +91,11 @@ static int add_nvram_hob(void *hob_buf, unsigned long nvram_addr);
static int build_hob(void *hob_buf, unsigned long hob_buf_size,
unsigned long dom_mem_size, unsigned long vcpus,
unsigned long nvram_addr);
-static int load_hob(void *hob_buf,
- unsigned long dom_mem_size, void *hob_start);
+static int load_hob(void *hob_buf, unsigned long dom_mem_size);
int
kvm_ia64_build_hob(unsigned long memsize, unsigned long vcpus,
- void* fw_start, unsigned long nvram_addr)
+ unsigned long nvram_addr)
{
char *hob_buf;
@@ -111,7 +110,8 @@ kvm_ia64_build_hob(unsigned long memsize, unsigned long vcpus,
Hob_Output("Could not build hob");
return -1;
}
- if (load_hob(hob_buf, memsize, fw_start + HOB_OFFSET) < 0) {
+
+ if (load_hob(hob_buf, memsize) < 0) {
free(hob_buf);
Hob_Output("Could not load hob");
return -1;
@@ -249,7 +249,7 @@ err_out:
return -1;
}
static int
-load_hob(void *hob_buf, unsigned long dom_mem_size, void *hob_start)
+load_hob(void *hob_buf, unsigned long dom_mem_size)
{
int hob_size;
@@ -263,7 +263,9 @@ load_hob(void *hob_buf, unsigned long dom_mem_size, void *hob_start)
Hob_Output("No enough memory for hob data");
return -1;
}
- memcpy ((void *)hob_start, hob_buf, hob_size);
+
+ cpu_physical_memory_write(GFW_HOB_START, hob_buf, hob_size);
+
return 0;
}
@@ -643,50 +645,63 @@ out:
}
int
-kvm_ia64_copy_from_nvram_to_GFW(unsigned long nvram_fd,
- const void* fw_start)
+kvm_ia64_copy_from_nvram_to_GFW(unsigned long nvram_fd)
{
struct stat file_stat;
+ uint8_t *nvram_buf;
+ int r = 0;
+
+ nvram_buf = malloc(NVRAM_SIZE);
+
if ((fstat(nvram_fd, &file_stat) < 0) ||
(NVRAM_SIZE != file_stat.st_size) ||
- (read(nvram_fd, (void *)(fw_start + NVRAM_OFFSET),
- NVRAM_SIZE) != NVRAM_SIZE))
- return -1;
- return 0;
+ (read(nvram_fd, nvram_buf, NVRAM_SIZE) != NVRAM_SIZE)) {
+ r = -1;
+ goto out;
+ }
+
+ cpu_physical_memory_write(NVRAM_START, nvram_buf, NVRAM_SIZE);
+
+ out:
+ free(nvram_buf);
+ return r;
}
int
kvm_ia64_copy_from_GFW_to_nvram()
{
+ struct nvram_save_addr nvram_addr_buf;
+ uint8_t *nvram_buf;
unsigned long nvram_fd;
- void* real_nvram_start;
- target_phys_addr_t nvram_size = NVRAM_SIZE;
unsigned long type = WRITE_TO_NVRAM;
- unsigned long *nvram_addr = (unsigned long *)(gfw_start + NVRAM_OFFSET);
+ int ret = -1;
+ nvram_buf = malloc(NVRAM_SIZE);
+ if (!nvram_buf)
+ goto out_free;
+ cpu_physical_memory_read(NVRAM_START, (uint8_t *)&nvram_addr_buf,
+ sizeof(struct nvram_save_addr));
+ if (nvram_addr_buf.signature != NVRAM_VALID_SIG) {
+ goto out_free;
+ }
+
+ cpu_physical_memory_read(nvram_addr_buf.addr, nvram_buf, NVRAM_SIZE);
nvram_fd = kvm_ia64_nvram_init(type);
if (nvram_fd == -1)
goto out;
- if (((struct nvram_save_addr *)nvram_addr)->signature != NVRAM_VALID_SIG) {
- close(nvram_fd);
- goto out;
- }
- lseek(nvram_fd, 0, SEEK_SET);
- real_nvram_start = cpu_physical_memory_map(((struct nvram_save_addr*)nvram_addr)->addr,
- &nvram_size, 1);
- if (write(nvram_fd, real_nvram_start, NVRAM_SIZE) != NVRAM_SIZE) {
- close(nvram_fd);
+ lseek(nvram_fd, 0, SEEK_SET);
+ if (write(nvram_fd, nvram_buf, NVRAM_SIZE) != NVRAM_SIZE)
goto out;
- }
- cpu_physical_memory_unmap(real_nvram_start, NVRAM_SIZE, 1, NVRAM_SIZE);
+ ret = 0;
+ out:
close(nvram_fd);
- return 0;
-out:
- return -1;
+ out_free:
+ free(nvram_buf);
+ return ret;
}
/*
diff --git a/target-ia64/firmware.h b/target-ia64/firmware.h
index 132c119ff..a47db671d 100644
--- a/target-ia64/firmware.h
+++ b/target-ia64/firmware.h
@@ -52,13 +52,11 @@ struct nvram_save_addr {
};
extern const char *nvram;
-extern void *gfw_start;
extern int kvm_ia64_build_hob(unsigned long memsize, unsigned long vcpus,
- void* fw_start, unsigned long nvram_addr);
+ unsigned long nvram_addr);
extern uint8_t *read_image(const char *filename, unsigned long *size);
extern int kvm_ia64_copy_from_GFW_to_nvram(void);
extern int kvm_ia64_nvram_init(unsigned long type);
-extern int kvm_ia64_copy_from_nvram_to_GFW(unsigned long nvram_fd,
- const void* fw_start);
+extern int kvm_ia64_copy_from_nvram_to_GFW(unsigned long nvram_fd);
#endif //__FIRM_WARE_