From 8dc153b8eba5379bd508d6f98502321c81b5671e Mon Sep 17 00:00:00 2001 From: Fabian Date: Thu, 24 Nov 2022 14:37:17 -0600 Subject: [PATCH] nasmtests: compare entire bss (resize it to 8kB) --- tests/nasm/create_tests.js | 17 +++++++++++++---- tests/nasm/gdb-extract-def | 36 ++++++++++++------------------------ tests/nasm/header.inc | 2 +- tests/nasm/run.js | 14 +++++++++++--- 4 files changed, 37 insertions(+), 32 deletions(-) diff --git a/tests/nasm/create_tests.js b/tests/nasm/create_tests.js index 1c503ba7..2da73f1d 100755 --- a/tests/nasm/create_tests.js +++ b/tests/nasm/create_tests.js @@ -4,6 +4,8 @@ // number of tests per instruction const NO_TESTS = 1; +const FLAGS_IGNORE = 0xFFFF3200; + const assert = require("assert").strict; const fs = require("fs"); const encodings = require("../../gen/x86_table.js"); @@ -271,8 +273,8 @@ function create_nasm(op, config, nth_test) if(op.is_string) { codes.push("mov ecx, 3"); - codes.push("mov edi, (120000h-16)"); - codes.push("mov esi, (120000h-20)"); + codes.push("mov edi, (102000h-16)"); + codes.push("mov esi, (102000h-20)"); } if(size === 16) @@ -356,7 +358,7 @@ function create_nasm(op, config, nth_test) { // immaddr: depends on address size // generate valid pointer into bss section - codes.push("dd (120000h-16)"); + codes.push("dd (102000h-16)"); } else { @@ -379,11 +381,18 @@ function create_nasm(op, config, nth_test) { codes.push( "pushf", - "and dword [esp], ~" + op.mask_flags, + "and dword [esp], ~" + (op.mask_flags | FLAGS_IGNORE), "popf" ); } + if(op.opcode === 0x06 || op.opcode === 0x0E || op.opcode === 0x16 || op.opcode === 0x1E || + op.opcode === 0x0FA0 || op.opcode === 0x0FA8) + { + // push sreg: mask result + codes.push("mov word [esp], 0"); + } + return all_combinations(codes).map(c => { return ( "global _start\n" + diff --git a/tests/nasm/gdb-extract-def b/tests/nasm/gdb-extract-def index 3ee0c883..259f56e7 100644 --- a/tests/nasm/gdb-extract-def +++ b/tests/nasm/gdb-extract-def @@ -4,8 +4,6 @@ define extract-state file $arg0 - set $STACK_TOP=0x120000 - # Disables logging to stdout - only log to file set logging redirect on @@ -25,10 +23,10 @@ define extract-state printf " %d,\n", $ebp printf " %d,\n", $esi printf " %d,\n", $edi - printf " \n" + printf "\n" printf " %d,\n", $eip - printf " \n" + printf "\n" # For fpu registers, check the tag register first. If the tag index is # invalid and you try to access to corresponding register, gdb exits with an @@ -73,7 +71,7 @@ define extract-state else printf " \"invalid\",\n" end - printf " \n" + printf "\n" printf " %d,\n", $mm0.v2_int32[0] printf " %d,\n", $mm0.v2_int32[1] @@ -91,7 +89,7 @@ define extract-state printf " %d,\n", $mm6.v2_int32[1] printf " %d,\n", $mm7.v2_int32[0] printf " %d,\n", $mm7.v2_int32[1] - printf " \n" + printf "\n" printf " %d,\n", $xmm0.v4_int32[0] printf " %d,\n", $xmm0.v4_int32[1] @@ -125,25 +123,15 @@ define extract-state printf " %d,\n", $xmm7.v4_int32[1] printf " %d,\n", $xmm7.v4_int32[2] printf " %d,\n", $xmm7.v4_int32[3] - printf " \n" + printf "\n" - printf " %d,\n", *(int*)($STACK_TOP-64) - printf " %d,\n", *(int*)($STACK_TOP-60) - printf " %d,\n", *(int*)($STACK_TOP-56) - printf " %d,\n", *(int*)($STACK_TOP-52) - printf " %d,\n", *(int*)($STACK_TOP-48) - printf " %d,\n", *(int*)($STACK_TOP-44) - printf " %d,\n", *(int*)($STACK_TOP-40) - printf " %d,\n", *(int*)($STACK_TOP-36) - printf " %d,\n", *(int*)($STACK_TOP-32) - printf " %d,\n", *(int*)($STACK_TOP-28) - printf " %d,\n", *(int*)($STACK_TOP-24) - printf " %d,\n", *(int*)($STACK_TOP-20) - printf " %d,\n", *(int*)($STACK_TOP-16) - printf " %d,\n", *(int*)($STACK_TOP-12) - printf " %d,\n", *(int*)($STACK_TOP-8) - printf " %d,\n", *(int*)($STACK_TOP-4) - printf " \n" + + set $addr=0x100000 + while($addr < 0x102000) + printf " %d, %d, %d, %d, %d, %d, %d, %d,\n", *(int*)($addr+0), *(int*)($addr+4), *(int*)($addr+8), *(int*)($addr+12), *(int*)($addr+16), *(int*)($addr+20), *(int*)($addr+24), *(int*)($addr+28) + set $addr=$addr+32 + end + printf "\n" printf " %d,\n", $eflags printf " %d,\n", $ftag diff --git a/tests/nasm/header.inc b/tests/nasm/header.inc index 6d05733a..7e57e01b 100644 --- a/tests/nasm/header.inc +++ b/tests/nasm/header.inc @@ -10,7 +10,7 @@ align 4 dd CHECKSUM section .bss - resb 128*1024 ; 0x20000 + resb 2*4096 ; 0x2000 stack_top: diff --git a/tests/nasm/run.js b/tests/nasm/run.js index 272bc2a6..abd7d600 100755 --- a/tests/nasm/run.js +++ b/tests/nasm/run.js @@ -30,6 +30,9 @@ const TEST_DIR = __dirname + "/build/"; const DONE_MSG = "DONE"; const TERMINATE_MSG = "DONE"; +const BSS = 0x100000; +const STACK_TOP = 0x102000; + const FORCE_JIT = process.argv.includes("--force-jit"); // alternative representation for infinity for json @@ -366,7 +369,7 @@ else { const evaluated_fpu_regs = new Float64Array(8).map((_, i) => cpu.fpu_get_sti_f64(i)); const evaluated_mmxs = new Int32Array(16).map((_, i) => cpu.fpu_st[(i & ~1) << 1 | (i & 1)]); const evaluated_xmms = cpu.reg_xmm32s; - const evaluated_memory = new Int32Array(cpu.mem8.slice(0x120000 - 16 * 4, 0x120000).buffer); + const evaluated_memory = new Int32Array(cpu.mem8.buffer, cpu.mem8.byteOffset + BSS, STACK_TOP - BSS >> 2); const evaluated_fpu_tag = cpu.fpu_load_tag_word(); const evaluated_fpu_status = cpu.fpu_load_status_word() & FPU_STATUS_MASK; @@ -388,11 +391,16 @@ else { current_test.fixture.array.slice(offset, offset += 8) .map(x => x in FLOAT_TRANSLATION ? FLOAT_TRANSLATION[x] : x); const expected_mmx_registers = current_test.fixture.array.slice(offset, offset += 16); const expected_xmm_registers = current_test.fixture.array.slice(offset, offset += 32); - const expected_memory = current_test.fixture.array.slice(offset, offset += 16); + const expected_memory = current_test.fixture.array.slice(offset, offset += 8192 / 4); const expected_eflags = current_test.fixture.array[offset++] & MASK_ARITH; const fpu_tag = current_test.fixture.array[offset++]; const fpu_status = current_test.fixture.array[offset++] & FPU_STATUS_MASK; + if(offset !== current_test.fixture.array.length) + { + throw new Error("Bad fixture length in test " + current_test.img_name); + } + if(!current_test.fixture.exception) { for (let i = 0; i < cpu.reg32.length; i++) { @@ -454,7 +462,7 @@ else { for (let i = 0; i < evaluated_memory.length; i++) { if (evaluated_memory[i] !== expected_memory[i]) { individual_failures.push({ - name: "mem[" + i + "]", + name: "mem[" + (BSS + 4 * i).toString(16).toUpperCase() + "]", expected: expected_memory[i], actual: evaluated_memory[i], });