Browse Source

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

Fabian 1 year ago
parent
commit
8dc153b8eb
4 changed files with 37 additions and 32 deletions
  1. 13 4
      tests/nasm/create_tests.js
  2. 12 24
      tests/nasm/gdb-extract-def
  3. 1 1
      tests/nasm/header.inc
  4. 11 3
      tests/nasm/run.js

+ 13 - 4
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" +

+ 12 - 24
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

+ 1 - 1
tests/nasm/header.inc

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

+ 11 - 3
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],
                     });