@@ -42,7 +42,6 @@ struct emul_cnx {
42
42
struct vie vie ;
43
43
struct vm_guest_paging paging ;
44
44
struct vcpu * vcpu ;
45
- struct mem_io * mmio ;
46
45
};
47
46
48
47
static DEFINE_CPU_DATA (struct emul_cnx , g_inst_ctxt ) ;
@@ -334,38 +333,20 @@ static void get_guest_paging_info(struct vcpu *vcpu, struct emul_cnx *emul_cnx)
334
333
static int mmio_read (struct vcpu * vcpu , __unused uint64_t gpa , uint64_t * rval ,
335
334
__unused int size , __unused void * arg )
336
335
{
337
- struct emul_cnx * emul_cnx ;
338
- struct mem_io * mmio ;
339
-
340
336
if (!vcpu )
341
337
return - EINVAL ;
342
338
343
- emul_cnx = & per_cpu (g_inst_ctxt , vcpu -> pcpu_id );
344
- mmio = emul_cnx -> mmio ;
345
-
346
- ASSERT (mmio != NULL , "invalid mmio when reading" );
347
-
348
- * rval = mmio -> value ;
349
-
339
+ * rval = vcpu -> mmio .value ;
350
340
return 0 ;
351
341
}
352
342
353
343
static int mmio_write (struct vcpu * vcpu , __unused uint64_t gpa , uint64_t wval ,
354
344
__unused int size , __unused void * arg )
355
345
{
356
- struct emul_cnx * emul_cnx ;
357
- struct mem_io * mmio ;
358
-
359
346
if (!vcpu )
360
347
return - EINVAL ;
361
348
362
- emul_cnx = & per_cpu (g_inst_ctxt , vcpu -> pcpu_id );
363
- mmio = emul_cnx -> mmio ;
364
-
365
- ASSERT (mmio != NULL , "invalid mmio when writing" );
366
-
367
- mmio -> value = wval ;
368
-
349
+ vcpu -> mmio .value = wval ;
369
350
return 0 ;
370
351
}
371
352
@@ -398,7 +379,6 @@ uint8_t decode_instruction(struct vcpu *vcpu)
398
379
399
380
guest_rip_hva = GPA2HVA (vcpu -> vm , guest_rip_gpa );
400
381
emul_cnx = & per_cpu (g_inst_ctxt , vcpu -> pcpu_id );
401
- emul_cnx -> mmio = & vcpu -> mmio ;
402
382
emul_cnx -> vcpu = vcpu ;
403
383
404
384
/* by now, HVA <-> HPA is 1:1 mapping, so use hpa is OK*/
@@ -409,8 +389,6 @@ uint8_t decode_instruction(struct vcpu *vcpu)
409
389
csar = exec_vmread (VMX_GUEST_CS_ATTR );
410
390
cpu_mode = get_vmx_cpu_mode ();
411
391
412
- vcpu -> mmio .private_data = emul_cnx ;
413
-
414
392
retval = __decode_instruction (vcpu , guest_rip_gva ,
415
393
cpu_mode , SEG_DESC_DEF32 (csar ), & emul_cnx -> vie );
416
394
@@ -423,32 +401,20 @@ uint8_t decode_instruction(struct vcpu *vcpu)
423
401
return emul_cnx -> vie .opsize ;
424
402
}
425
403
426
- int emulate_instruction (struct vcpu * vcpu , struct mem_io * mmio )
404
+ int emulate_instruction (struct vcpu * vcpu )
427
405
{
428
- struct emul_cnx * emul_cnx = ( struct emul_cnx * )( mmio -> private_data ) ;
429
- struct vm_guest_paging * paging = & emul_cnx -> paging ;
430
- int i , retval = 0 ;
431
- uint64_t gpa = mmio -> paddr ;
406
+ struct emul_cnx * emul_cnx ;
407
+ struct vm_guest_paging * paging ;
408
+ int retval = 0 ;
409
+ uint64_t gpa = vcpu -> mmio . paddr ;
432
410
mem_region_read_t mread = mmio_read ;
433
411
mem_region_write_t mwrite = mmio_write ;
434
412
413
+ emul_cnx = & per_cpu (g_inst_ctxt , vcpu -> pcpu_id );
414
+ paging = & emul_cnx -> paging ;
415
+
435
416
retval = vmm_emulate_instruction (vcpu , gpa ,
436
417
& emul_cnx -> vie , paging , mread , mwrite , & retval );
437
418
438
- if (retval != 0 ) {
439
- /* dump to instruction when emulation failed */
440
- pr_err ("emulate following instruction failed @ 0x%016llx:" ,
441
- exec_vmread (VMX_GUEST_RIP ));
442
- for (i = 0 ; i < emul_cnx -> vie .num_valid ; i ++ ) {
443
- if (i >= VIE_INST_SIZE )
444
- break ;
445
-
446
- if (i == 0 )
447
- pr_err ("\n" );
448
-
449
- pr_err ("%d=%02hhx " ,
450
- i , emul_cnx -> vie .inst [i ]);
451
- }
452
- }
453
419
return retval ;
454
420
}
0 commit comments