From ede09f502bfa771094753947df7ff55a04acd95c Mon Sep 17 00:00:00 2001 From: Sergej Schumilo Date: Mon, 2 Jan 2023 08:54:50 +0100 Subject: [PATCH] some code cleanup and fix for another edge case --- hw/i386/pc_piix.c | 6 +++- hw/i386/pc_q35.c | 16 +++++---- nyx/mem_split.c | 86 ++++++++++++----------------------------------- nyx/mem_split.h | 2 -- nyx/state/state.c | 3 +- nyx/state/state.h | 2 ++ 6 files changed, 40 insertions(+), 75 deletions(-) diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c index aee332c1a0..60c0f96563 100644 --- a/hw/i386/pc_piix.c +++ b/hw/i386/pc_piix.c @@ -154,12 +154,16 @@ static void pc_init1(MachineState *machine, x86ms->below_4g_mem_size = lowmem; #ifdef QEMU_NYX GET_GLOBAL_STATE()->mem_mapping_type = PC_PIIX_MEM_TYPE; + GET_GLOBAL_STATE()->mem_mapping_low = lowmem; + GET_GLOBAL_STATE()->mem_mapping_high = 0x100000000; #endif } else { x86ms->above_4g_mem_size = 0; x86ms->below_4g_mem_size = machine->ram_size; #ifdef QEMU_NYX - GET_GLOBAL_STATE()->mem_mapping_type = PC_PIIX_MEM_LOW_TYPE; + GET_GLOBAL_STATE()->mem_mapping_type = PC_PIIX_MEM_TYPE; + GET_GLOBAL_STATE()->mem_mapping_low = lowmem; + GET_GLOBAL_STATE()->mem_mapping_high = 0; #endif } } diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c index 93e6a2aa03..1285327a2d 100644 --- a/hw/i386/pc_q35.c +++ b/hw/i386/pc_q35.c @@ -150,14 +150,8 @@ static void pc_q35_init(MachineState *machine) */ if (machine->ram_size >= 0xb0000000) { lowmem = 0x80000000; -#ifdef QEMU_NYX - GET_GLOBAL_STATE()->mem_mapping_type = Q35_MEM_MEM_TYPE; -#endif } else { lowmem = 0xb0000000; -#ifdef QEMU_NYX - GET_GLOBAL_STATE()->mem_mapping_type = Q35_MEM_MEM_LOW_TYPE; -#endif } /* Handle the machine opt max-ram-below-4g. It is basically doing @@ -181,9 +175,19 @@ static void pc_q35_init(MachineState *machine) if (machine->ram_size >= lowmem) { x86ms->above_4g_mem_size = machine->ram_size - lowmem; x86ms->below_4g_mem_size = lowmem; +#ifdef QEMU_NYX + GET_GLOBAL_STATE()->mem_mapping_type = Q35_MEM_MEM_TYPE; + GET_GLOBAL_STATE()->mem_mapping_low = lowmem; + GET_GLOBAL_STATE()->mem_mapping_high = 0x100000000; +#endif } else { x86ms->above_4g_mem_size = 0; x86ms->below_4g_mem_size = machine->ram_size; +#ifdef QEMU_NYX + GET_GLOBAL_STATE()->mem_mapping_type = Q35_MEM_MEM_TYPE; + GET_GLOBAL_STATE()->mem_mapping_low = lowmem; + GET_GLOBAL_STATE()->mem_mapping_high = 0; +#endif } if (xen_enabled()) { diff --git a/nyx/mem_split.c b/nyx/mem_split.c index ea8dd4a810..67bb1f3af3 100644 --- a/nyx/mem_split.c +++ b/nyx/mem_split.c @@ -2,84 +2,40 @@ #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; + return GET_GLOBAL_STATE()->mem_mapping_type != MEM_SPLIT_TYPE_INVALID; } 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(); - } + assert(is_mem_mapping_supported(GET_GLOBAL_STATE()->mem_mapping_type)); + return GET_GLOBAL_STATE()->mem_mapping_low; } 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(); - } + assert(is_mem_mapping_supported(GET_GLOBAL_STATE()->mem_mapping_type)); + assert(GET_GLOBAL_STATE()->mem_mapping_high != 0); + return GET_GLOBAL_STATE()->mem_mapping_high; } 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(); + assert(is_mem_mapping_supported(GET_GLOBAL_STATE()->mem_mapping_type)); + if(GET_GLOBAL_STATE()->mem_mapping_high == 0){ + assert(offset <= GET_GLOBAL_STATE()->mem_mapping_low); + return offset; + } + else{ + return offset >= GET_GLOBAL_STATE()->mem_mapping_high ? (offset - GET_GLOBAL_STATE()->mem_mapping_high) + GET_GLOBAL_STATE()->mem_mapping_low : offset; } } 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(); + + assert(is_mem_mapping_supported(GET_GLOBAL_STATE()->mem_mapping_type)); + if(GET_GLOBAL_STATE()->mem_mapping_high == 0){ + assert(offset <= GET_GLOBAL_STATE()->mem_mapping_low); + return offset; + } + else{ + return offset >= GET_GLOBAL_STATE()->mem_mapping_low ? (offset - GET_GLOBAL_STATE()->mem_mapping_low) + GET_GLOBAL_STATE()->mem_mapping_high : offset; } } diff --git a/nyx/mem_split.h b/nyx/mem_split.h index 12b933c5ae..d178e9b5e8 100644 --- a/nyx/mem_split.h +++ b/nyx/mem_split.h @@ -6,9 +6,7 @@ typedef enum MemSplitType { MEM_SPLIT_TYPE_INVALID, - PC_PIIX_MEM_LOW_TYPE, PC_PIIX_MEM_TYPE, - Q35_MEM_MEM_LOW_TYPE, Q35_MEM_MEM_TYPE, } MemSplitType; diff --git a/nyx/state/state.c b/nyx/state/state.c index bd5a2b6dc4..da97952cbe 100644 --- a/nyx/state/state.c +++ b/nyx/state/state.c @@ -120,7 +120,8 @@ void state_init_global(void) global_state.mem_mapping_type = MEM_SPLIT_TYPE_INVALID; global_state.sharedir = sharedir_new(); - + global_state.mem_mapping_low = 0; + global_state.mem_mapping_high = 0; global_state.shared_bitmap_fd = 0; global_state.shared_bitmap_size = 0; diff --git a/nyx/state/state.h b/nyx/state/state.h index 7da8c3f720..ae6c1ddcc2 100644 --- a/nyx/state/state.h +++ b/nyx/state/state.h @@ -139,6 +139,8 @@ typedef struct qemu_nyx_state_s { bool set_agent_config_done; MemSplitType mem_mapping_type; + uint64_t mem_mapping_low; + uint64_t mem_mapping_high; /* capabilites */ uint8_t cap_timeout_detection;