Patchwork [RFC,qom-cpu,33/41] cpu: Turn cpu_get_phys_page_debug() into a CPUClass hook

login
register
mail settings
Submitter Andreas Färber
Date July 6, 2013, 8:19 p.m.
Message ID <51D87BC6.2090600@suse.de>
Download mbox | patch
Permalink /patch/257300/
State New
Headers show

Comments

Andreas Färber - July 6, 2013, 8:19 p.m.
Am 29.06.2013 22:01, schrieb Andreas Färber:
> Since all targets now assign a softmmu-only field, we can drop helpers
> cpu_class_set_{do_unassigned_access,vmsd}() and device_class_set_vmsd().
> 
> Prepares for changing cpu_memory_rw_debug() argument to CPUState.
> 
> Signed-off-by: Andreas Färber <afaerber@suse.de>

The following fixup for xtensa is required. This demonstrates how
dangerous it is to pass void* arguments directly into functions - please
always use a typed local variable to enforce type checks.

Andreas
Max Filippov - July 6, 2013, 10:42 p.m.
On Sun, Jul 7, 2013 at 12:19 AM, Andreas Färber <afaerber@suse.de> wrote:
> Am 29.06.2013 22:01, schrieb Andreas Färber:
>> Since all targets now assign a softmmu-only field, we can drop helpers
>> cpu_class_set_{do_unassigned_access,vmsd}() and device_class_set_vmsd().
>>
>> Prepares for changing cpu_memory_rw_debug() argument to CPUState.
>>
>> Signed-off-by: Andreas Färber <afaerber@suse.de>
>
> The following fixup for xtensa is required. This demonstrates how
> dangerous it is to pass void* arguments directly into functions - please
> always use a typed local variable to enforce type checks.

With this fix it works, so for xtensa part
Acked-by: Max Filippov <jcmvbkbc@gmail.com>

My question about having configuration pointer cached in the env
still remains though.

Patch

diff --git a/hw/xtensa/xtensa_lx60.c b/hw/xtensa/xtensa_lx60.c
index 650dd31..a079774 100644
--- a/hw/xtensa/xtensa_lx60.c
+++ b/hw/xtensa/xtensa_lx60.c
@@ -144,9 +144,11 @@  static void lx60_net_init(MemoryRegion *address_space,
     memory_region_add_subregion(address_space, buffers, ram);
 }

-static uint64_t translate_phys_addr(void *env, uint64_t addr)
+static uint64_t translate_phys_addr(void *opaque, uint64_t addr)
 {
-    return cpu_get_phys_page_debug(env, addr);
+    XtensaCPU *cpu = opaque;
+
+    return cpu_get_phys_page_debug(CPU(cpu), addr);
 }

 static void lx60_reset(void *opaque)
@@ -252,7 +254,7 @@  static void lx_init(const LxBoardDesc *board,
QEMUMachineInitArgs *args)
         }
         uint64_t elf_entry;
         uint64_t elf_lowaddr;
-        int success = load_elf(kernel_filename, translate_phys_addr, env,
+        int success = load_elf(kernel_filename, translate_phys_addr, cpu,
                 &elf_entry, &elf_lowaddr, NULL, be, ELF_MACHINE, 0);
         if (success > 0) {
             env->pc = elf_entry;
diff --git a/hw/xtensa/xtensa_sim.c b/hw/xtensa/xtensa_sim.c
index 5241f8d..a4194cfb 100644
--- a/hw/xtensa/xtensa_sim.c
+++ b/hw/xtensa/xtensa_sim.c
@@ -32,9 +32,11 @@ 
 #include "exec/memory.h"
 #include "exec/address-spaces.h"

-static uint64_t translate_phys_addr(void *env, uint64_t addr)
+static uint64_t translate_phys_addr(void *opaque, uint64_t addr)
 {
-    return cpu_get_phys_page_debug(env, addr);
+    XtensaCPU *cpu = opaque;
+
+    return cpu_get_phys_page_debug(CPU(cpu), addr);
 }

 static void sim_reset(void *opaque)
@@ -88,10 +90,10 @@  static void xtensa_sim_init(QEMUMachineInitArgs *args)
         uint64_t elf_entry;
         uint64_t elf_lowaddr;
 #ifdef TARGET_WORDS_BIGENDIAN
-        int success = load_elf(kernel_filename, translate_phys_addr, env,
+        int success = load_elf(kernel_filename, translate_phys_addr, cpu,
                 &elf_entry, &elf_lowaddr, NULL, 1, ELF_MACHINE, 0);
 #else
-        int success = load_elf(kernel_filename, translate_phys_addr, env,
+        int success = load_elf(kernel_filename, translate_phys_addr, cpu,
                 &elf_entry, &elf_lowaddr, NULL, 0, ELF_MACHINE, 0);
 #endif
         if (success > 0) {