QEMU-Nyx-fork/nyx/mem_split.c
2023-01-19 17:01:38 +01:00

86 lines
2.7 KiB
C

#include "qemu/osdep.h"
#include "nyx/state/state.h"
#include "nyx/mem_split.h"
#define PC_PIIX_LOW_MEM_SPLIT_START 0xe0000000
#define PC_PIIX_MEM_SPLIT_START 0x0C0000000
#define PC_PIXX_MEM_SPLIT_END 0x100000000
#define Q35_MEM_SPLIT_START 0x080000000
#define Q35_MEM_SPLIT_END 0x100000000
#define Q35_LOW_MEM_SPLIT_START 0x0b0000000
bool is_mem_mapping_supported(MemSplitType type){
return type == PC_PIIX_MEM_LOW_TYPE || type == PC_PIIX_MEM_TYPE || type == Q35_MEM_MEM_LOW_TYPE || type == Q35_MEM_MEM_TYPE;
}
uint64_t get_mem_split_start(void){
switch(GET_GLOBAL_STATE()->mem_mapping_type){
case PC_PIIX_MEM_LOW_TYPE:
return PC_PIIX_LOW_MEM_SPLIT_START;
case PC_PIIX_MEM_TYPE:
return PC_PIIX_MEM_SPLIT_START;
case Q35_MEM_MEM_LOW_TYPE:
return Q35_LOW_MEM_SPLIT_START;
case Q35_MEM_MEM_TYPE:
return Q35_MEM_SPLIT_START;
default:
abort();
}
}
uint64_t get_mem_split_end(void){
switch(GET_GLOBAL_STATE()->mem_mapping_type){
case PC_PIIX_MEM_TYPE:
return PC_PIXX_MEM_SPLIT_END;
case Q35_MEM_MEM_TYPE:
return Q35_MEM_SPLIT_END;
default:
abort();
}
}
uint64_t address_to_ram_offset(uint64_t offset){
switch(GET_GLOBAL_STATE()->mem_mapping_type){
case PC_PIIX_MEM_LOW_TYPE:
if(offset >= PC_PIIX_LOW_MEM_SPLIT_START){
abort();
}
return offset;
case PC_PIIX_MEM_TYPE:
return offset >= PC_PIXX_MEM_SPLIT_END ? (offset - PC_PIXX_MEM_SPLIT_END) + PC_PIIX_MEM_SPLIT_START : offset;
case Q35_MEM_MEM_TYPE:
return offset >= Q35_MEM_SPLIT_END ? (offset - Q35_MEM_SPLIT_END) + Q35_MEM_SPLIT_START : offset;
case Q35_MEM_MEM_LOW_TYPE:
if(offset >= Q35_LOW_MEM_SPLIT_START){
abort();
}
return offset;
default:
abort();
}
}
uint64_t ram_offset_to_address(uint64_t offset){
switch(GET_GLOBAL_STATE()->mem_mapping_type){
case PC_PIIX_MEM_LOW_TYPE:
if(offset >= PC_PIIX_LOW_MEM_SPLIT_START){
abort();
}
return offset;
case PC_PIIX_MEM_TYPE:
return offset >= PC_PIIX_MEM_SPLIT_START ? (offset - PC_PIIX_MEM_SPLIT_START) + PC_PIXX_MEM_SPLIT_END : offset;;
case Q35_MEM_MEM_TYPE:
return offset >= Q35_MEM_SPLIT_START ? (offset - Q35_MEM_SPLIT_START) + Q35_MEM_SPLIT_END : offset;
case Q35_MEM_MEM_LOW_TYPE:
if(offset >= Q35_LOW_MEM_SPLIT_START){
abort();
}
return offset;
default:
abort();
}
}