Compare commits
	
		
			3 Commits
		
	
	
		
			v2.4.0-rc1
			...
			pull-input
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 562f93754b | ||
|  | e2f6bac301 | ||
| 2a19b229f6 | 
							
								
								
									
										4
									
								
								configure
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								configure
									
									
									
									
										vendored
									
									
								
							| @@ -2183,7 +2183,6 @@ if test "$gnutls_nettle" != "no"; then | ||||
|     if $pkg_config --exists "nettle"; then | ||||
|         nettle_cflags=`$pkg_config --cflags nettle` | ||||
|         nettle_libs=`$pkg_config --libs nettle` | ||||
|         nettle_version=`$pkg_config --modversion nettle` | ||||
|         libs_softmmu="$nettle_libs $libs_softmmu" | ||||
|         libs_tools="$nettle_libs $libs_tools" | ||||
|         QEMU_CFLAGS="$QEMU_CFLAGS $nettle_cflags" | ||||
| @@ -4491,7 +4490,7 @@ echo "GTK support       $gtk" | ||||
| echo "GNUTLS support    $gnutls" | ||||
| echo "GNUTLS hash       $gnutls_hash" | ||||
| echo "GNUTLS gcrypt     $gnutls_gcrypt" | ||||
| echo "GNUTLS nettle     $gnutls_nettle ${gnutls_nettle+($nettle_version)}" | ||||
| echo "GNUTLS nettle     $gnutls_nettle" | ||||
| echo "VTE support       $vte" | ||||
| echo "curses support    $curses" | ||||
| echo "curl support      $curl" | ||||
| @@ -4859,7 +4858,6 @@ if test "$gnutls_gcrypt" = "yes" ; then | ||||
| fi | ||||
| if test "$gnutls_nettle" = "yes" ; then | ||||
|   echo "CONFIG_GNUTLS_NETTLE=y" >> $config_host_mak | ||||
|   echo "CONFIG_NETTLE_VERSION_MAJOR=${nettle_version%%.*}" >> $config_host_mak | ||||
| fi | ||||
| if test "$vte" = "yes" ; then | ||||
|   echo "CONFIG_VTE=y" >> $config_host_mak | ||||
|   | ||||
| @@ -23,51 +23,12 @@ | ||||
| #include <nettle/des.h> | ||||
| #include <nettle/cbc.h> | ||||
|  | ||||
| #if CONFIG_NETTLE_VERSION_MAJOR < 3 | ||||
| typedef nettle_crypt_func nettle_cipher_func; | ||||
|  | ||||
| typedef void *       cipher_ctx_t; | ||||
| typedef unsigned     cipher_length_t; | ||||
| #else | ||||
| typedef const void * cipher_ctx_t; | ||||
| typedef size_t       cipher_length_t; | ||||
| #endif | ||||
|  | ||||
| static nettle_cipher_func aes_encrypt_wrapper; | ||||
| static nettle_cipher_func aes_decrypt_wrapper; | ||||
| static nettle_cipher_func des_encrypt_wrapper; | ||||
| static nettle_cipher_func des_decrypt_wrapper; | ||||
|  | ||||
| static void aes_encrypt_wrapper(cipher_ctx_t ctx, cipher_length_t length, | ||||
|                                 uint8_t *dst, const uint8_t *src) | ||||
| { | ||||
|     aes_encrypt(ctx, length, dst, src); | ||||
| } | ||||
|  | ||||
| static void aes_decrypt_wrapper(cipher_ctx_t ctx, cipher_length_t length, | ||||
|                                 uint8_t *dst, const uint8_t *src) | ||||
| { | ||||
|     aes_encrypt(ctx, length, dst, src); | ||||
| } | ||||
|  | ||||
| static void des_encrypt_wrapper(cipher_ctx_t ctx, cipher_length_t length, | ||||
|                                 uint8_t *dst, const uint8_t *src) | ||||
| { | ||||
|     des_encrypt(ctx, length, dst, src); | ||||
| } | ||||
|  | ||||
| static void des_decrypt_wrapper(cipher_ctx_t ctx, cipher_length_t length, | ||||
|                                 uint8_t *dst, const uint8_t *src) | ||||
| { | ||||
|     des_decrypt(ctx, length, dst, src); | ||||
| } | ||||
|  | ||||
| typedef struct QCryptoCipherNettle QCryptoCipherNettle; | ||||
| struct QCryptoCipherNettle { | ||||
|     void *ctx_encrypt; | ||||
|     void *ctx_decrypt; | ||||
|     nettle_cipher_func *alg_encrypt; | ||||
|     nettle_cipher_func *alg_decrypt; | ||||
|     nettle_crypt_func *alg_encrypt; | ||||
|     nettle_crypt_func *alg_decrypt; | ||||
|     uint8_t *iv; | ||||
|     size_t niv; | ||||
| }; | ||||
| @@ -122,8 +83,8 @@ QCryptoCipher *qcrypto_cipher_new(QCryptoCipherAlgorithm alg, | ||||
|         des_set_key(ctx->ctx_encrypt, rfbkey); | ||||
|         g_free(rfbkey); | ||||
|  | ||||
|         ctx->alg_encrypt = des_encrypt_wrapper; | ||||
|         ctx->alg_decrypt = des_decrypt_wrapper; | ||||
|         ctx->alg_encrypt = (nettle_crypt_func *)des_encrypt; | ||||
|         ctx->alg_decrypt = (nettle_crypt_func *)des_decrypt; | ||||
|  | ||||
|         ctx->niv = DES_BLOCK_SIZE; | ||||
|         break; | ||||
| @@ -137,8 +98,8 @@ QCryptoCipher *qcrypto_cipher_new(QCryptoCipherAlgorithm alg, | ||||
|         aes_set_encrypt_key(ctx->ctx_encrypt, nkey, key); | ||||
|         aes_set_decrypt_key(ctx->ctx_decrypt, nkey, key); | ||||
|  | ||||
|         ctx->alg_encrypt = aes_encrypt_wrapper; | ||||
|         ctx->alg_decrypt = aes_decrypt_wrapper; | ||||
|         ctx->alg_encrypt = (nettle_crypt_func *)aes_encrypt; | ||||
|         ctx->alg_decrypt = (nettle_crypt_func *)aes_decrypt; | ||||
|  | ||||
|         ctx->niv = AES_BLOCK_SIZE; | ||||
|         break; | ||||
|   | ||||
| @@ -144,7 +144,6 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp) | ||||
|         } else { | ||||
|             s->boot_cpu_ptr = &s->apu_cpu[i]; | ||||
|         } | ||||
|         g_free(name); | ||||
|  | ||||
|         object_property_set_int(OBJECT(&s->apu_cpu[i]), GIC_BASE_ADDR, | ||||
|                                 "reset-cbar", &err); | ||||
| @@ -182,7 +181,6 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp) | ||||
|         } else { | ||||
|             s->boot_cpu_ptr = &s->rpu_cpu[i]; | ||||
|         } | ||||
|         g_free(name); | ||||
|  | ||||
|         object_property_set_bool(OBJECT(&s->rpu_cpu[i]), true, "reset-hivecs", | ||||
|                                  &err); | ||||
|   | ||||
| @@ -271,12 +271,6 @@ static void qxl_spice_monitors_config_async(PCIQXLDevice *qxl, int replay) | ||||
|                     QXL_COOKIE_TYPE_POST_LOAD_MONITORS_CONFIG, | ||||
|                     0)); | ||||
|     } else { | ||||
| #if SPICE_SERVER_VERSION >= 0x000c06 /* release 0.12.6 */ | ||||
|         if (qxl->max_outputs) { | ||||
|             spice_qxl_set_monitors_config_limit(&qxl->ssd.qxl, | ||||
|                                                 qxl->max_outputs); | ||||
|         } | ||||
| #endif | ||||
|         qxl->guest_monitors_config = qxl->ram->monitors_config; | ||||
|         spice_qxl_monitors_config_async(&qxl->ssd.qxl, | ||||
|                 qxl->ram->monitors_config, | ||||
| @@ -997,7 +991,6 @@ static int interface_client_monitors_config(QXLInstance *sin, | ||||
|     PCIQXLDevice *qxl = container_of(sin, PCIQXLDevice, ssd.qxl); | ||||
|     QXLRom *rom = memory_region_get_ram_ptr(&qxl->rom_bar); | ||||
|     int i; | ||||
|     unsigned max_outputs = ARRAY_SIZE(rom->client_monitors_config.heads); | ||||
|  | ||||
|     if (qxl->revision < 4) { | ||||
|         trace_qxl_client_monitors_config_unsupported_by_device(qxl->id, | ||||
| @@ -1020,23 +1013,17 @@ static int interface_client_monitors_config(QXLInstance *sin, | ||||
|     if (!monitors_config) { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
| #if SPICE_SERVER_VERSION >= 0x000c06 /* release 0.12.6 */ | ||||
|     /* limit number of outputs based on setting limit */ | ||||
|     if (qxl->max_outputs && qxl->max_outputs <= max_outputs) { | ||||
|         max_outputs = qxl->max_outputs; | ||||
|     } | ||||
| #endif | ||||
|  | ||||
|     memset(&rom->client_monitors_config, 0, | ||||
|            sizeof(rom->client_monitors_config)); | ||||
|     rom->client_monitors_config.count = monitors_config->num_of_monitors; | ||||
|     /* monitors_config->flags ignored */ | ||||
|     if (rom->client_monitors_config.count >= max_outputs) { | ||||
|     if (rom->client_monitors_config.count >= | ||||
|             ARRAY_SIZE(rom->client_monitors_config.heads)) { | ||||
|         trace_qxl_client_monitors_config_capped(qxl->id, | ||||
|                                 monitors_config->num_of_monitors, | ||||
|                                 max_outputs); | ||||
|         rom->client_monitors_config.count = max_outputs; | ||||
|                                 ARRAY_SIZE(rom->client_monitors_config.heads)); | ||||
|         rom->client_monitors_config.count = | ||||
|             ARRAY_SIZE(rom->client_monitors_config.heads); | ||||
|     } | ||||
|     for (i = 0 ; i < rom->client_monitors_config.count ; ++i) { | ||||
|         VDAgentMonConfig *monitor = &monitors_config->monitors[i]; | ||||
| @@ -2287,9 +2274,6 @@ static Property qxl_properties[] = { | ||||
|         DEFINE_PROP_UINT32("vram64_size_mb", PCIQXLDevice, vram_size_mb, -1), | ||||
|         DEFINE_PROP_UINT32("vgamem_mb", PCIQXLDevice, vgamem_size_mb, 16), | ||||
|         DEFINE_PROP_INT32("surfaces", PCIQXLDevice, ssd.num_surfaces, 1024), | ||||
| #if SPICE_SERVER_VERSION >= 0x000c06 /* release 0.12.6 */ | ||||
|         DEFINE_PROP_UINT16("max_outputs", PCIQXLDevice, max_outputs, 0), | ||||
| #endif | ||||
|         DEFINE_PROP_END_OF_LIST(), | ||||
| }; | ||||
|  | ||||
|   | ||||
| @@ -99,9 +99,6 @@ typedef struct PCIQXLDevice { | ||||
|     QXLModes           *modes; | ||||
|     uint32_t           rom_size; | ||||
|     MemoryRegion       rom_bar; | ||||
| #if SPICE_SERVER_VERSION >= 0x000c06 /* release 0.12.6 */ | ||||
|     uint16_t           max_outputs; | ||||
| #endif | ||||
|  | ||||
|     /* vram pci bar */ | ||||
|     uint32_t           vram_size; | ||||
|   | ||||
| @@ -239,7 +239,7 @@ static void hid_keyboard_event(DeviceState *dev, QemuConsole *src, | ||||
|  | ||||
| static void hid_keyboard_process_keycode(HIDState *hs) | ||||
| { | ||||
|     uint8_t hid_code, key; | ||||
|     uint8_t hid_code, index, key; | ||||
|     int i, keycode, slot; | ||||
|  | ||||
|     if (hs->n == 0) { | ||||
| @@ -249,7 +249,8 @@ static void hid_keyboard_process_keycode(HIDState *hs) | ||||
|     keycode = hs->kbd.keycodes[slot]; | ||||
|  | ||||
|     key = keycode & 0x7f; | ||||
|     hid_code = hid_usage_keys[key | ((hs->kbd.modifiers >> 1) & (1 << 7))]; | ||||
|     index = key | ((hs->kbd.modifiers & (1 << 8)) >> 1); | ||||
|     hid_code = hid_usage_keys[index]; | ||||
|     hs->kbd.modifiers &= ~(1 << 8); | ||||
|  | ||||
|     switch (hid_code) { | ||||
| @@ -257,18 +258,41 @@ static void hid_keyboard_process_keycode(HIDState *hs) | ||||
|         return; | ||||
|  | ||||
|     case 0xe0: | ||||
|         assert(key == 0x1d); | ||||
|         if (hs->kbd.modifiers & (1 << 9)) { | ||||
|             hs->kbd.modifiers ^= 3 << 8; | ||||
|             /* The hid_codes for the 0xe1/0x1d scancode sequence are 0xe9/0xe0. | ||||
|              * Here we're processing the second hid_code.  By dropping bit 9 | ||||
|              * and setting bit 8, the scancode after 0x1d will access the | ||||
|              * second half of the table. | ||||
|              */ | ||||
|             hs->kbd.modifiers ^= (1 << 8) | (1 << 9); | ||||
|             return; | ||||
|         } | ||||
|         /* fall through to process Ctrl_L */ | ||||
|     case 0xe1 ... 0xe7: | ||||
|         /* Ctrl_L/Ctrl_R, Shift_L/Shift_R, Alt_L/Alt_R, Win_L/Win_R. | ||||
|          * Handle releases here, or fall through to process presses. | ||||
|          */ | ||||
|         if (keycode & (1 << 7)) { | ||||
|             hs->kbd.modifiers &= ~(1 << (hid_code & 0x0f)); | ||||
|             return; | ||||
|         } | ||||
|     case 0xe8 ... 0xef: | ||||
|         /* fall through */ | ||||
|     case 0xe8 ... 0xe9: | ||||
|         /* USB modifiers are just 1 byte long.  Bits 8 and 9 of | ||||
|          * hs->kbd.modifiers implement a state machine that detects the | ||||
|          * 0xe0 and 0xe1/0x1d sequences.  These bits do not follow the | ||||
|          * usual rules where bit 7 marks released keys; they are cleared | ||||
|          * elsewhere in the function as the state machine dictates. | ||||
|          */ | ||||
|         hs->kbd.modifiers |= 1 << (hid_code & 0x0f); | ||||
|         return; | ||||
|  | ||||
|     case 0xea ... 0xef: | ||||
|         abort(); | ||||
|  | ||||
|     default: | ||||
|         break; | ||||
|     } | ||||
|  | ||||
|     if (keycode & (1 << 7)) { | ||||
|   | ||||
| @@ -308,6 +308,7 @@ static void virtio_input_hid_handle_status(VirtIOInput *vinput, | ||||
| static Property virtio_input_hid_properties[] = { | ||||
|     DEFINE_PROP_STRING("display", VirtIOInputHID, display), | ||||
|     DEFINE_PROP_UINT32("head", VirtIOInputHID, head, 0), | ||||
|     DEFINE_PROP_END_OF_LIST(), | ||||
| }; | ||||
|  | ||||
| static void virtio_input_hid_class_init(ObjectClass *klass, void *data) | ||||
|   | ||||
| @@ -11,6 +11,7 @@ | ||||
| #include "hw/virtio/virtio.h" | ||||
| #include "hw/virtio/virtio-input.h" | ||||
|  | ||||
| #include <sys/ioctl.h> | ||||
| #include "standard-headers/linux/input.h" | ||||
|  | ||||
| /* ----------------------------------------------------------------- */ | ||||
|   | ||||
| @@ -422,7 +422,6 @@ static void realize(DeviceState *d, Error **errp) | ||||
|         error_free(err); | ||||
|         object_unref(OBJECT(drc)); | ||||
|     } | ||||
|     g_free(child_name); | ||||
|     DPRINTFN("drc realize complete"); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -10,7 +10,6 @@ | ||||
|  | ||||
|  | ||||
| #include <sys/time.h> | ||||
| #include <sys/ioctl.h> | ||||
| #include <sys/types.h> | ||||
| #include "standard-headers/linux/types.h" | ||||
|  | ||||
|   | ||||
							
								
								
									
										44
									
								
								memory.c
									
									
									
									
									
								
							
							
						
						
									
										44
									
								
								memory.c
									
									
									
									
									
								
							| @@ -1887,16 +1887,23 @@ static FlatRange *flatview_lookup(FlatView *view, AddrRange addr) | ||||
|                    sizeof(FlatRange), cmp_flatrange_addr); | ||||
| } | ||||
|  | ||||
| bool memory_region_present(MemoryRegion *container, hwaddr addr) | ||||
| { | ||||
|     MemoryRegion *mr = memory_region_find(container, addr, 1).mr; | ||||
|     if (!mr || (mr == container)) { | ||||
|         return false; | ||||
|     } | ||||
|     memory_region_unref(mr); | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| bool memory_region_is_mapped(MemoryRegion *mr) | ||||
| { | ||||
|     return mr->container ? true : false; | ||||
| } | ||||
|  | ||||
| /* Same as memory_region_find, but it does not add a reference to the | ||||
|  * returned region.  It must be called from an RCU critical section. | ||||
|  */ | ||||
| static MemoryRegionSection memory_region_find_rcu(MemoryRegion *mr, | ||||
|                                                   hwaddr addr, uint64_t size) | ||||
| MemoryRegionSection memory_region_find(MemoryRegion *mr, | ||||
|                                        hwaddr addr, uint64_t size) | ||||
| { | ||||
|     MemoryRegionSection ret = { .mr = NULL }; | ||||
|     MemoryRegion *root; | ||||
| @@ -1917,10 +1924,11 @@ static MemoryRegionSection memory_region_find_rcu(MemoryRegion *mr, | ||||
|     } | ||||
|     range = addrrange_make(int128_make64(addr), int128_make64(size)); | ||||
|  | ||||
|     rcu_read_lock(); | ||||
|     view = atomic_rcu_read(&as->current_map); | ||||
|     fr = flatview_lookup(view, range); | ||||
|     if (!fr) { | ||||
|         return ret; | ||||
|         goto out; | ||||
|     } | ||||
|  | ||||
|     while (fr > view->ranges && addrrange_intersects(fr[-1].addr, range)) { | ||||
| @@ -1936,32 +1944,12 @@ static MemoryRegionSection memory_region_find_rcu(MemoryRegion *mr, | ||||
|     ret.size = range.size; | ||||
|     ret.offset_within_address_space = int128_get64(range.start); | ||||
|     ret.readonly = fr->readonly; | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| MemoryRegionSection memory_region_find(MemoryRegion *mr, | ||||
|                                        hwaddr addr, uint64_t size) | ||||
| { | ||||
|     MemoryRegionSection ret; | ||||
|     rcu_read_lock(); | ||||
|     ret = memory_region_find_rcu(mr, addr, size); | ||||
|     if (ret.mr) { | ||||
|         memory_region_ref(ret.mr); | ||||
|     } | ||||
|     memory_region_ref(ret.mr); | ||||
| out: | ||||
|     rcu_read_unlock(); | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| bool memory_region_present(MemoryRegion *container, hwaddr addr) | ||||
| { | ||||
|     MemoryRegion *mr; | ||||
|  | ||||
|     rcu_read_lock(); | ||||
|     mr = memory_region_find_rcu(container, addr, 1).mr; | ||||
|     rcu_read_unlock(); | ||||
|     return mr && mr != container; | ||||
| } | ||||
|  | ||||
| void address_space_sync_dirty_bitmap(AddressSpace *as) | ||||
| { | ||||
|     FlatView *view; | ||||
|   | ||||
| @@ -2997,7 +2997,7 @@ static int qemu_rdma_registration_handle(QEMUFile *f, void *opaque) | ||||
|                              (unsigned int)comp->block_idx, | ||||
|                              rdma->local_ram_blocks.nb_blocks); | ||||
|                 ret = -EIO; | ||||
|                 goto out; | ||||
|                 break; | ||||
|             } | ||||
|             block = &(rdma->local_ram_blocks.block[comp->block_idx]); | ||||
|  | ||||
| @@ -3092,7 +3092,7 @@ static int qemu_rdma_registration_handle(QEMUFile *f, void *opaque) | ||||
|                                  (unsigned int)reg->current_index, | ||||
|                                  rdma->local_ram_blocks.nb_blocks); | ||||
|                     ret = -ENOENT; | ||||
|                     goto out; | ||||
|                     break; | ||||
|                 } | ||||
|                 block = &(rdma->local_ram_blocks.block[reg->current_index]); | ||||
|                 if (block->is_ram_block) { | ||||
| @@ -3102,7 +3102,7 @@ static int qemu_rdma_registration_handle(QEMUFile *f, void *opaque) | ||||
|                             block->block_name, block->offset, | ||||
|                             reg->key.current_addr); | ||||
|                         ret = -ERANGE; | ||||
|                         goto out; | ||||
|                         break; | ||||
|                     } | ||||
|                     host_addr = (block->local_host_addr + | ||||
|                                 (reg->key.current_addr - block->offset)); | ||||
| @@ -3118,7 +3118,7 @@ static int qemu_rdma_registration_handle(QEMUFile *f, void *opaque) | ||||
|                             " chunk: %" PRIx64, | ||||
|                             block->block_name, reg->key.chunk); | ||||
|                         ret = -ERANGE; | ||||
|                         goto out; | ||||
|                         break; | ||||
|                     } | ||||
|                 } | ||||
|                 chunk_start = ram_chunk_start(block, chunk); | ||||
|   | ||||
| @@ -56,6 +56,7 @@ cp_virtio() { | ||||
|                 -e 's/__bitwise__//' \ | ||||
|                 -e 's/__attribute__((packed))/QEMU_PACKED/' \ | ||||
|                 -e 's/__inline__/inline/' \ | ||||
|                 -e '/sys\/ioctl.h/d' \ | ||||
|                 "$f" > "$to/$header"; | ||||
|         done | ||||
|     fi | ||||
|   | ||||
| @@ -235,9 +235,10 @@ int kvm_mips_set_ipi_interrupt(MIPSCPU *cpu, int irq, int level) | ||||
| static inline int kvm_mips_put_one_reg(CPUState *cs, uint64_t reg_id, | ||||
|                                        int32_t *addr) | ||||
| { | ||||
|     uint64_t val64 = *addr; | ||||
|     struct kvm_one_reg cp0reg = { | ||||
|         .id = reg_id, | ||||
|         .addr = (uintptr_t)addr | ||||
|         .addr = (uintptr_t)&val64 | ||||
|     }; | ||||
|  | ||||
|     return kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &cp0reg); | ||||
| @@ -269,12 +270,18 @@ static inline int kvm_mips_put_one_reg64(CPUState *cs, uint64_t reg_id, | ||||
| static inline int kvm_mips_get_one_reg(CPUState *cs, uint64_t reg_id, | ||||
|                                        int32_t *addr) | ||||
| { | ||||
|     int ret; | ||||
|     uint64_t val64 = 0; | ||||
|     struct kvm_one_reg cp0reg = { | ||||
|         .id = reg_id, | ||||
|         .addr = (uintptr_t)addr | ||||
|         .addr = (uintptr_t)&val64 | ||||
|     }; | ||||
|  | ||||
|     return kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &cp0reg); | ||||
|     ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &cp0reg); | ||||
|     if (ret >= 0) { | ||||
|         *addr = val64; | ||||
|     } | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| static inline int kvm_mips_get_one_ulreg(CPUState *cs, uint64 reg_id, | ||||
| @@ -628,12 +635,12 @@ int kvm_arch_put_registers(CPUState *cs, int level) | ||||
|  | ||||
|     /* Set the registers based on QEMU's view of things */ | ||||
|     for (i = 0; i < 32; i++) { | ||||
|         regs.gpr[i] = (int64_t)(target_long)env->active_tc.gpr[i]; | ||||
|         regs.gpr[i] = env->active_tc.gpr[i]; | ||||
|     } | ||||
|  | ||||
|     regs.hi = (int64_t)(target_long)env->active_tc.HI[0]; | ||||
|     regs.lo = (int64_t)(target_long)env->active_tc.LO[0]; | ||||
|     regs.pc = (int64_t)(target_long)env->active_tc.PC; | ||||
|     regs.hi = env->active_tc.HI[0]; | ||||
|     regs.lo = env->active_tc.LO[0]; | ||||
|     regs.pc = env->active_tc.PC; | ||||
|  | ||||
|     ret = kvm_vcpu_ioctl(cs, KVM_SET_REGS, ®s); | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user