nasmtests: compare entire bss (resize it to 8kB)

This commit is contained in:
Fabian 2022-11-24 14:37:17 -06:00
parent af1cb6d17d
commit 8dc153b8eb
4 changed files with 37 additions and 32 deletions

View file

@ -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" +

View file

@ -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

View file

@ -10,7 +10,7 @@ align 4
dd CHECKSUM
section .bss
resb 128*1024 ; 0x20000
resb 2*4096 ; 0x2000
stack_top:

View file

@ -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],
});