diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/scsi/aic7xxx/aicasm/aicasm.c | 23 | ||||
-rw-r--r-- | drivers/scsi/aic7xxx/aicasm/aicasm_gram.y | 19 | ||||
-rw-r--r-- | drivers/scsi/aic7xxx/aicasm/aicasm_insformat.h | 88 | ||||
-rw-r--r-- | drivers/scsi/aic7xxx/aicasm/aicasm_scan.l | 27 |
4 files changed, 140 insertions, 17 deletions
diff --git a/drivers/scsi/aic7xxx/aicasm/aicasm.c b/drivers/scsi/aic7xxx/aicasm/aicasm.c index f936b691232f..924102720b14 100644 --- a/drivers/scsi/aic7xxx/aicasm/aicasm.c +++ b/drivers/scsi/aic7xxx/aicasm/aicasm.c | |||
@@ -37,7 +37,7 @@ | |||
37 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | 37 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
38 | * POSSIBILITY OF SUCH DAMAGES. | 38 | * POSSIBILITY OF SUCH DAMAGES. |
39 | * | 39 | * |
40 | * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm.c#22 $ | 40 | * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm.c#23 $ |
41 | * | 41 | * |
42 | * $FreeBSD$ | 42 | * $FreeBSD$ |
43 | */ | 43 | */ |
@@ -609,10 +609,10 @@ output_listing(char *ifilename) | |||
609 | 609 | ||
610 | while (line < cur_instr->srcline) { | 610 | while (line < cur_instr->srcline) { |
611 | fgets(buf, sizeof(buf), ifile); | 611 | fgets(buf, sizeof(buf), ifile); |
612 | fprintf(listfile, "\t\t%s", buf); | 612 | fprintf(listfile, " \t%s", buf); |
613 | line++; | 613 | line++; |
614 | } | 614 | } |
615 | fprintf(listfile, "%03x %02x%02x%02x%02x", instrptr, | 615 | fprintf(listfile, "%04x %02x%02x%02x%02x", instrptr, |
616 | #ifdef __LITTLE_ENDIAN | 616 | #ifdef __LITTLE_ENDIAN |
617 | cur_instr->format.bytes[0], | 617 | cur_instr->format.bytes[0], |
618 | cur_instr->format.bytes[1], | 618 | cur_instr->format.bytes[1], |
@@ -624,14 +624,23 @@ output_listing(char *ifilename) | |||
624 | cur_instr->format.bytes[1], | 624 | cur_instr->format.bytes[1], |
625 | cur_instr->format.bytes[0]); | 625 | cur_instr->format.bytes[0]); |
626 | #endif | 626 | #endif |
627 | fgets(buf, sizeof(buf), ifile); | 627 | /* |
628 | fprintf(listfile, "\t%s", buf); | 628 | * Macro expansions can cause several instructions |
629 | line++; | 629 | * to be output for a single source line. Only |
630 | * advance the line once in these cases. | ||
631 | */ | ||
632 | if (line == cur_instr->srcline) { | ||
633 | fgets(buf, sizeof(buf), ifile); | ||
634 | fprintf(listfile, "\t%s", buf); | ||
635 | line++; | ||
636 | } else { | ||
637 | fprintf(listfile, "\n"); | ||
638 | } | ||
630 | instrptr++; | 639 | instrptr++; |
631 | } | 640 | } |
632 | /* Dump the remainder of the file */ | 641 | /* Dump the remainder of the file */ |
633 | while(fgets(buf, sizeof(buf), ifile) != NULL) | 642 | while(fgets(buf, sizeof(buf), ifile) != NULL) |
634 | fprintf(listfile, "\t\t%s", buf); | 643 | fprintf(listfile, " %s", buf); |
635 | 644 | ||
636 | fclose(ifile); | 645 | fclose(ifile); |
637 | } | 646 | } |
diff --git a/drivers/scsi/aic7xxx/aicasm/aicasm_gram.y b/drivers/scsi/aic7xxx/aicasm/aicasm_gram.y index 67e046d96625..c328596def3c 100644 --- a/drivers/scsi/aic7xxx/aicasm/aicasm_gram.y +++ b/drivers/scsi/aic7xxx/aicasm/aicasm_gram.y | |||
@@ -38,7 +38,7 @@ | |||
38 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | 38 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
39 | * POSSIBILITY OF SUCH DAMAGES. | 39 | * POSSIBILITY OF SUCH DAMAGES. |
40 | * | 40 | * |
41 | * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_gram.y#29 $ | 41 | * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_gram.y#30 $ |
42 | * | 42 | * |
43 | * $FreeBSD$ | 43 | * $FreeBSD$ |
44 | */ | 44 | */ |
@@ -157,6 +157,8 @@ static int is_download_const(expression_t *immed); | |||
157 | 157 | ||
158 | %token T_END_CS | 158 | %token T_END_CS |
159 | 159 | ||
160 | %token T_PAD_PAGE | ||
161 | |||
160 | %token T_FIELD | 162 | %token T_FIELD |
161 | 163 | ||
162 | %token T_ENUM | 164 | %token T_ENUM |
@@ -189,6 +191,10 @@ static int is_download_const(expression_t *immed); | |||
189 | 191 | ||
190 | %token <value> T_OR | 192 | %token <value> T_OR |
191 | 193 | ||
194 | /* 16 bit extensions */ | ||
195 | %token <value> T_OR16 T_AND16 T_XOR16 T_ADD16 | ||
196 | %token <value> T_ADC16 T_MVI16 T_TEST16 T_CMP16 T_CMPXCHG | ||
197 | |||
192 | %token T_RET | 198 | %token T_RET |
193 | 199 | ||
194 | %token T_NOP | 200 | %token T_NOP |
@@ -207,7 +213,7 @@ static int is_download_const(expression_t *immed); | |||
207 | 213 | ||
208 | %type <expression> expression immediate immediate_or_a | 214 | %type <expression> expression immediate immediate_or_a |
209 | 215 | ||
210 | %type <value> export ret f1_opcode f2_opcode jmp_jc_jnc_call jz_jnz je_jne | 216 | %type <value> export ret f1_opcode f2_opcode f4_opcode jmp_jc_jnc_call jz_jnz je_jne |
211 | 217 | ||
212 | %type <value> mode_value mode_list macro_arglist | 218 | %type <value> mode_value mode_list macro_arglist |
213 | 219 | ||
@@ -1304,6 +1310,15 @@ f2_opcode: | |||
1304 | | T_ROR { $$ = AIC_OP_ROR; } | 1310 | | T_ROR { $$ = AIC_OP_ROR; } |
1305 | ; | 1311 | ; |
1306 | 1312 | ||
1313 | f4_opcode: | ||
1314 | T_OR16 { $$ = AIC_OP_OR16; } | ||
1315 | | T_AND16 { $$ = AIC_OP_AND16; } | ||
1316 | | T_XOR16 { $$ = AIC_OP_XOR16; } | ||
1317 | | T_ADD16 { $$ = AIC_OP_ADD16; } | ||
1318 | | T_ADC16 { $$ = AIC_OP_ADC16; } | ||
1319 | | T_MVI16 { $$ = AIC_OP_MVI16; } | ||
1320 | ; | ||
1321 | |||
1307 | code: | 1322 | code: |
1308 | f2_opcode destination ',' expression opt_source ret ';' | 1323 | f2_opcode destination ',' expression opt_source ret ';' |
1309 | { | 1324 | { |
diff --git a/drivers/scsi/aic7xxx/aicasm/aicasm_insformat.h b/drivers/scsi/aic7xxx/aicasm/aicasm_insformat.h index e64f802bbaaa..9df9e2ce3538 100644 --- a/drivers/scsi/aic7xxx/aicasm/aicasm_insformat.h +++ b/drivers/scsi/aic7xxx/aicasm/aicasm_insformat.h | |||
@@ -37,13 +37,14 @@ | |||
37 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | 37 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
38 | * POSSIBILITY OF SUCH DAMAGES. | 38 | * POSSIBILITY OF SUCH DAMAGES. |
39 | * | 39 | * |
40 | * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_insformat.h#11 $ | 40 | * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_insformat.h#12 $ |
41 | * | 41 | * |
42 | * $FreeBSD$ | 42 | * $FreeBSD$ |
43 | */ | 43 | */ |
44 | 44 | ||
45 | #include <asm/byteorder.h> | 45 | #include <asm/byteorder.h> |
46 | 46 | ||
47 | /* 8bit ALU logic operations */ | ||
47 | struct ins_format1 { | 48 | struct ins_format1 { |
48 | #ifdef __LITTLE_ENDIAN | 49 | #ifdef __LITTLE_ENDIAN |
49 | uint32_t immediate : 8, | 50 | uint32_t immediate : 8, |
@@ -62,6 +63,7 @@ struct ins_format1 { | |||
62 | #endif | 63 | #endif |
63 | }; | 64 | }; |
64 | 65 | ||
66 | /* 8bit ALU shift/rotate operations */ | ||
65 | struct ins_format2 { | 67 | struct ins_format2 { |
66 | #ifdef __LITTLE_ENDIAN | 68 | #ifdef __LITTLE_ENDIAN |
67 | uint32_t shift_control : 8, | 69 | uint32_t shift_control : 8, |
@@ -80,6 +82,7 @@ struct ins_format2 { | |||
80 | #endif | 82 | #endif |
81 | }; | 83 | }; |
82 | 84 | ||
85 | /* 8bit branch control operations */ | ||
83 | struct ins_format3 { | 86 | struct ins_format3 { |
84 | #ifdef __LITTLE_ENDIAN | 87 | #ifdef __LITTLE_ENDIAN |
85 | uint32_t immediate : 8, | 88 | uint32_t immediate : 8, |
@@ -96,10 +99,68 @@ struct ins_format3 { | |||
96 | #endif | 99 | #endif |
97 | }; | 100 | }; |
98 | 101 | ||
102 | /* 16bit ALU logic operations */ | ||
103 | struct ins_format4 { | ||
104 | #ifdef __LITTLE_ENDIAN | ||
105 | uint32_t opcode_ext : 8, | ||
106 | source : 9, | ||
107 | destination : 9, | ||
108 | ret : 1, | ||
109 | opcode : 4, | ||
110 | parity : 1; | ||
111 | #else | ||
112 | uint32_t parity : 1, | ||
113 | opcode : 4, | ||
114 | ret : 1, | ||
115 | destination : 9, | ||
116 | source : 9, | ||
117 | opcode_ext : 8; | ||
118 | #endif | ||
119 | }; | ||
120 | |||
121 | /* 16bit branch control operations */ | ||
122 | struct ins_format5 { | ||
123 | #ifdef __LITTLE_ENDIAN | ||
124 | uint32_t opcode_ext : 8, | ||
125 | source : 9, | ||
126 | address : 10, | ||
127 | opcode : 4, | ||
128 | parity : 1; | ||
129 | #else | ||
130 | uint32_t parity : 1, | ||
131 | opcode : 4, | ||
132 | address : 10, | ||
133 | source : 9, | ||
134 | opcode_ext : 8; | ||
135 | #endif | ||
136 | }; | ||
137 | |||
138 | /* Far branch operations */ | ||
139 | struct ins_format6 { | ||
140 | #ifdef __LITTLE_ENDIAN | ||
141 | uint32_t page : 3, | ||
142 | opcode_ext : 5, | ||
143 | source : 9, | ||
144 | address : 10, | ||
145 | opcode : 4, | ||
146 | parity : 1; | ||
147 | #else | ||
148 | uint32_t parity : 1, | ||
149 | opcode : 4, | ||
150 | address : 10, | ||
151 | source : 9, | ||
152 | opcode_ext : 5, | ||
153 | page : 3; | ||
154 | #endif | ||
155 | }; | ||
156 | |||
99 | union ins_formats { | 157 | union ins_formats { |
100 | struct ins_format1 format1; | 158 | struct ins_format1 format1; |
101 | struct ins_format2 format2; | 159 | struct ins_format2 format2; |
102 | struct ins_format3 format3; | 160 | struct ins_format3 format3; |
161 | struct ins_format4 format4; | ||
162 | struct ins_format5 format5; | ||
163 | struct ins_format6 format6; | ||
103 | uint8_t bytes[4]; | 164 | uint8_t bytes[4]; |
104 | uint32_t integer; | 165 | uint32_t integer; |
105 | }; | 166 | }; |
@@ -118,6 +179,8 @@ struct instruction { | |||
118 | #define AIC_OP_ROL 0x5 | 179 | #define AIC_OP_ROL 0x5 |
119 | #define AIC_OP_BMOV 0x6 | 180 | #define AIC_OP_BMOV 0x6 |
120 | 181 | ||
182 | #define AIC_OP_MVI16 0x7 | ||
183 | |||
121 | #define AIC_OP_JMP 0x8 | 184 | #define AIC_OP_JMP 0x8 |
122 | #define AIC_OP_JC 0x9 | 185 | #define AIC_OP_JC 0x9 |
123 | #define AIC_OP_JNC 0xa | 186 | #define AIC_OP_JNC 0xa |
@@ -131,3 +194,26 @@ struct instruction { | |||
131 | #define AIC_OP_SHL 0x10 | 194 | #define AIC_OP_SHL 0x10 |
132 | #define AIC_OP_SHR 0x20 | 195 | #define AIC_OP_SHR 0x20 |
133 | #define AIC_OP_ROR 0x30 | 196 | #define AIC_OP_ROR 0x30 |
197 | |||
198 | /* 16bit Ops. Low byte main opcode. High byte extended opcode. */ | ||
199 | #define AIC_OP_OR16 0x8005 | ||
200 | #define AIC_OP_AND16 0x8105 | ||
201 | #define AIC_OP_XOR16 0x8205 | ||
202 | #define AIC_OP_ADD16 0x8305 | ||
203 | #define AIC_OP_ADC16 0x8405 | ||
204 | #define AIC_OP_JNE16 0x8805 | ||
205 | #define AIC_OP_JNZ16 0x8905 | ||
206 | #define AIC_OP_JE16 0x8C05 | ||
207 | #define AIC_OP_JZ16 0x8B05 | ||
208 | #define AIC_OP_JMP16 0x9005 | ||
209 | #define AIC_OP_JC16 0x9105 | ||
210 | #define AIC_OP_JNC16 0x9205 | ||
211 | #define AIC_OP_CALL16 0x9305 | ||
212 | #define AIC_OP_CALL16 0x9305 | ||
213 | |||
214 | /* Page extension is low three bits of second opcode byte. */ | ||
215 | #define AIC_OP_JMPF 0xA005 | ||
216 | #define AIC_OP_CALLF 0xB005 | ||
217 | #define AIC_OP_JCF 0xC005 | ||
218 | #define AIC_OP_JNCF 0xD005 | ||
219 | #define AIC_OP_CMPXCHG 0xE005 | ||
diff --git a/drivers/scsi/aic7xxx/aicasm/aicasm_scan.l b/drivers/scsi/aic7xxx/aicasm/aicasm_scan.l index 45c0b233d0bc..7c3983f868a9 100644 --- a/drivers/scsi/aic7xxx/aicasm/aicasm_scan.l +++ b/drivers/scsi/aic7xxx/aicasm/aicasm_scan.l | |||
@@ -38,7 +38,7 @@ | |||
38 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | 38 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
39 | * POSSIBILITY OF SUCH DAMAGES. | 39 | * POSSIBILITY OF SUCH DAMAGES. |
40 | * | 40 | * |
41 | * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_scan.l#19 $ | 41 | * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_scan.l#20 $ |
42 | * | 42 | * |
43 | * $FreeBSD$ | 43 | * $FreeBSD$ |
44 | */ | 44 | */ |
@@ -132,7 +132,7 @@ if[ \t]*\( { | |||
132 | *string_buf_ptr++ = *yptr++; | 132 | *string_buf_ptr++ = *yptr++; |
133 | } | 133 | } |
134 | } | 134 | } |
135 | 135 | else { return T_ELSE; } | |
136 | VERSION { return T_VERSION; } | 136 | VERSION { return T_VERSION; } |
137 | PREFIX { return T_PREFIX; } | 137 | PREFIX { return T_PREFIX; } |
138 | PATCH_ARG_LIST { return T_PATCH_ARG_LIST; } | 138 | PATCH_ARG_LIST { return T_PATCH_ARG_LIST; } |
@@ -173,10 +173,6 @@ RW|RO|WO { | |||
173 | yylval.value = WO; | 173 | yylval.value = WO; |
174 | return T_MODE; | 174 | return T_MODE; |
175 | } | 175 | } |
176 | BEGIN_CRITICAL { return T_BEGIN_CS; } | ||
177 | END_CRITICAL { return T_END_CS; } | ||
178 | SET_SRC_MODE { return T_SET_SRC_MODE; } | ||
179 | SET_DST_MODE { return T_SET_DST_MODE; } | ||
180 | field { return T_FIELD; } | 176 | field { return T_FIELD; } |
181 | enum { return T_ENUM; } | 177 | enum { return T_ENUM; } |
182 | mask { return T_MASK; } | 178 | mask { return T_MASK; } |
@@ -192,6 +188,13 @@ none { return T_NONE; } | |||
192 | sindex { return T_SINDEX; } | 188 | sindex { return T_SINDEX; } |
193 | A { return T_A; } | 189 | A { return T_A; } |
194 | 190 | ||
191 | /* Instruction Formatting */ | ||
192 | PAD_PAGE { return T_PAD_PAGE; } | ||
193 | BEGIN_CRITICAL { return T_BEGIN_CS; } | ||
194 | END_CRITICAL { return T_END_CS; } | ||
195 | SET_SRC_MODE { return T_SET_SRC_MODE; } | ||
196 | SET_DST_MODE { return T_SET_DST_MODE; } | ||
197 | |||
195 | /* Opcodes */ | 198 | /* Opcodes */ |
196 | shl { return T_SHL; } | 199 | shl { return T_SHL; } |
197 | shr { return T_SHR; } | 200 | shr { return T_SHR; } |
@@ -223,7 +226,17 @@ and { return T_AND; } | |||
223 | or { return T_OR; } | 226 | or { return T_OR; } |
224 | ret { return T_RET; } | 227 | ret { return T_RET; } |
225 | nop { return T_NOP; } | 228 | nop { return T_NOP; } |
226 | else { return T_ELSE; } | 229 | |
230 | /* ARP2 16bit extensions */ | ||
231 | or16 { return T_OR16; } | ||
232 | and16 { return T_AND16; } | ||
233 | xor16 { return T_XOR16; } | ||
234 | add16 { return T_ADD16; } | ||
235 | adc16 { return T_ADC16; } | ||
236 | mvi16 { return T_MVI16; } | ||
237 | test16 { return T_TEST16; } | ||
238 | cmp16 { return T_CMP16; } | ||
239 | cmpxchg { return T_CMPXCHG; } | ||
227 | 240 | ||
228 | /* Allowed Symbols */ | 241 | /* Allowed Symbols */ |
229 | \<\< { return T_EXPR_LSHIFT; } | 242 | \<\< { return T_EXPR_LSHIFT; } |