qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [RFC] TCG unit testing


From: Richard Henderson
Subject: [Qemu-devel] [RFC] TCG unit testing
Date: Fri, 23 Aug 2013 12:47:43 -0700
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130805 Thunderbird/17.0.8

I've been thinking for a while about how to reliably test TCG backends, and
maybe how to do regression testing on them.  Having to begin the test from a
guest binary, especially considering the vast cross-compilation problem, is
pretty much a non-starter.

I've been thinking of a truly stripped down target for the purpose, with a
special-purpose machine loop and main to go with it.  I.e. avoid vl.c.

My current idea is that the test file consists of 3 sections: guest memory
layout, raw TBs, and expected results.  Perhaps best explained with some 
examples:

(1a) I've split up this test into two TBs to prevent some constant folding.
(1b) The guest machine should have enough registers to make it easy to perform
lots of tests at once.  Even better if we can avoid the complication of memory.

--------------------------------------------
# Test basic arithmetic, esp with constant arguments
CODE
0:      movi_i32        a0, 0x12345678
        movi_i32        a1, 0x87654321
        movi_tl         pc, 1
        exit_tb         0

1:      add_i32         a2, a1, a0
        sub_i32         a1, a1, a0
        movi_i32        t0, 1
        add_i32         a3, a0, t0
        sub_i32         a4, a0, t0
        movi_i32        t0, -1
        add_i32         a5, a0, t0
        sub_i32         a6, a0, t0
        movi_i32        t0, -0x5678
        add_i32         a7, a0, t0
        sub_i32         a8, a0, t0
        movi_i32        t0, 0x123456
        add_i32         a9, a0, t0
        sub_i32         a10, a0, t0
        movi_i32        t0, 0x12341234
        add_i32         a11, a0, t0
        sub_i32         a12, a0, t0
        call            done

RESULT
        a0      0x12345678
        a1      0x7530eca9
        a2      0x99999999
        a3      0x12345679
        a4      0x12345677
        a5      0x12345677
        a6      0x12345679
        a7      0x12340000
        a8      0x1234acf0
        a9      0x12468ace
        a10     0x12222222
        a11     0x246868ac
        a12     0x4444
-------------------------------------------

(2) The ram layout should be flexible enough to test specific scenarios

-------------------------------------------
# For 64-bit guest, 32-bit host, make sure we compare high-part of tlb
MEM
        ram     0x0_0000_0000, 4096
        ram     0x1_0000_0000, 4096

CODE
0:      movi_i64        b0, 0x12345678abcdef
        movi_i64        t1, 0
        movi_i64        t2, 0x1_0000_0000
        qemu_st32       b0, t1
        qemu_ld32       b1, t1
        qemu_ld32       b2, t2
        call            done

RESULT
        b0      0x12345678abcdef
        b1      0x12345678abcdef
        b2      0
-------------------------------------------

(3a) If we let "ioram" be defined via memory_region_init_io, with the "/l" and
"/b" qualifiers controlling the .endianness field of the region, then we can
test the memory access path all the way through.
(3b) The final test in the result section would *not* use the device interface
from memory.h, but rather examine the backing ram directly.

-------------------------------------------
MEM
        ioram/l 0, 4096                         # little-endian device
        ioram/b 4096, 4096                      # big-endian device
CODE
0:      movi_tl         t0, 0x12345678
        movi_tl         t1, 0
        qemu_st32       t0, t1
        qemu_ld32       a0, t1
        movi_tl         t1, 4096
        qemu_st32       t0, t1
        qemu_ld32       a1, t1
        call            done
RESULT
        a0      0x12345678
        a1      0x12345678
        mem/b   0, 0x78, 0x56, 0x34, 0x12       # little-endian bytes
        mem/b   4096, 0x12, 0x34, 0x56, 0x78    # big-endian bytes
-------------------------------------------

Thoughts?  Anything that we ought to be testing that I haven't thought of here,
and that this sort of structure couldn't support?

It may be some time before I can progress this enough to usefulness, but I
wanted to get this written down while it is fresh in my head.


r~



reply via email to

[Prev in Thread] Current Thread [Next in Thread]