Commit adbfc341 authored by Peter Maydell's avatar Peter Maydell
Browse files

Merge remote-tracking branch 'remotes/xtensa/tags/20140526-xtensa' into staging



Xtensa fixes queue 2014-05-26:
- fix cross-page jumps/calls at the end of TB;
- add tests for TBs and instructions crossing page boundary.

# gpg: Signature made Mon 26 May 2014 09:37:39 BST using RSA key ID F83FA044
# gpg: Can't check signature: public key not found

* remotes/xtensa/tags/20140526-xtensa:
  target-xtensa: add tests for cross-page TB
  target-xtensa: completely clean TLB between MMU tests
  target-xtensa: fix cross-page jumps/calls at the end of TB

Signed-off-by: default avatarPeter Maydell <peter.maydell@linaro.org>
parents 972b09c2 57a74051
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -419,7 +419,7 @@ static void gen_jump(DisasContext *dc, TCGv dest)
static void gen_jumpi(DisasContext *dc, uint32_t dest, int slot)
{
    TCGv_i32 tmp = tcg_const_i32(dest);
    if (((dc->pc ^ dest) & TARGET_PAGE_MASK) != 0) {
    if (((dc->tb->pc ^ dest) & TARGET_PAGE_MASK) != 0) {
        slot = -1;
    }
    gen_jump_slot(dc, tmp, slot);
@@ -447,7 +447,7 @@ static void gen_callw(DisasContext *dc, int callinc, TCGv_i32 dest)
static void gen_callwi(DisasContext *dc, int callinc, uint32_t dest, int slot)
{
    TCGv_i32 tmp = tcg_const_i32(dest);
    if (((dc->pc ^ dest) & TARGET_PAGE_MASK) != 0) {
    if (((dc->tb->pc ^ dest) & TARGET_PAGE_MASK) != 0) {
        slot = -1;
    }
    gen_callw_slot(dc, callinc, tmp, slot);
+239 −7
Original line number Diff line number Diff line
@@ -4,16 +4,28 @@ test_suite mmu

.purgem test_init

.macro test_init
    movi    a2, 0x00000004
    idtlb   a2
    movi    a2, 0x00100004
.macro clean_tlb_way way, page_size, n_entries
    movi    a2, \way
    movi    a3, \page_size
    movi    a4, \n_entries
    loop    a4, 1f
    idtlb   a2
    movi    a2, 0x00200004
    iitlb   a2
    add     a2, a2, a3
1:
.endm

.macro test_init
    clean_tlb_way 0, 0x00001000, 4
    clean_tlb_way 1, 0x00001000, 4
    clean_tlb_way 2, 0x00001000, 4
    clean_tlb_way 3, 0x00001000, 4
    clean_tlb_way 4, 0x00100000, 4
    movi    a2, 0x00000007
    idtlb   a2
    movi    a2, 0x00300004
    movi    a2, 0x00000008
    idtlb   a2
    movi    a2, 0x00000007
    movi    a2, 0x00000009
    idtlb   a2
.endm

@@ -508,4 +520,224 @@ test autoload_3_level_pt
    assert_sr exccause, 24
test_end

test cross_page_insn
    set_vector kernel, 2f

    movi    a2, 0x04000003 /* PPN */
    movi    a3, 0x00007000 /* VPN */
    witlb   a2, a3
    wdtlb   a2, a3
    movi    a3, 0x00008000 /* VPN */
    witlb   a2, a3
    wdtlb   a2, a3

    movi    a2, 0x00007fff
    movi    a3, 20f
    movi    a4, 21f
    sub     a4, a4, a3
    loop    a4, 1f
    l8ui    a5, a3, 0
    s8i     a5, a2, 0
    addi    a2, a2, 1
    addi    a3, a3, 1
1:
    movi    a2, 0x00007fff
    movi    a3, 0x00008000
    /* DTLB: OK, ITLB: OK */
    jx      a2

    .begin  no-transform
20:
    l32i    a2, a3, 0
    syscall
21:
    .end    no-transform

2:
    rsr     a2, exccause
    movi    a3, 1
    assert  eq, a2, a3
    rsr     a2, epc1
    movi    a3, 0x8002
    assert  eq, a2, a3
    rsr     a2, excsave1
    movi    a3, 0x00007fff
    assert  ne, a2, a3

    reset_ps
    set_vector kernel, 3f

    movi    a2, 0x0400000c /* PPN */
    movi    a3, 0x00008000 /* VPN */
    wdtlb   a2, a3
    movi    a2, 0x00007fff
    movi    a3, 0x00008000
    /* DTLB: FAIL, ITLB: OK */
    jx      a2
3:
    rsr     a2, exccause
    movi    a3, 28
    assert  eq, a2, a3
    rsr     a2, epc1
    movi    a3, 0x7fff
    assert  eq, a2, a3
    rsr     a2, excsave1
    movi    a3, 0x00007fff
    assert  eq, a2, a3

    reset_ps
    set_vector kernel, 4f

    movi    a2, 0x0400000c /* PPN */
    movi    a3, 0x00008000 /* VPN */
    witlb   a2, a3
    movi    a2, 0x04000003 /* PPN */
    wdtlb   a2, a3
    movi    a2, 0x00007fff
    movi    a3, 0x00008000
    /* DTLB: OK, ITLB: FAIL */
    jx      a2
4:
    rsr     a2, exccause
    movi    a3, 20
    assert  eq, a2, a3
    rsr     a2, epc1
    movi    a3, 0x7fff
    assert  eq, a2, a3
    rsr     a2, excsave1
    movi    a3, 0x00007fff
    assert  eq, a2, a3

    reset_ps
    set_vector kernel, 5f

    movi    a2, 0x0400000c /* PPN */
    movi    a3, 0x00008000 /* VPN */
    wdtlb   a2, a3
    movi    a2, 0x00007fff
    movi    a3, 0x00008000
    /* DTLB: FAIL, ITLB: FAIL */
    jx      a2
5:
    rsr     a2, exccause
    movi    a3, 20
    assert  eq, a2, a3
    rsr     a2, epc1
    movi    a3, 0x7fff
    assert  eq, a2, a3
    rsr     a2, excsave1
    movi    a3, 0x00007fff
    assert  eq, a2, a3
test_end

test cross_page_tb
    set_vector kernel, 2f

    movi    a2, 0x04000003 /* PPN */
    movi    a3, 0x00007000 /* VPN */
    witlb   a2, a3
    wdtlb   a2, a3
    movi    a3, 0x00008000 /* VPN */
    witlb   a2, a3
    wdtlb   a2, a3

    movi    a2, 0x00007ffd
    movi    a3, 20f
    movi    a4, 21f
    sub     a4, a4, a3
    loop    a4, 1f
    l8ui    a5, a3, 0
    s8i     a5, a2, 0
    addi    a2, a2, 1
    addi    a3, a3, 1
1:
    movi    a2, 0x00007ffd
    movi    a3, 0x00008000
    /* DTLB: OK, ITLB: OK */
    jx      a2

    .begin  no-transform
20:
    l32i    a2, a3, 0
    syscall
21:
    .end    no-transform

2:
    rsr     a2, exccause
    movi    a3, 1
    assert  eq, a2, a3
    rsr     a2, epc1
    movi    a3, 0x8000
    assert  eq, a2, a3
    rsr     a2, excsave1
    movi    a3, 0x00007ffd
    assert  ne, a2, a3

    reset_ps
    set_vector kernel, 3f

    movi    a2, 0x0400000c /* PPN */
    movi    a3, 0x00008000 /* VPN */
    wdtlb   a2, a3
    movi    a2, 0x00007ffd
    movi    a3, 0x00008000
    /* DTLB: FAIL, ITLB: OK */
    jx      a2
3:
    rsr     a2, exccause
    movi    a3, 28
    assert  eq, a2, a3
    rsr     a2, epc1
    movi    a3, 0x7ffd
    assert  eq, a2, a3
    rsr     a2, excsave1
    movi    a3, 0x00007ffd
    assert  eq, a2, a3

    reset_ps
    set_vector kernel, 4f

    movi    a2, 0x0400000c /* PPN */
    movi    a3, 0x00008000 /* VPN */
    witlb   a2, a3
    movi    a2, 0x04000003 /* PPN */
    wdtlb   a2, a3
    movi    a2, 0x00007ffd
    movi    a3, 0x00008000
    /* DTLB: OK, ITLB: FAIL */
    jx      a2
4:
    rsr     a2, exccause
    movi    a3, 20
    assert  eq, a2, a3
    rsr     a2, epc1
    movi    a3, 0x8000
    assert  eq, a2, a3
    rsr     a2, excsave1
    movi    a3, 0x00007ffd
    assert  ne, a2, a3

    reset_ps
    set_vector kernel, 5f

    movi    a2, 0x0400000c /* PPN */
    movi    a3, 0x00008000 /* VPN */
    wdtlb   a2, a3
    movi    a2, 0x00007ffd
    movi    a3, 0x00008000
    /* DTLB: FAIL, ITLB: FAIL */
    jx      a2
5:
    rsr     a2, exccause
    movi    a3, 28
    assert  eq, a2, a3
    rsr     a2, epc1
    movi    a3, 0x7ffd
    assert  eq, a2, a3
    rsr     a2, excsave1
    movi    a3, 0x00007ffd
    assert  eq, a2, a3
test_end

test_suite_end