# Makefile for GeekOS kernel, userspace, and tools
# Copyright (c) 2004,2005 David H. Hovemeyer <daveho@cs.umd.edu>
-# $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".
#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
# 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)
DEVICE_OBJS := $(DEVICE_C_OBJS)
+V3LIBS :=
+
+ifeq ($(XED),1)
+ V3LIBS := $(V3LIBS) -L../lib/xed -lxed
+endif
# ----------------------------------------------------------------------
# ----------------------------------------------------------------------
# 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
(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
# 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
#include <palacios/vmm_decoder.h>
+#if VMM_XED
+#include <xed/xed-interface.h>
+#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;
}