p7 test data

p7 test data

Charles Lv7

p7 test data

P7由于无法与Mars对拍,所以debug难度很高,在此分享21级两位巨佬的p7测试数据及CPU对拍结果,并特此鸣谢数据提供者对我p7的巨大帮助!!!。

注:每届p7异常要求不同,tb写法也有差异,所以CPU对拍才是正道(bushi,所以一边写对才是正道!!!

内部异常

本测试方案覆盖所有异常,并未测试中断
Folding code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
.text
mtc0 $0, $12
ori $at, $0, 0xfffc
#====OV=====
lui $t0, 0x7fff
lui $t1, 0xffff
add $t2, $t0, $t1
sub $t2, $t0, $t1
sub $t2, $t1, $t0
lui $t1, 0x7fff
add $t2, $t0, $t1
ori $t1, $t1, 0xffff
addi $t2, $t1, 0xfffffff0
addi $t1, $t1, 0x0010

#=====SYSCALL=====
syscall

#=====ADEL=====
lui $t1, 0x7fff
jal label1
add $ra, $ra, $t1
label1:
jr $ra
nop
jal label2
addi $ra, $ra, 1
label2:
jr $ra
nop
ori $t0, $0, 0x7f00
ori $t2, $0, 0x7f20
sw $t0, 0($0)
lw $t0, 0($0)
lw $t0, 1($0)
lw $t0, 2($0)
lh $t0, 3($0)
lh $t0, 0($t0)
lh $t0, 2($t0)
lb $t0, 0($t0)
lb $t0, 3($t0)
loop_timer1:
lw $t1, 0($t0)
addi $t0, $t0, 4
bne $t0, $t2, loop_timer1
nop
ori $t0, $0, 0x3000
lw $t0, 0($t0)
lui $t0, 0x7fff
ori $t0, $t0, 0xffff
lw $t0, 1($t0)
lw $t0, -4($0)

#=====ADES=====
sw $0, 1($0)
sw $0, 2($0)
sh $0, 3($0)
sw $0, 4($0)
sh $0, 6($0)
sb $0, 7($0)
ori $t0, $0, 0x7f00
sh $0, 0($t0)
sh $0, 2($t0)
sb $0, 0($t0)
sb $0, 3($t0)
ori $t1, $0, 0x7f30
loop_timer2:
sw $0, 0($t0)
addi $t0, $t0, 4
bne $t0, $t1, loop_timer2
nop
ori $t0, $0, 0x3000
sw $0, 0($t0)
lui $t0, 0x7fff
ori $t0, $t0, 0xffff
sw $0, 1($t0)
sw $0, -1($0)

#=====ALTOGETHER=====
lui $t0, 0x7fff
ori $t1, $t0, 0xffff
sw $0, 0($t0)
addi $t1, $t1, 1
syscall

sw $0, 0($t0)
addi $t1, $t1, 1
nop

sw $0, 0($t0)
addi $t1, $t1, 0
syscall

sw $0, 0($0)
addi $t1, $t1, 1
syscall

lui $t0, 0x8000
addi $t1, $t1, 1
beq $t0, $t1, end
nop

end:
beq $0, $0, end
nop

.ktext 0x4180
_main_handler:
mfc0 $k0, $13
mfc0 $k0, $14
and $k0, $k0, $at
addi $k0, $k0, 4
mtc0 $k0, $14
sb $0, 0x7f20($0)
eret

外部中断

说明

1
2
3
4
5
6
7
8
9
- 0x3010 宏观pc对应写GRF指令时,给予外部中断
- 0x3014 宏观pc对应store类指令时,给予外部中断
- 0x301c 宏观pc对应mtc0指令时,给予外部中断
- 0x3020 宏观pc对应load类指令时,给予外部中断
- 0x3028 在stall状态下,给予外部中断
- 0x3034 宏观pc对应跳转指令,给予外部中断
- 0x3038 宏观pc对应延迟槽指令且此时存在异常时,给予外部中断
- 0x303c D级是跳转指令时,给予外部中断
- 0x307c stall刷出很多空泡,给予外部中断

其实这种流水pc和BD的方法很不“宏观”,这更像是用了某种技巧达到“宏观”的要求。 还有一种很好的处理思路是:从M级向前回溯,第一个不是空泡的指令就是中断的受害指令,这样有效的把指令空泡区分开,指令就是指令,空泡就是空泡,空泡也不是nop,nop是真正的指令

测试数据

Folding code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
.text 
lui $1,0xffff
ori $1,$1,0xfc01
mtc0 $1,$12
lui $2,0xffff
#int-grf
ori $2,$2,0x1234
#int-store
sw $2,0($0)
ori $3,$0,0xfc01
#int-mtc0
mtc0 $3,$12
#int-load
lw $4,0($0)
lw $5,0($0)
#int-stall
add $6,$5,$4
lui $7,0x7fff
lui $8,0x7fff
#int-beq
beq $7,$8,label1
#int&exc-BD
add $9,$7,$8
#int-D beq
addi $10,$0,0x0001
addi $11,$0,0x0002
beq $7,$8,label1
nop

label1:
mult $7,$8
syscall
div $7,$8
syscall
mthi $7
syscall
mtlo $8
syscall
mfhi $10
mflo $11
mult $7,$8
beq $7,$8,label2
#int-many nop
mflo $12
addi $12,$0,0x0001
addi $12,$0,0x0002

label2:
addi $13,$0,0x0001

end:
beq $0,$0,end
nop


.ktext 0x4180
main_handler:
mfc0 $26,$13
mfc0 $27,$14
ori $27,$0,0x007c
and $26,$27,$26
beq $0,$26,interrupt
nop
mfc0 $26,$14
add $26,$26,4
mtc0 $26,$14
beq $0,$0,return
nop

interrupt:
ori $27,$0,0x2137
sw $27,0x7f20($0)
beq $0,$0,return
nop

return:
eret
  • Title: p7 test data
  • Author: Charles
  • Created at : 2022-12-26 20:51:39
  • Updated at : 2026-05-11 20:11:25
  • Link: https://charles2530.github.io/2022/12/26/p7-test-data/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments