Skip to content

Commit 0123c85

Browse files
committed
Merge remote-tracking branch 'origin/patch'
2 parents cdbf926 + fb2daf5 commit 0123c85

File tree

7 files changed

+85
-34
lines changed

7 files changed

+85
-34
lines changed

Ghidra/Processors/Atmel/certification.manifest

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,5 @@ data/languages/avr8xmega.pspec||GHIDRA||||END|
3434
data/languages/avr8xmega.slaspec||GHIDRA||||END|
3535
data/manuals/AVR32.idx||GHIDRA||||END|
3636
data/manuals/AVR8.idx||GHIDRA||||END|
37+
data/patterns/AVR8_patterns.xml||GHIDRA||||END|
38+
data/patterns/patternconstraints.xml||GHIDRA||||END|

Ghidra/Processors/Atmel/data/languages/avr8.ldefs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,21 @@
2020
</language>
2121

2222
<language processor="AVR8"
23+
deprecated="true"
2324
endian="little"
24-
size="16"
25+
size="24"
2526
variant="extended"
2627
version="1.4"
27-
slafile="avr8e.sla"
28+
slafile="avr8eind.sla"
2829
processorspec="avr8.pspec"
2930
manualindexfile="../manuals/AVR8.idx"
3031
id="avr8:LE:16:extended">
31-
<description>AVR8 with 22-bit word addressable code space</description>
32+
<description>AVR8 with 22-bit word addressable with EIND code space</description>
3233
<compiler name="gcc" spec="avr8egcc.cspec" id="gcc"/>
33-
<external_name tool="gnu" name="avr:51"/>
3434
<external_name tool="IDA-PRO" name="avr"/>
3535
</language>
3636

37-
<language processor="AVR8"
37+
<language processor="AVR8"
3838
endian="little"
3939
size="24"
4040
variant="atmega256"
@@ -45,6 +45,7 @@
4545
id="avr8:LE:16:atmega256">
4646
<description>AVR8 for an Atmega 256</description>
4747
<compiler name="gcc" spec="avr8egcc.cspec" id="gcc"/>
48+
<external_name tool="gnu" name="avr:51"/>
4849
<external_name tool="gnu" name="avr:6"/>
4950
<external_name tool="IDA-PRO" name="avr"/>
5051
</language>

Ghidra/Processors/Atmel/data/languages/avr8egcc.cspec

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,10 @@
3838
<stackpointer register="SP" space="mem" growth="negative"/>
3939

4040
<default_proto>
41-
<prototype name="__stdcall" extrapop="3" stackshift="3" strategy="register">
41+
<prototype name="__stdcall" extrapop="3" stackshift="3">
4242
<input>
4343
<pentry minsize="1" maxsize="2">
44-
<register name="W"/>
44+
<register name="W"/> <!-- R25R24 -->
4545
</pentry>
4646
<pentry minsize="1" maxsize="2">
4747
<register name="R23R22"/>
@@ -67,14 +67,11 @@
6767
<pentry minsize="1" maxsize="2">
6868
<register name="R9R8"/>
6969
</pentry>
70-
<pentry minsize="1" maxsize="2">
71-
<register name="Z"/>
72-
</pentry>
73-
<!-- set to 20 on purpose, so that large values don't get assigned to stack -->
74-
<!-- They get allocated across register pairs, but layout algorithm too simple -->
75-
<pentry minsize="24" maxsize="500" align="1">
76-
<addr offset="20" space="stack"/>
77-
</pentry>
70+
<!-- Currently messes up parameter allocation, for known data types bigger than 2 -->
71+
<!-- strategy="packreg" planned to mitigate this problem -->
72+
<pentry minsize="1" maxsize="500" align="1">
73+
<addr offset="4" space="stack"/>
74+
</pentry>
7875
</input>
7976
<output>
8077
<pentry minsize="1" maxsize="2">
@@ -126,16 +123,22 @@
126123
</prototype>
127124
</default_proto>
128125

129-
<prototype name="__stackcall" extrapop="3" stackshift="3" strategy="register">
126+
<prototype name="__stackcall" extrapop="3" stackshift="3">
130127
<input>
131128
<pentry minsize="1" maxsize="500" align="1">
132-
<addr offset="1" space="stack"/>
129+
<addr offset="4" space="stack"/>
133130
</pentry>
134131
</input>
135132
<output>
136-
<pentry minsize="1" maxsize="2">
137-
<register name="W"/>
138-
</pentry>
133+
<pentry minsize="1" maxsize="2">
134+
<register name="W"/>
135+
</pentry>
136+
<pentry minsize="3" maxsize="4">
137+
<addr space="join" piece1="W" piece2="R23R22"/>
138+
</pentry>
139+
<pentry minsize="5" maxsize="8">
140+
<addr space="join" piece1="W" piece2="R23R22" piece3="R21R20" piece4="R19R18"/>
141+
</pentry>
139142
</output>
140143
<unaffected>
141144
<register name="SP"/>

Ghidra/Processors/Atmel/data/languages/avr8gcc.cspec

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,10 @@
3838
<stackpointer register="SP" space="mem" growth="negative"/>
3939

4040
<default_proto>
41-
<prototype name="__stdcall" extrapop="" stackshift="2" strategy="register">
41+
<prototype name="__stdcall" extrapop="2" stackshift="2">
4242
<input>
4343
<pentry minsize="1" maxsize="2">
44-
<register name="W"/>
44+
<register name="W"/> <!-- R25R24 -->
4545
</pentry>
4646
<pentry minsize="1" maxsize="2">
4747
<register name="R23R22"/>
@@ -67,14 +67,11 @@
6767
<pentry minsize="1" maxsize="2">
6868
<register name="R9R8"/>
6969
</pentry>
70-
<pentry minsize="1" maxsize="2">
71-
<register name="Z"/>
72-
</pentry>
73-
<!-- set to 20 on purpose, so that large values don't get assigned to stack -->
74-
<!-- They get allocated across register pairs, but layout algorithm too simple -->
75-
<pentry minsize="24" maxsize="500" align="1">
76-
<addr offset="20" space="stack"/>
77-
</pentry>
70+
<!-- Currently messes up parameter allocation, for known data types bigger than 2 -->
71+
<!-- strategy="packreg" planned to mitigate this problem -->
72+
<pentry minsize="1" maxsize="500" align="1">
73+
<addr offset="3" space="stack"/>
74+
</pentry>
7875
</input>
7976
<output>
8077
<pentry minsize="1" maxsize="2">
@@ -126,7 +123,7 @@
126123
</prototype>
127124
</default_proto>
128125

129-
<prototype name="__stackcall" extrapop="3" stackshift="3" strategy="register">
126+
<prototype name="__stackcall" extrapop="2" stackshift="2">
130127
<input>
131128
<pentry minsize="1" maxsize="500" align="1">
132129
<addr offset="3" space="stack"/>

Ghidra/Processors/Atmel/data/languages/avr8iarV1.cspec

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,27 @@
1515
<!-- <prototype name="__stdcall" extrapop="2" stackshift="2"> -->
1616
<prototype name="__stdcall" extrapop="0" stackshift="0" strategy="register">
1717
<input>
18-
<pentry minsize="1" maxsize="4">
18+
<pentry minsize="1" maxsize="2">
19+
<register name="R17R16"/>
20+
</pentry>
21+
<pentry minsize="3" maxsize="4">
1922
<addr space="join" piece1="R19R18" piece2="R17R16"/>
2023
</pentry>
21-
<pentry minsize="1" maxsize="4">
24+
<pentry minsize="1" maxsize="2">
25+
<register name="R21R20"/>
26+
</pentry>
27+
<pentry minsize="3" maxsize="4">
2228
<addr space="join" piece1="R23R22" piece2="R21R20"/>
2329
</pentry>
2430
<pentry minsize="1" maxsize="500" align="1">
2531
<addr offset="0" space="stack"/>
2632
</pentry>
2733
</input>
2834
<output>
29-
<pentry minsize="1" maxsize="4">
35+
<pentry minsize="1" maxsize="2">
36+
<register name="R17R16"/>
37+
</pentry>
38+
<pentry minsize="3" maxsize="4">
3039
<addr space="join" piece1="R19R18" piece2="R17R16"/>
3140
</pentry>
3241
</output>
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<patternlist>
2+
3+
<patternpairs totalbits="32" postbits="16">
4+
<prepatterns>
5+
<data>0x08 0x95</data> <!-- ret -->
6+
<data>0x18 0x95</data> <!-- reti -->
7+
</prepatterns>
8+
9+
<postpatterns>
10+
<data>....1111 1001001. ....1111 1001001. </data> <!-- push reg, push reg -->
11+
<funcstart/>
12+
</postpatterns>
13+
</patternpairs>
14+
15+
<pattern> <!-- 24-bit processors copy static bytes to mem -->
16+
<data>
17+
0x1. 0xe. <!-- ldi R17,<upper> -->
18+
0xa. 0xe. <!-- ldi Xlo,<memlo> -->
19+
0xb. 0xe. <!-- ldi Xhi,<memhi> -->
20+
0xe. 0xe. <!-- ldi Zlo,<codelo> -->
21+
0xf. 0xe. <!-- ldi Zhi,<codehi> -->
22+
0x0. 0xe. <!-- ldi R16,<codepage> -->
23+
0x0b 0xbf <!-- out RAMPZ,R16 -->
24+
0x02 0xc0 <!-- rjmp LAB_instr_next+2 -->
25+
0x07 0x90 <!-- elpm R0,Z+ -->
26+
0x0d 0x92 <!-- st X+,R0 -->
27+
0xa. 0x3. <!-- cpi Xlo,<lower> -->
28+
0xb1 0x07 <!-- cpc Xhi,R17 -->
29+
0xd9 0xf7 <!-- brbc inst_start-4,Zflg -->
30+
</data>
31+
<funcstart label="__do_copy_data"/>
32+
</pattern>
33+
34+
</patternlist>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<patternconstraints>
2+
<language id="avr8:*:*:*">
3+
<patternfile>AVR8_patterns.xml</patternfile>
4+
</language>
5+
</patternconstraints>

0 commit comments

Comments
 (0)