Mercurial > hg > index.cgi
annotate test/tests/opcodes6809.pl @ 577:e49d24f4a9a5
Correct bug in the object file output code leading to stack corruption
It turns out leaving a pointer to a stack allocated temporary in a
persistent data structure is not conducive to correct program operation.
Undo the export check setup in the object file output sequence so a
pointer to stack allocated memory is not left hanging when the function
returns. This seems to correct at least one mysterious crash bug, and
possibly others.
Thanks to Boisy Pitre for reporting the crash bug that led to this
discovery, as well as a previous crash bug that likely has the same
root cause.
Additional thanks to Ciaran Anscomb whose debugger wielding wizardry
revealed the exact location of this particular bit of unbrilliance.
author | William Astle <lost@l-w.ca> |
---|---|
date | Sat, 03 Aug 2024 14:30:06 -0600 |
parents | 3cd8aa013b88 |
children |
rev | line source |
---|---|
448
3cd8aa013b88
Change the perl invocations for the test bits to use /usr/bin/env
William Astle <lost@l-w.ca>
parents:
175
diff
changeset
|
1 #!/usr/bin/env perl |
175 | 2 # |
3 # these tests determine if the opcodes for each instruction, in each | |
4 # addressing mode, are correct. | |
5 # | |
6 # The following list is used to construct the tests. The key is the | |
7 # mneumonic and the value is a list of address mode characters as follows | |
8 # | |
9 # R: register/inherent | |
10 # I: immediate | |
11 # E: extended | |
12 # D: direct | |
13 # i: indexed | |
14 # r: register to register (TFR, etc.) | |
15 # p: psh/pul | |
16 # each letter is followed by an = and the 2 or 4 digit opcode in hex | |
17 # each entry is separated by a comma | |
18 | |
19 $lwasm = './lwasm/lwasm'; | |
20 | |
21 %insnlist = ( | |
22 'neg' => 'D=00,E=70,i=60', | |
23 'com' => 'D=03,E=73,i=63', | |
24 'lsr' => 'D=04,E=74,i=64', | |
25 'ror' => 'D=06,E=76,i=66', | |
26 'asr' => 'D=07,E=77,i=67', | |
27 'lsl' => 'D=08,E=78,i=68', | |
28 'rol' => 'D=09,E=79,i=69', | |
29 'dec' => 'D=0A,E=7A,i=6A', | |
30 'inc' => 'D=0C,E=7C,i=6C', | |
31 'tst' => 'D=0D,E=7D,i=6D', | |
32 'jmp' => 'D=0E,E=7E,i=6E', | |
33 'clr' => 'D=0F,E=7F,i=6F', | |
34 'nop' => 'R=12', | |
35 'sync' => 'R=13', | |
36 'lbra' => 'b=16', | |
37 'lbsr' => 'b=17', | |
38 'daa' => 'R=19', | |
39 'orcc' => 'I=1A', | |
40 'andcc' => 'I=1C', | |
41 'sex' => 'R=1D', | |
42 'exg' => 'r=1E', | |
43 'tfr' => 'r=1F', | |
44 'bra' => 'b=20', | |
45 'brn' => 'b=21', | |
46 'lbrn' => 'b=1021', | |
47 'bhi' => 'b=22', | |
48 'lbhi' => 'b=1022', | |
49 'bls' => 'b=23', | |
50 'lbls' => 'b=1023', | |
51 'bcc' => 'b=24', | |
52 'lbcc' => 'b=1024', | |
53 'bhs' => 'b=24', | |
54 'lbhs' => 'b=1024', | |
55 'bcs' => 'b=25', | |
56 'lbcs' => 'b=1025', | |
57 'blo' => 'b=25', | |
58 'lblo' => 'b=1025', | |
59 'bne' => 'b=26', | |
60 'lbne' => 'b=1026', | |
61 'beq' => 'b=27', | |
62 'lbeq' => 'b=1027', | |
63 'bvc' => 'b=28', | |
64 'lbvc' => 'b=1028', | |
65 'bvs' => 'b=29', | |
66 'lbvs' => 'b=1029', | |
67 'bpl' => 'b=2A', | |
68 'lbpl' => 'b=102A', | |
69 'bmi' => 'b=2B', | |
70 'lbmi' => 'b=102B', | |
71 'bge' => 'b=2C', | |
72 'lbge' => 'b=102C', | |
73 'blt' => 'b=2D', | |
74 'lblt' => 'b=102D', | |
75 'bgt' => 'b=2E', | |
76 'lbgt' => 'b=102E', | |
77 'ble' => 'b=2F', | |
78 'lble' => 'b=102F', | |
79 'leax' => 'i=30', | |
80 'leay' => 'i=31', | |
81 'leas' => 'i=32', | |
82 'leau' => 'i=33', | |
83 'pshs' => 'p=34', | |
84 'puls' => 'p=35', | |
85 'pshu' => 'p=36', | |
86 'pulu' => 'p=37', | |
87 'rts' => 'R=39', | |
88 'abx' => 'R=3A', | |
89 'rti' => 'R=3B', | |
90 'cwai' => 'I=3C', | |
91 'mul' => 'R=3D', | |
92 'swi' => 'R=3F', | |
93 'swi2' => 'R=103F', | |
94 'swi3' => 'R=113F', | |
95 'nega' => 'R=40', | |
96 'coma' => 'R=43', | |
97 'lsra' => 'R=44', | |
98 'rora' => 'R=46', | |
99 'asra' => 'R=47', | |
100 'lsla' => 'R=48', | |
101 'rola' => 'R=49', | |
102 'deca' => 'R=4A', | |
103 'inca' => 'R=4C', | |
104 'tsta' => 'R=4D', | |
105 'clra' => 'R=4F', | |
106 'negb' => 'R=50', | |
107 'comb' => 'R=53', | |
108 'lsrb' => 'R=54', | |
109 'rorb' => 'R=56', | |
110 'asrb' => 'R=57', | |
111 'lslb' => 'R=58', | |
112 'rolb' => 'R=59', | |
113 'decb' => 'R=5A', | |
114 'incb' => 'R=5C', | |
115 'tstb' => 'R=5D', | |
116 'clrb' => 'R=5F', | |
117 'suba' => 'I=80,D=90,i=A0,E=B0', | |
118 'cmpa' => 'I=81,D=91,i=A1,E=B1', | |
119 'sbca' => 'I=82,D=92,i=A2,E=B2', | |
120 'subd' => 'I=83,D=93,i=A3,E=B3', | |
121 'cmpd' => 'I=1083,D=1093,i=10A3,E=10B3', | |
122 'cmpu' => 'I=1183,D=1193,i=11A3,E=11B3', | |
123 'anda' => 'I=84,D=94,i=A4,E=B4', | |
124 'bita' => 'I=85,D=95,i=A5,E=B5', | |
125 'lda' => 'I=86,D=96,i=A6,E=B6', | |
126 'sta' => 'D=97,i=A7,E=B7', | |
127 'eora' => 'I=88,D=98,i=A8,E=B8', | |
128 'adca' => 'I=89,D=99,i=A9,E=B9', | |
129 'ora' => 'I=8A,D=9A,i=AA,E=BA', | |
130 'adda' => 'I=8B,D=9B,i=AB,E=BB', | |
131 'cmpx' => 'I=8C,D=9C,i=AC,E=BC', | |
132 'cmpy' => 'I=108C,D=109C,i=10AC,E=10BC', | |
133 'cmps' => 'I=118C,D=119C,i=11AC,E=11BC', | |
134 'bsr' => 'b=8D', | |
135 'jsr' => 'D=9D,i=AD,E=BD', | |
136 'ldx' => 'I=8E,D=9E,i=AE,E=BE', | |
137 'ldy' => 'I=108E,D=109E,i=10AE,E=10BE', | |
138 'stx' => 'D=9F,i=AF,E=BF', | |
139 'sty' => 'D=109F,i=10AF,E=10BF', | |
140 'subb' => 'I=C0,D=D0,i=E0,E=F0', | |
141 'cmpb' => 'I=C1,D=D1,i=E1,E=F1', | |
142 'sbcb' => 'I=C2,D=D2,i=E2,E=F2', | |
143 'addd' => 'I=C3,D=D3,i=E3,E=F3', | |
144 'andb' => 'I=C4,D=D4,i=E4,E=F4', | |
145 'bitb' => 'I=C5,D=D5,i=E5,E=F5', | |
146 'ldb' => 'I=C6,D=D6,i=E6,E=F6', | |
147 'stb' => 'D=D7,i=E7,E=F7', | |
148 'eorb' => 'I=C8,D=D8,i=E8,E=F8', | |
149 'adcb' => 'I=C9,D=D9,i=E9,E=F9', | |
150 'orb' => 'I=CA,D=DA,i=EA,E=FA', | |
151 'addb' => 'I=CB,D=DB,i=EB,E=FB', | |
152 'ldd' => 'I=CC,D=DC,i=EC,E=FC', | |
153 'std' => 'D=DD,i=ED,E=FD', | |
154 'ldu' => 'I=CE,D=DE,i=EE,E=FE', | |
155 'lds' => 'I=10CE,D=10DE,i=10EE,E=10FE', | |
156 'stu' => 'D=DF,i=EF,E=FF', | |
157 'sts' => 'D=10DF,i=10EF,E=10FF' | |
158 | |
159 ); | |
160 | |
161 foreach $i (keys %insnlist) | |
162 { | |
163 # print "$i ... $insnlist{$i}\n"; | |
164 @modes = split(/,/, $insnlist{$i}); | |
165 foreach $j (@modes) | |
166 { | |
167 ($mc, $oc) = split(/=/, $j); | |
168 $operand = ''; | |
169 if ($mc eq 'D') | |
170 { | |
171 $operand = '<0'; | |
172 } | |
173 elsif ($mc eq 'E') | |
174 { | |
175 $operand = '>0'; | |
176 } | |
177 elsif ($mc eq 'I') | |
178 { | |
179 $operand = '#0'; | |
180 } | |
181 elsif ($mc eq 'i') | |
182 { | |
183 $operand = ',x'; | |
184 } | |
185 elsif ($mc eq 'r') | |
186 { | |
187 $operand = 'a,a'; | |
188 } | |
189 elsif ($mc eq 'p') | |
190 { | |
191 $operand = 'cc'; | |
192 } | |
193 elsif ($mc eq 'b') | |
194 { | |
195 $operand = '*'; | |
196 } | |
197 $asmcode = "\t$i $operand"; | |
198 | |
199 # now feed the asm code to the assembler and fetch the result | |
200 $tf = ".asmtmp.$$.$i.$mc"; | |
201 open H, ">$tf.asm"; | |
202 print H "$asmcode\n"; | |
203 close H; | |
204 $r = `$lwasm --raw --list -o $tf $tf.asm`; | |
205 open H, "<$tf"; | |
206 binmode H; | |
207 $buffer = ''; | |
208 $r = read(H, $buffer, 10); | |
209 close H; | |
210 unlink $tf; | |
211 unlink "$tf.asm"; | |
212 if ($r == 0) | |
213 { | |
214 $st = 'FAIL (no result)'; | |
215 } | |
216 else | |
217 { | |
218 @bytes = split(//,$buffer); | |
219 $rc = sprintf('%02X', ord($bytes[0])); | |
220 if (length($oc) > 2) | |
221 { | |
222 $rc .= sprintf('%02X', ord($bytes[1])); | |
223 } | |
224 if ($rc ne $oc) | |
225 { | |
226 $st = "FAIL ($rc ≠ $oc, $asmcode)"; | |
227 } | |
228 else | |
229 { | |
230 $st = 'PASS'; | |
231 } | |
232 } | |
233 print "$i" . "_$mc $st\n"; | |
234 } | |
235 } |