HAX: Apply HAX patch from intel
authorsyeon.hwang <syeon.hwang@samsung.com>
Mon, 29 Oct 2012 10:39:12 +0000 (19:39 +0900)
committersyeon.hwang <syeon.hwang@samsung.com>
Mon, 29 Oct 2012 10:39:12 +0000 (19:39 +0900)
configure
cpu-exec.c
target-i386/hax-all.c
target-i386/hax-darwin.c
target-i386/hax-i386.h
target-i386/hax-windows.c
tizen/src/Makefile.tizen.arm
tizen/src/hw/maru_camera_win32_pci.c

index 10221ce33a823d2a0bd44aa7df9153468b7d9223..8ac06fee29735e853abfbc19603e6e984506adc6 100755 (executable)
--- a/configure
+++ b/configure
@@ -3691,6 +3691,8 @@ fi
 if test "$hax" = "yes" ; then
   if test "$mingw32" = "yes" ; then
     echo "CONFIG_HAX_BACKEND=y" >> $config_host_mak
+  elif test "$darwin" = "yes" ; then
+    echo "CONFIG_HAX_BACKEND=y" >> $config_host_mak
   else
     hax="no"
   fi
index d7bcde0734d36692dd15d41cdc7feba2749000ff..0a0858279da5c7b3431ce209738d03d1cb25e079 100644 (file)
@@ -324,16 +324,21 @@ int cpu_exec(CPUArchState *env)
                             cpu_loop_exit(env);
                     } else if (interrupt_request & CPU_INTERRUPT_SIPI) {
                             do_cpu_sipi(x86_env_get_cpu(env));
+
                     } else if (env->hflags2 & HF2_GIF_MASK) {
                         if ((interrupt_request & CPU_INTERRUPT_SMI) &&
                             !(env->hflags & HF_SMM_MASK)) {
                             cpu_svm_check_intercept_param(env, SVM_EXIT_SMI,
                                                           0);
                             env->interrupt_request &= ~CPU_INTERRUPT_SMI;
+#ifdef CONFIG_HAX
+                           if (hax_enabled())
+                               env->hax_vcpu->resync = 1;
+#endif
                             do_smm_enter(env);
                             next_tb = 0;
                         } else if ((interrupt_request & CPU_INTERRUPT_NMI) &&
-                                   !(env->hflags2 & HF2_NMI_MASK)) {
+                                  !(env->hflags2 & HF2_NMI_MASK)) {
                             env->interrupt_request &= ~CPU_INTERRUPT_NMI;
                             env->hflags2 |= HF2_NMI_MASK;
                             do_interrupt_x86_hardirq(env, EXCP02_NMI, 1);
index 844926e10b33c3c6a9eb308bc7aa127b78427c05..a60065f185db50a3dcd8a9f5a3601eeb85c1b29e 100644 (file)
@@ -54,15 +54,20 @@ static int hax_prepare_emulation(CPUArchState *env)
  */
 static int hax_stop_tbloop(CPUArchState *env)
 {
-    switch (env->hax_vcpu->emulation_state)
-    {
-        case HAX_EMULATE_STATE_MMIO:
-            return 1;
-            break;
-        case HAX_EMULATE_STATE_INITIAL:
+       switch (env->hax_vcpu->emulation_state)
+       {
+       case HAX_EMULATE_STATE_MMIO:
+               if (env->hax_vcpu->resync) {
+                       hax_prepare_emulation(env);     
+                       env->hax_vcpu->resync = 0;
+                       return 0;
+               }
+               return 1;
+               break;
+       case HAX_EMULATE_STATE_INITIAL:
         case HAX_EMULATE_STATE_REAL:
-            if (!hax_vcpu_emulation_mode(env))
-                return 1;
+               if (!hax_vcpu_emulation_mode(env))
+                       return 1;
             break;
         default:
             dprint("Invalid emulation state in hax_sto_tbloop state %x\n",
@@ -377,10 +382,25 @@ static void hax_log_stop(MemoryListener *listener,
 {
 }
 
+static void hax_begin(MemoryListener *listener)
+{
+}
+
+static void hax_commit(MemoryListener *listener)
+{
+}
+
+static void hax_region_nop(MemoryListener *listener,
+                       MemoryRegionSection *section)
+{
+}
 
 static MemoryListener hax_memory_listener = {
+    .begin = hax_begin,
+    .commit = hax_commit,
     .region_add = hax_region_add,
     .region_del = hax_region_del,
+    .region_nop = hax_region_nop,
     .log_start = hax_log_start,
     .log_stop = hax_log_stop,
     .log_sync = hax_log_sync,
index c083034ac6d47b565a39628d4170d33125ca9d50..b3127f661978d25f7c4b3d4acc5d7886e6f295a6 100644 (file)
@@ -52,16 +52,18 @@ int hax_populate_ram(uint64_t va, uint32_t size)
     return 0;
 }
 
-int hax_set_phys_mem(target_phys_addr_t start_addr, ram_addr_t size, ram_addr_t phys_offset)
+int hax_set_phys_mem(MemoryRegionSection *section)
 {
-    struct hax_set_ram_info info, *pinfo = &info;
+    struct hax_set_ram_info info, *pinfo = &info;      
+    MemoryRegionSection *mr = section->mr;
+    target_phys_addr_t start_addr = section->offset_within_address_space;
+    ram_addr_t size = section->size;
     int ret;
-    ram_addr_t flags = phys_offset & ~TARGET_PAGE_MASK;
-
-    /* We only care for the  RAM and ROM */
-    if (flags >= IO_MEM_UNASSIGNED)
-        return 0;
 
+       /*We only care for the RAM and ROM*/
+    if(!memory_region_is_ram(mr))
+       return 0;
+       
     if ( (start_addr & ~TARGET_PAGE_MASK) || (size & ~TARGET_PAGE_MASK))
     {
         dprint("set_phys_mem %x %lx requires page aligned addr and size\n", start_addr, size);
@@ -71,8 +73,8 @@ int hax_set_phys_mem(target_phys_addr_t start_addr, ram_addr_t size, ram_addr_t
 
     info.pa_start = start_addr;
     info.size = size;
-    info.va = (uint64_t)qemu_get_ram_ptr(phys_offset);
-    info.flags = (flags & IO_MEM_ROM) ? 1 : 0;
+    info.va = (uint64_t)(memory_region_get_ram_ptr(mr) + section->offset_within_region);
+    info.flags = memory_region_is_rom(mr) ? 1 : 0;
 
     ret = ioctl(hax_global.vm->fd, HAX_VM_IOCTL_SET_RAM, pinfo);
     if (ret < 0)
@@ -80,9 +82,13 @@ int hax_set_phys_mem(target_phys_addr_t start_addr, ram_addr_t size, ram_addr_t
         dprint("has set phys mem failed\n");
         exit(1);
     }
+
     return ret;
+
 }
 
+
+
 int hax_capability(struct hax_state *hax, struct hax_capabilityinfo *cap)
 {
     int ret;
@@ -244,7 +250,7 @@ int hax_vcpu_run(struct hax_vcpu_state* vcpu)
     return ret;
 }
 
-int hax_sync_fpu(CPUState *env, struct fx_layout *fl, int set)
+int hax_sync_fpu(CPUArchState *env, struct fx_layout *fl, int set)
 {
     int ret, fd;
 
@@ -259,7 +265,7 @@ int hax_sync_fpu(CPUState *env, struct fx_layout *fl, int set)
     return ret;
 }
 
-int hax_sync_msr(CPUState *env, struct hax_msr_data *msrs, int set)
+int hax_sync_msr(CPUArchState *env, struct hax_msr_data *msrs, int set)
 {
     int ret, fd;
 
@@ -273,7 +279,7 @@ int hax_sync_msr(CPUState *env, struct hax_msr_data *msrs, int set)
     return ret;
 }
 
-int hax_sync_vcpu_state(CPUState *env, struct vcpu_state_t *state, int set)
+int hax_sync_vcpu_state(CPUArchState *env, struct vcpu_state_t *state, int set)
 {
     int ret, fd;
 
@@ -288,7 +294,7 @@ int hax_sync_vcpu_state(CPUState *env, struct vcpu_state_t *state, int set)
     return ret;
 }
 
-int hax_inject_interrupt(CPUState *env, int vector)
+int hax_inject_interrupt(CPUArchState *env, int vector)
 {
     int ret, fd;
 
index 9fa93c0c55cb79b4bf038fa398cbb6567f79ce2a..29415652fd6e65205a8d466f1ea5652a0021a0df 100644 (file)
@@ -17,6 +17,7 @@ struct hax_vcpu_state
 {
     hax_fd fd;
     int vcpu_id;
+    int resync;
     int emulation_state;
     struct hax_tunnel *tunnel;
     unsigned char *iobuf;
index a4ff52d0aa6019093b127ed10cf308c2c7321498..c510cac2144080519aa9e060a6954c9b66fd4393 100644 (file)
@@ -110,7 +110,8 @@ int hax_set_phys_mem(MemoryRegionSection *section)
 
     info.pa_start = start_addr;
     info.size = size;
-    info.va = (uint64_t)memory_region_get_ram_ptr(mr);
+    info.va = (uint64_t)(memory_region_get_ram_ptr(mr) + 
+               section->offset_within_region);
     info.flags = memory_region_is_rom(mr) ? 1 : 0;
 
     hDeviceVM = hax_global.vm->fd;
index c5c01727fac79419b197f9a476fb40f986dd3d23..e93bd3aa8e84345bf49834d257f44fe97e969222 100755 (executable)
@@ -2,6 +2,10 @@
 # for TIZEN-maru board
 
 obj-y += maru_arm_soc.o
+
+ifndef  CONFIG_DARWIN
 obj-y += maru_arm_board.o
+endif
+
 obj-y += maru_arm_vpci.o
-obj-y += maru_arm_pmu.o
\ No newline at end of file
+obj-y += maru_arm_pmu.o
index 14f0c203e1f626ea8be35bc9d60044bcedcac525..bd972170884b8d48df199d1629c20d1474e35ccc 100644 (file)
@@ -1506,6 +1506,7 @@ static STDMETHODIMP SetFormat(uint32_t dwWidth, uint32_t dwHeight,
                     {\r
                         /* use minimum FPS(maximum frameinterval)\r
                            with non-VT system  */\r
+#ifdef CONFIG_HAX\r
                        if (!hax_enabled()) {\r
                             pvi->AvgTimePerFrame =\r
                                     (REFERENCE_TIME)scc.MaxFrameInterval;\r
@@ -1513,6 +1514,10 @@ static STDMETHODIMP SetFormat(uint32_t dwWidth, uint32_t dwHeight,
                             pvi->AvgTimePerFrame =\r
                                 (REFERENCE_TIME)MARUCAM_DEFAULT_FRAMEINTERVAL;\r
                         }\r
+#else\r
+                            pvi->AvgTimePerFrame =\r
+                                    (REFERENCE_TIME)scc.MaxFrameInterval;\r
+#endif\r
                         hr = pSConfig->lpVtbl->SetFormat(pSConfig, pmtConfig);\r
                         DeleteMediaType(pmtConfig);\r
                         break;\r