From: Lei Xia Date: Mon, 21 Jul 2008 17:26:25 +0000 (+0000) Subject: Incorporated XED inclusion code. X-Git-Tag: puppy-and-xed X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=commitdiff_plain;h=f7cc83b3bae64c853f5b7b63e2830b1ea92dfed9 Incorporated XED inclusion code. make XED=1 world will now include the XED library (and, for now, an empty boot package) make XED=0 world (default) will not include the XED library (and, for now, includes the rombios+vgabios boot package) --- diff --git a/palacios/build/Makefile b/palacios/build/Makefile index 99965c6..e8b2b78 100644 --- a/palacios/build/Makefile +++ b/palacios/build/Makefile @@ -1,6 +1,6 @@ # Makefile for GeekOS kernel, userspace, and tools # Copyright (c) 2004,2005 David H. Hovemeyer -# $Revision: 1.45 $ +# $Revision: 1.46 $ # This is free software. You are permitted to use, # redistribute, and modify it as specified in the file "COPYING". @@ -42,14 +42,34 @@ VPATH := $(PROJECT_ROOT)/src #when -DNDEBUG is set the kassert functions are disabled #JRLDEBUG=-DNDEBUG +# DEBUG=1 means VMM_DEBUG, VMM_INFO, and VMM_TRACE are enabled +# as are SERIAL_PRINT_DEBUG +# DEBUG=1 +# +# XED=1 means that libxed will be included +# +# and VMM_XED is one +# +# and make world will build an empty boot package +# +XED=0 + ifeq ($(DEBUG),1) JRLDEBUG= -DSERIAL_PRINT_DEBUG=1 -DSERIAL_PRINT_DEBUG_LEVEL=10 -DSERIAL_PRINT=1 -DVMM_DEBUG=1 -DVMM_INFO=1 -DVMM_TRACE=1 else JRLDEBUG= -DSERIAL_PRINT_DEBUG=0 -DSERIAL_PRINT_DEBUG_LEVEL=999999 -DSERIAL_PRINT=0 -DVMM_DEBUG=0 -DVMM_INFO=0 -DVMM_TRACE=0 endif +ifeq ($(XED),1) + LEIXED = -DVMM_XED=1 +else + LEIXED = -DVMM_XED=0 +endif + +LEIFLAGS = $(LEIXED) + # # #Peter's compile flags @@ -106,7 +126,7 @@ KERNEL_C_OBJS := $(KERNEL_C_SRCS:%.c=geekos/%.o) # Kernel assembly files KERNEL_ASM_SRCS := lowlevel.asm -KERNEL_GAS_SRCS := testvm.s +KERNEL_GAS_SRCS := testvm.s udivdi3.s # Kernel object files build from assembler source files KERNEL_ASM_OBJS := $(KERNEL_ASM_SRCS:%.asm=geekos/%.o) @@ -153,6 +173,11 @@ DEVICE_C_OBJS := $(DEVICE_C_SRCS:%.c=devices/%.o) DEVICE_OBJS := $(DEVICE_C_OBJS) +V3LIBS := + +ifeq ($(XED),1) + V3LIBS := $(V3LIBS) -L../lib/xed -lxed +endif # ---------------------------------------------------------------------- @@ -220,7 +245,7 @@ ROUND_UP_HEX := $(PERL) $(PROJECT_ROOT)/scripts/round_up_hex.pl # ---------------------------------------------------------------------- # Flags used for all C source files -GENERAL_OPTS := -O -Wall $(EXTRA_C_OPTS) $(JRLDEBUG) $(PADFLAGS) -fPIC +GENERAL_OPTS := -O -Wall $(EXTRA_C_OPTS) $(JRLDEBUG) $(PADFLAGS) $(LEIFLAGS) -fPIC CC_GENERAL_OPTS := $(GENERAL_OPTS) -Werror # Flags used for kernel C source files @@ -317,7 +342,11 @@ force_vgabios: (cd ../src/vmboot/vgabios; make clean; make) force_payload: force_rombios force_vgabios +ifeq ($(XED),1) + ../scripts/make_payload.pl payload_none.txt vm_kernel +else ../scripts/make_payload.pl payload_layout.txt vm_kernel +endif inter1: force_payload -make clean @@ -361,7 +390,7 @@ geekos/kernel.bin : geekos/kernel.exe # The kernel executable and symbol map. geekos/kernel.exe : $(KERNEL_OBJS) $(COMMON_C_OBJS) $(VMM_OBJS) $(DEVICE_OBJS) vm_kernel $(TARGET_LD) -o geekos/kernel.exe -Ttext $(KERNEL_BASE_ADDR) -e $(KERNEL_ENTRY) \ - $(KERNEL_OBJS) $(COMMON_C_OBJS) $(VMM_OBJS) $(DEVICE_OBJS) -b binary vm_kernel + $(KERNEL_OBJS) $(COMMON_C_OBJS) $(VMM_OBJS) $(DEVICE_OBJS) $(V3LIBS) -b binary vm_kernel $(TARGET_NM) geekos/kernel.exe > geekos/kernel.syms diff --git a/palacios/include/palacios/vmm_decoder.h b/palacios/include/palacios/vmm_decoder.h index 9319da8..aeb758d 100644 --- a/palacios/include/palacios/vmm_decoder.h +++ b/palacios/include/palacios/vmm_decoder.h @@ -10,7 +10,7 @@ typedef enum {INVALID_OPERAND, REG_OPERAND, MEM_OPERAND} operand_type_t; - +int parse(); struct x86_operand { diff --git a/palacios/src/geekos/vm.c b/palacios/src/geekos/vm.c index 6c74852..661f5d1 100644 --- a/palacios/src/geekos/vm.c +++ b/palacios/src/geekos/vm.c @@ -18,6 +18,11 @@ #include #include +//test decoder +//#include + +extern int parse(); + #define SPEAKER_PORT 0x61 static inline void VM_Out_Byte(ushort_t port, uchar_t value) @@ -199,6 +204,8 @@ int RunVMM(struct Boot_Info * bootInfo) { + + memset(&os_hooks, 0, sizeof(struct vmm_os_hooks)); memset(&vmm_ops, 0, sizeof(struct vmm_ctrl_ops)); memset(&vm_info, 0, sizeof(struct guest_info)); @@ -217,7 +224,14 @@ int RunVMM(struct Boot_Info * bootInfo) { os_hooks.ack_irq = &ack_irq; os_hooks.get_cpu_khz = &get_cpu_khz; + + Init_VMM(&os_hooks, &vmm_ops); + + //test decoder + PrintBoth("testing decoder\n"); + parse(); + PrintBoth("testing decoder done\n"); /* MOVE THIS TO AN INIT GUEST ROUTINE */ diff --git a/palacios/src/palacios/vmm_decoder.c b/palacios/src/palacios/vmm_decoder.c index 77ece9b..a67887e 100644 --- a/palacios/src/palacios/vmm_decoder.c +++ b/palacios/src/palacios/vmm_decoder.c @@ -1,37 +1,86 @@ #include +#if VMM_XED +#include +#endif +int parse() { +#if !VMM_XED + PrintDebug("XED is not included in this kernel\n"); +#else + xed_state_t dstate; + xed_decoded_inst_t xedd; + xed_uint_t i, length; + xed_uint8_t itext[100] = {0x01,0x00,0x00,0x00,0x12,0x00,0x55,0x48,0x89,0xe5,0x48,0x89,0x7d,0xf8,0x89,0x75,0xf4,0x89,0x55,0xf0,0x89,0x4d,0xec,0x48,0x8b,0x55,0xf8,0x8b,0x45,0xf4,0x89,0x02,0x48,0x8b,0x55,0xf8,0x8b,0x45,0xf0,0x89,0x42,0x04,0x48,0x8b,0x55,0xf8,0x8b,0x45,0xec,0x89,0x42,0x08,0xc9,0xc3,0x55,0x48,0x89,0xe5,0x48,0x89,0x7d,0xf8,0x48,0x8b,0x45,0xf8,0x8b,0x40,0x08,0xc9,0xc3,0x90,0x0}; + xed_bool_t long_mode = true; + unsigned int first_argv; + int num; + -/* The full blown instruction parser... */ -int v3_parse_instr(struct guest_info * info, - char * instr_ptr, - uint_t * instr_length, - addr_t * opcode, - uint_t * opcode_length, - struct x86_prefix_list * prefixes, - struct x86_operand * src_operand, - struct x86_operand * dst_operand, - struct x86_operand * extra_operand) { + for (i=0, num=1; i<100; i += length, num++){ + xed_tables_init(); + xed_state_zero(&dstate); + //if (argc > 2 && strcmp(argv[1], "-64") == 0) + long_mode = true; - V3_ASSERT(src_operand != NULL); - V3_ASSERT(dst_operand != NULL); - V3_ASSERT(extra_operand != NULL); - V3_ASSERT(instr_length != NULL); - V3_ASSERT(info != NULL); + if (long_mode) { + first_argv = 2; + dstate.mmode=XED_MACHINE_MODE_LONG_64; + } + else { + first_argv=1; + xed_state_init(&dstate, + XED_MACHINE_MODE_LEGACY_32, + XED_ADDRESS_WIDTH_32b, + XED_ADDRESS_WIDTH_32b); + } - - // Ignore prefixes for now - while (is_prefix_byte(*instr_ptr)) { - instr_ptr++; - *instr_length++; - } + xed_decoded_inst_zero_set_mode(&xedd, &dstate); + xed_error_enum_t xed_error = xed_decode(&xedd, + REINTERPRET_CAST(const xed_uint8_t*,&itext[i]), + XED_MAX_INSTRUCTION_BYTES); + switch(xed_error) { + case XED_ERROR_NONE: + break; + case XED_ERROR_BUFFER_TOO_SHORT: + PrintDebug("Not enough bytes provided\n"); + return 1; + case XED_ERROR_GENERAL_ERROR: + PrintDebug("Could not decode given input.\n"); + return 1; + default: + PrintDebug("Unhandled error code \n"); + return 1;; + } + length = xed_decoded_inst_get_length (&xedd); - // Opcode table lookup, see xen/kvm + PrintDebug("\nThe %dth instruction:", num); + PrintDebug("\ncategory: "); + PrintDebug(" %s\n", xed_category_enum_t2str(xed_decoded_inst_get_category(&xedd)));; + PrintDebug("ISA-extension:%s\n ",xed_extension_enum_t2str(xed_decoded_inst_get_extension(&xedd))); + PrintDebug(" instruction-length: %d\n ", xed_decoded_inst_get_length(&xedd)); + PrintDebug(" operand-size:%d\n ", xed_operand_values_get_effective_operand_width(xed_decoded_inst_operands_const(&xedd))); + PrintDebug("address-size:%d\n ", xed_operand_values_get_effective_address_width(xed_decoded_inst_operands_const(&xedd))); + PrintDebug("iform-enum-name:%s\n ",xed_iform_enum_t2str(xed_decoded_inst_get_iform_enum(&xedd))); + PrintDebug("iform-enum-name-dispatch (zero based):%d\n ", xed_decoded_inst_get_iform_enum_dispatch(&xedd)); + PrintDebug("iclass-max-iform-dispatch: %d\n ", xed_iform_max_per_iclass(xed_decoded_inst_get_iclass(&xedd))); + // operands + // print_operands(&xedd); + + // memops + // print_memops(&xedd); + + // flags + //print_flags(&xedd); + // attributes + //print_attributes(&xedd);*/ + } +#endif - return 0; + return 0; } diff --git a/palacios/src/palacios/vmm_dev_mgr.c b/palacios/src/palacios/vmm_dev_mgr.c index 7f536bf..8f9b3a2 100644 --- a/palacios/src/palacios/vmm_dev_mgr.c +++ b/palacios/src/palacios/vmm_dev_mgr.c @@ -2,6 +2,7 @@ #include #include #include +#include extern struct vmm_os_hooks *os_hooks; @@ -17,6 +18,7 @@ int dev_mgr_init(struct vmm_dev_mgr * mgr) { INIT_LIST_HEAD(&(mgr->io_hooks)); mgr->num_io_hooks = 0; + return 0; }