Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Throw Instruction Error if last instruction of ZOL is a branch #197

Open
shahab-vahedi opened this issue Jul 19, 2023 · 0 comments
Open
Labels
bug Something isn't working wontfix This will not be worked on

Comments

@shahab-vahedi
Copy link
Member

QEMU must throw an exception when

  1. The CPU is of type archs
  2. the last instruction of the loop body is a branch
$ cat lp.s
  .text
  .global __start

  __start:
    mov     r0, 0
    mov     r1, 1
    mov     r2, 2
    mov     lp_count, r2
    nop_s
    lp      @1f
    add     r0, r0, 1
    breq  r1, r2, @bad
  1:
    brne    r0, r2, @bad
    mov     r0, 0x1337
    st      1, [0xF0000008]
    flag    1
  bad:
    mov     r0, 0xbad
    st      1, [0xF0000008]
    flag    1
  end:

$ arc-elf32-gcc -Wl,-T,tarc.ld test.s ivt.S -g3 -nostartfiles -o test -mcpu=arcem

$ nsimdrv -p nsim_isa_family=av2hs            \
          -p nsim_isa_div_rem_option=2        \
          -p nsim_isa_number_of_interrupts=32 \
          -p nsim_isa_core=4                  \
          -p nsim_isa_mpy_option=2            \
          -prop=nsim_debug=4                  \
          -prop=nsim_trace-output=run.log     \
          -on=trace                           \
          test

$ cat run.log
[0x00000100] 0x204a0000  K       mov            r0,0x0 : (w0) r0 <= 0x00000000 *
[0x00000104] 0x214a0040  K       mov            r1,0x1 : (w0) r1 <= 0x00000001 *
[0x00000108] 0x224a0080  K       mov            r2,0x2 : (w0) r2 <= 0x00000002 *
[0x0000010c] 0x240a7080  K       mov            r60,r2 : (w0) r60 <= 0x00000002 *
[0x00000110] 0x78e0      K       nop_s           *
[0x00000112] 0x20a801c0  K       lp             0xe : LP_START <= 0x00000116, LP_END <= 0x0000011e, LP_COUNT = 2 *
[0x00000116] 0x20400040  K       add            r0,r0,0x1 : (w0) r0 <= 0x00000001 *
[0x0000011a] 0x091f0080  K       breq           r1,r2,0x1e
 EXCEPTION RAISED: 
	ECR      <= 0x00020100 - VECTOR:InstructionError
	ERET     <= 0x0000011a
	ERSTATUS <= 0x00000000
	BTA      <= 0x00000000
	EFA      <= 0x0000011a
	PC       <= 0x0000014c
	STATUS32 <= 0x00001020

Also, when

  1. The CPU is of type arc{em,hs}
  2. The delay slot of a branch instruction is straddled over the end of the loop body

Notice the the breq.d and the "nsim_isa_family=av2em" below.

$ cat lp.s
  .text
  .global __start

  __start:
    mov     r0, 0
    mov     r1, 1
    mov     r2, 2
    mov     lp_count, r2
    nop_s
    lp      @1f
    add     r0, r0, 1
    breq.d  r1, r2, @bad
  1:
    nop
    brne    r0, r2, @bad
    mov     r0, 0x1337
    st      1, [0xF0000008]
    flag    1
  bad:
    mov     r0, 0xbad
    st      1, [0xF0000008]
    flag    1
  end:

$ arc-elf32-gcc -Wl,-T,tarc.ld test.s ivt.S -g3 -nostartfiles -o test -mcpu=arcem

$ nsimdrv -p nsim_isa_family=av2em            \
          -p nsim_isa_div_rem_option=2        \
          -p nsim_isa_number_of_interrupts=32 \
          -p nsim_isa_core=4                  \
          -p nsim_isa_mpy_option=2            \
          -prop=nsim_debug=4                  \
          -prop=nsim_trace-output=run.log     \
          -on=trace                           \
          test

$ cat run.log
[0x00000100] 0x204a0000  K       mov            r0,0x0 : (w0) r0 <= 0x00000000 *
[0x00000104] 0x214a0040  K       mov            r1,0x1 : (w0) r1 <= 0x00000001 *
[0x00000108] 0x224a0080  K       mov            r2,0x2 : (w0) r2 <= 0x00000002 *
[0x0000010c] 0x240a7080  K       mov            r60,r2 : (w0) r60 <= 0x00000002 *
[0x00000110] 0x78e0      K       nop_s           *
[0x00000112] 0x20a801c0  K       lp             0xe : LP_START <= 0x00000116, LP_END <= 0x0000011e, LP_COUNT = 2 *
[0x00000116] 0x20400040  K       add            r0,r0,0x1 : (w0) r0 <= 0x00000001 *
[0x0000011a] 0x092300a0  K       breq.d         r1,r2,0x22
 EXCEPTION RAISED: 
	ECR      <= 0x00020100 - VECTOR:InstructionError
	ERET     <= 0x0000011a
	ERSTATUS <= 0x00000000
	BTA      <= 0x00000000
	EFA      <= 0x0000011a
	PC       <= 0x00000150
	STATUS32 <= 0x00001020
@shahab-vahedi shahab-vahedi added the bug Something isn't working label Jul 19, 2023
@claziss claziss added the wontfix This will not be worked on label Jul 19, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working wontfix This will not be worked on
Projects
None yet
Development

No branches or pull requests

2 participants