@ -87,45 +87,16 @@ void hvf_unprotect_dirty_range(hwaddr addr, size_t size)
HV_MEMORY_READ | HV_MEMORY_WRITE | HV_MEMORY_EXEC ) ;
}
static int do_hvf_set_memory ( hvf_slot * slot , hv_memory_flags_t flags )
{
struct mac_slot * macslot ;
hv_return_t ret ;
macslot = & mac_slots [ slot - > slot_id ] ;
if ( macslot - > present ) {
if ( macslot - > size ! = slot - > size ) {
macslot - > present = 0 ;
trace_hvf_vm_unmap ( macslot - > gpa_start , macslot - > size ) ;
ret = hv_vm_unmap ( macslot - > gpa_start , macslot - > size ) ;
assert_hvf_ok ( ret ) ;
}
}
if ( ! slot - > size ) {
return 0 ;
}
macslot - > present = 1 ;
macslot - > gpa_start = slot - > start ;
macslot - > size = slot - > size ;
trace_hvf_vm_map ( slot - > start , slot - > size , slot - > mem , flags ,
flags & HV_MEMORY_READ ? ' R ' : ' - ' ,
flags & HV_MEMORY_WRITE ? ' W ' : ' - ' ,
flags & HV_MEMORY_EXEC ? ' X ' : ' - ' ) ;
ret = hv_vm_map ( slot - > mem , slot - > start , slot - > size , flags ) ;
assert_hvf_ok ( ret ) ;
return 0 ;
}
static void hvf_set_phys_mem ( MemoryRegionSection * section , bool add )
{
hvf_slot * mem ;
MemoryRegion * area = section - > mr ;
bool writable = ! area - > readonly & & ! area - > rom_device ;
hv_memory_flags_t flags ;
uint64_t page_size = qemu_real_host_page_size ( ) ;
uint64_t gpa = section - > offset_within_address_space ;
uint64_t size = int128_get64 ( section - > size ) ;
hv_return_t ret ;
void * mem ;
if ( ! memory_region_is_ram ( area ) ) {
if ( writable ) {
@ -139,69 +110,28 @@ static void hvf_set_phys_mem(MemoryRegionSection *section, bool add)
}
}
if ( ! QEMU_IS_ALIGNED ( int128_get64 ( section - > size ) , page_size ) | |
! QEMU_IS_ALIGNED ( section - > offset_within_address_space , page_size ) ) {
if ( ! QEMU_IS_ALIGNED ( size , page_size ) | |
! QEMU_IS_ALIGNED ( gpa , page_size ) ) {
/* Not page aligned, so we can not map as RAM */
add = false ;
}
mem = hvf_find_overlap_slot (
section - > offset_within_address_space ,
int128_get64 ( section - > size ) ) ;
if ( mem & & add ) {
if ( mem - > size = = int128_get64 ( section - > size ) & &
mem - > start = = section - > offset_within_address_space & &
mem - > mem = = ( memory_region_get_ram_ptr ( area ) +
section - > offset_within_region ) ) {
return ; /* Same region was attempted to register, go away. */
}
}
/* Region needs to be reset. set the size to 0 and remap it. */
if ( mem ) {
mem - > size = 0 ;
if ( do_hvf_set_memory ( mem , 0 ) ) {
error_report ( " Failed to reset overlapping slot " ) ;
abort ( ) ;
}
}
if ( ! add ) {
trace_hvf_vm_unmap ( gpa , size ) ;
ret = hv_vm_unmap ( gpa , size ) ;
assert_hvf_ok ( ret ) ;
return ;
}
if ( area - > readonly | |
( ! memory_region_is_ram ( area ) & & memory_region_is_romd ( area ) ) ) {
flags = HV_MEMORY_READ | HV_MEMORY_EXEC ;
} else {
flags = HV_MEMORY_READ | HV_MEMORY_WRITE | HV_MEMORY_EXEC ;
}
/* Now make a new slot. */
int x ;
flags = HV_MEMORY_READ | HV_MEMORY_EXEC | ( writable ? HV_MEMORY_WRITE : 0 ) ;
mem = memory_region_get_ram_ptr ( area ) + section - > offset_within_region ;
for ( x = 0 ; x < hvf_state - > num_slots ; + + x ) {
mem = & hvf_state - > slots [ x ] ;
if ( ! mem - > size ) {
break ;
}
}
if ( x = = hvf_state - > num_slots ) {
error_report ( " No free slots " ) ;
abort ( ) ;
}
mem - > size = int128_get64 ( section - > size ) ;
mem - > mem = memory_region_get_ram_ptr ( area ) + section - > offset_within_region ;
mem - > start = section - > offset_within_address_space ;
mem - > region = area ;
if ( do_hvf_set_memory ( mem , flags ) ) {
error_report ( " Error registering new memory slot " ) ;
abort ( ) ;
}
trace_hvf_vm_map ( gpa , size , mem , flags ,
flags & HV_MEMORY_READ ? ' R ' : ' - ' ,
flags & HV_MEMORY_WRITE ? ' W ' : ' - ' ,
flags & HV_MEMORY_EXEC ? ' X ' : ' - ' ) ;
ret = hv_vm_map ( mem , gpa , size , flags ) ;
assert_hvf_ok ( ret ) ;
}
static void hvf_log_start ( MemoryListener * listener ,
@ -260,7 +190,6 @@ static MemoryListener hvf_memory_listener = {
static int hvf_accel_init ( AccelState * as , MachineState * ms )
{
int x ;
hv_return_t ret ;
HVFState * s = HVF_STATE ( as ) ;
int pa_range = 36 ;
@ -281,12 +210,6 @@ static int hvf_accel_init(AccelState *as, MachineState *ms)
}
assert_hvf_ok ( ret ) ;
s - > num_slots = ARRAY_SIZE ( s - > slots ) ;
for ( x = 0 ; x < s - > num_slots ; + + x ) {
s - > slots [ x ] . size = 0 ;
s - > slots [ x ] . slot_id = x ;
}
QTAILQ_INIT ( & s - > hvf_sw_breakpoints ) ;
hvf_state = s ;