Module Name: src Committed By: maxv Date: Fri Feb 1 06:49:59 UTC 2019
Modified Files: src/lib/libnvmm: libnvmm_x86.c src/tests/lib/libnvmm: h_mem_assist.c h_mem_assist_asm.S Log Message: Fix two issues: * Uh I put the wrong masks in some GPRs, fuck. * When the opsize of MOVZX is 4, we need to combine the zero-extend from the instruction with the natural zero-extend of long mode. Add two associated tests. To generate a diff of this commit: cvs rdiff -u -r1.17 -r1.18 src/lib/libnvmm/libnvmm_x86.c cvs rdiff -u -r1.3 -r1.4 src/tests/lib/libnvmm/h_mem_assist.c cvs rdiff -u -r1.2 -r1.3 src/tests/lib/libnvmm/h_mem_assist_asm.S Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/lib/libnvmm/libnvmm_x86.c diff -u src/lib/libnvmm/libnvmm_x86.c:1.17 src/lib/libnvmm/libnvmm_x86.c:1.18 --- src/lib/libnvmm/libnvmm_x86.c:1.17 Sun Jan 27 02:08:35 2019 +++ src/lib/libnvmm/libnvmm_x86.c Fri Feb 1 06:49:58 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: libnvmm_x86.c,v 1.17 2019/01/27 02:08:35 pgoyette Exp $ */ +/* $NetBSD: libnvmm_x86.c,v 1.18 2019/02/01 06:49:58 maxv Exp $ */ /* * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -1489,7 +1489,7 @@ static const struct x86_reg gpr_map[2][8 [4] = { -1, 0 }, [5] = { -1, 0 }, [6] = { -1, 0 }, - [7] = { NVMM_X64_GPR_RAX, 0x00000000FFFFFFFF }, /* RAX */ + [7] = { NVMM_X64_GPR_RAX, 0xFFFFFFFFFFFFFFFF }, /* RAX */ }, [0b001] = { [0] = { NVMM_X64_GPR_RCX, 0x00000000000000FF }, /* CL */ @@ -1499,7 +1499,7 @@ static const struct x86_reg gpr_map[2][8 [4] = { -1, 0 }, [5] = { -1, 0 }, [6] = { -1, 0 }, - [7] = { NVMM_X64_GPR_RCX, 0x00000000FFFFFFFF }, /* RCX */ + [7] = { NVMM_X64_GPR_RCX, 0xFFFFFFFFFFFFFFFF }, /* RCX */ }, [0b010] = { [0] = { NVMM_X64_GPR_RDX, 0x00000000000000FF }, /* DL */ @@ -1509,7 +1509,7 @@ static const struct x86_reg gpr_map[2][8 [4] = { -1, 0 }, [5] = { -1, 0 }, [6] = { -1, 0 }, - [7] = { NVMM_X64_GPR_RDX, 0x00000000FFFFFFFF }, /* RDX */ + [7] = { NVMM_X64_GPR_RDX, 0xFFFFFFFFFFFFFFFF }, /* RDX */ }, [0b011] = { [0] = { NVMM_X64_GPR_RBX, 0x00000000000000FF }, /* BL */ @@ -1519,7 +1519,7 @@ static const struct x86_reg gpr_map[2][8 [4] = { -1, 0 }, [5] = { -1, 0 }, [6] = { -1, 0 }, - [7] = { NVMM_X64_GPR_RBX, 0x00000000FFFFFFFF }, /* RBX */ + [7] = { NVMM_X64_GPR_RBX, 0xFFFFFFFFFFFFFFFF }, /* RBX */ }, [0b100] = { [0] = { -1, 0 }, /* SPECIAL */ @@ -1572,7 +1572,7 @@ static const struct x86_reg gpr_map[2][8 [4] = { -1, 0 }, [5] = { -1, 0 }, [6] = { -1, 0 }, - [7] = { NVMM_X64_GPR_R8, 0x00000000FFFFFFFF }, /* R8 */ + [7] = { NVMM_X64_GPR_R8, 0xFFFFFFFFFFFFFFFF }, /* R8 */ }, [0b001] = { [0] = { NVMM_X64_GPR_R9, 0x00000000000000FF }, /* R9B */ @@ -1582,7 +1582,7 @@ static const struct x86_reg gpr_map[2][8 [4] = { -1, 0 }, [5] = { -1, 0 }, [6] = { -1, 0 }, - [7] = { NVMM_X64_GPR_R9, 0x00000000FFFFFFFF }, /* R9 */ + [7] = { NVMM_X64_GPR_R9, 0xFFFFFFFFFFFFFFFF }, /* R9 */ }, [0b010] = { [0] = { NVMM_X64_GPR_R10, 0x00000000000000FF }, /* R10B */ @@ -1592,7 +1592,7 @@ static const struct x86_reg gpr_map[2][8 [4] = { -1, 0 }, [5] = { -1, 0 }, [6] = { -1, 0 }, - [7] = { NVMM_X64_GPR_R10, 0x00000000FFFFFFFF }, /* R10 */ + [7] = { NVMM_X64_GPR_R10, 0xFFFFFFFFFFFFFFFF }, /* R10 */ }, [0b011] = { [0] = { NVMM_X64_GPR_R11, 0x00000000000000FF }, /* R11B */ @@ -1602,7 +1602,7 @@ static const struct x86_reg gpr_map[2][8 [4] = { -1, 0 }, [5] = { -1, 0 }, [6] = { -1, 0 }, - [7] = { NVMM_X64_GPR_R11, 0x00000000FFFFFFFF }, /* R11 */ + [7] = { NVMM_X64_GPR_R11, 0xFFFFFFFFFFFFFFFF }, /* R11 */ }, [0b100] = { [0] = { NVMM_X64_GPR_R12, 0x00000000000000FF }, /* R12B */ @@ -1612,7 +1612,7 @@ static const struct x86_reg gpr_map[2][8 [4] = { -1, 0 }, [5] = { -1, 0 }, [6] = { -1, 0 }, - [7] = { NVMM_X64_GPR_R12, 0x00000000FFFFFFFF }, /* R12 */ + [7] = { NVMM_X64_GPR_R12, 0xFFFFFFFFFFFFFFFF }, /* R12 */ }, [0b101] = { [0] = { NVMM_X64_GPR_R13, 0x00000000000000FF }, /* R13B */ @@ -1622,7 +1622,7 @@ static const struct x86_reg gpr_map[2][8 [4] = { -1, 0 }, [5] = { -1, 0 }, [6] = { -1, 0 }, - [7] = { NVMM_X64_GPR_R13, 0x00000000FFFFFFFF }, /* R13 */ + [7] = { NVMM_X64_GPR_R13, 0xFFFFFFFFFFFFFFFF }, /* R13 */ }, [0b110] = { [0] = { NVMM_X64_GPR_R14, 0x00000000000000FF }, /* R14B */ @@ -1632,7 +1632,7 @@ static const struct x86_reg gpr_map[2][8 [4] = { -1, 0 }, [5] = { -1, 0 }, [6] = { -1, 0 }, - [7] = { NVMM_X64_GPR_R14, 0x00000000FFFFFFFF }, /* R14 */ + [7] = { NVMM_X64_GPR_R14, 0xFFFFFFFFFFFFFFFF }, /* R14 */ }, [0b111] = { [0] = { NVMM_X64_GPR_R15, 0x00000000000000FF }, /* R15B */ @@ -1642,7 +1642,7 @@ static const struct x86_reg gpr_map[2][8 [4] = { -1, 0 }, [5] = { -1, 0 }, [6] = { -1, 0 }, - [7] = { NVMM_X64_GPR_R15, 0x00000000FFFFFFFF }, /* R15 */ + [7] = { NVMM_X64_GPR_R15, 0xFFFFFFFFFFFFFFFF }, /* R15 */ }, } }; @@ -2267,12 +2267,17 @@ node_secondary_opcode(struct x86_decode_ instr->operand_size = get_operand_size(fsm, instr); instr->address_size = get_address_size(fsm, instr); + if (fsm->is64bit && (instr->operand_size == 4)) { + /* Zero-extend to 64 bits. */ + instr->zeroextend_mask = ~size_to_mask(4); + } + if (opcode->flags & FLAG_ze) { /* * Compute the mask for zero-extend. Update the operand size, * we move fewer bytes. */ - instr->zeroextend_mask = size_to_mask(instr->operand_size); + instr->zeroextend_mask |= size_to_mask(instr->operand_size); instr->zeroextend_mask &= ~size_to_mask(opcode->defsize); instr->operand_size = opcode->defsize; } Index: src/tests/lib/libnvmm/h_mem_assist.c diff -u src/tests/lib/libnvmm/h_mem_assist.c:1.3 src/tests/lib/libnvmm/h_mem_assist.c:1.4 --- src/tests/lib/libnvmm/h_mem_assist.c:1.3 Fri Feb 1 05:32:08 2019 +++ src/tests/lib/libnvmm/h_mem_assist.c Fri Feb 1 06:49:58 2019 @@ -290,6 +290,8 @@ extern uint8_t test6_begin, test6_end; extern uint8_t test7_begin, test7_end; extern uint8_t test8_begin, test8_end; extern uint8_t test9_begin, test9_end; +extern uint8_t test10_begin, test10_end; +extern uint8_t test11_begin, test11_end; static const struct test tests[] = { { "test1 - MOV", &test1_begin, &test1_end, 0x3004 }, @@ -301,6 +303,8 @@ static const struct test tests[] = { { "test7 - STOS", &test7_begin, &test7_end, 0x00123456 }, { "test8 - LODS", &test8_begin, &test8_end, 0x12345678 }, { "test9 - MOVS", &test9_begin, &test9_end, 0x12345678 }, + { "test10 - MOVZXB", &test10_begin, &test10_end, 0x00000078 }, + { "test11 - MOVZXW", &test11_begin, &test11_end, 0x00005678 }, { NULL, NULL, NULL, -1 } }; Index: src/tests/lib/libnvmm/h_mem_assist_asm.S diff -u src/tests/lib/libnvmm/h_mem_assist_asm.S:1.2 src/tests/lib/libnvmm/h_mem_assist_asm.S:1.3 --- src/tests/lib/libnvmm/h_mem_assist_asm.S:1.2 Thu Dec 27 07:22:31 2018 +++ src/tests/lib/libnvmm/h_mem_assist_asm.S Fri Feb 1 06:49:58 2019 @@ -36,6 +36,8 @@ .globl test7_begin, test7_end .globl test8_begin, test8_end .globl test9_begin, test9_end + .globl test10_begin, test10_end + .globl test11_begin, test11_end .text .code64 @@ -177,3 +179,26 @@ test9_begin: TEST_END test9_end: + .align 64 +test10_begin: + movq $0x1000,%rax + movq $0x12345678,(%rax) + + movq $0xFFFFFFFFFFFFFFFF,%rbx + movzxb (%rax),%ebx + movq %rbx,(%rax) + + TEST_END +test10_end: + + .align 64 +test11_begin: + movq $0x1000,%rax + movq $0x12345678,(%rax) + + movq $0xFFFFFFFFFFFFFFFF,%rbx + movzxw (%rax),%rbx + movq %rbx,(%rax) + + TEST_END +test11_end: