OpenCores
URL https://opencores.org/ocsvn/ao486/ao486/trunk

Subversion Repositories ao486

[/] [ao486/] [trunk/] [rtl/] [ao486/] [commands/] [CMD_RET_far.txt] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 alfik
 
2
3
`define CMD_RET_far     #AUTOGEN_NEXT_CMD
4
 
5
// glob_param_1[15:0]  --> new cs selector
6
// glob_param_1[18:16] --> cs segment: 1
7
// glob_param_2[31:0]  --> eip
8
// glob_param_3 --> backup mc_param_1
9
// glob_param_4 --> esp
10
 
11
`define CMDEX_RET_far_STEP_1        4'd1
12
`define CMDEX_RET_far_STEP_2        4'd2
13
`define CMDEX_RET_far_real_STEP_3   4'd3
14
`define CMDEX_RET_far_same_STEP_3   4'd4
15
`define CMDEX_RET_far_same_STEP_4   4'd5
16
`define CMDEX_RET_far_outer_STEP_3  4'd6
17
`define CMDEX_RET_far_outer_STEP_4  4'd7
18
`define CMDEX_RET_far_outer_STEP_5  4'd8
19
`define CMDEX_RET_far_outer_STEP_6  4'd9
20
`define CMDEX_RET_far_outer_STEP_7  4'd10
21
22
 
23
24
(dec_ready_one && decoder[7:0] == 8'hCB) || (dec_ready_one_two && decoder[7:0] == 8'hCA)
25
`CMD_RET_far
26
SET(dec_cmdex, `CMDEX_RET_far_STEP_1);
27
IF(decoder[0] == 1'b0); SET(consume_one_two); ELSE(); SET(consume_one); ENDIF();
28
SET(dec_is_complex);
29
30
 
31
32
`CMDEX_RET_far_STEP_1
33
`CMDEX_RET_far_STEP_2
34
CALL(`CMDEX_load_seg_STEP_1);
35
DIRECT(`CMD_RET_far, (real_mode || v8086_mode)? `CMDEX_RET_far_real_STEP_3 : (glob_param_1[`SELECTOR_BITS_RPL] == cpl)? `CMDEX_RET_far_same_STEP_3 : `CMDEX_RET_far_outer_STEP_3);
36
 
37
IF(`CMDEX_RET_far_real_STEP_3);
38
    LOOP(`CMDEX_RET_far_real_STEP_3);
39
ENDIF();
40
 
41
IF(`CMDEX_RET_far_same_STEP_3);
42
    LOOP(`CMDEX_RET_far_same_STEP_4);
43
ENDIF();
44
 
45
IF(`CMDEX_RET_far_outer_STEP_3);
46
    `CMDEX_RET_far_outer_STEP_4
47
    CALL(`CMDEX_load_seg_STEP_1);
48
    `CMDEX_RET_far_outer_STEP_5
49
    `CMDEX_RET_far_outer_STEP_6
50
    LOOP(`CMDEX_RET_far_outer_STEP_7);
51
ENDIF();
52
53
 
54
55
IF(rd_cmd == `CMD_RET_far && rd_cmdex == `CMDEX_RET_far_outer_STEP_3);
56
 
57
    SET(address_stack_pop_next);
58
    SET(address_stack_pop_esp_prev);
59
 
60
    SET(rd_glob_param_1_set, rd_ready);
61
    SET(rd_glob_param_1_value, { `MC_PARAM_1_FLAG_CPL_FROM_PARAM_3, `SEGMENT_SS, read_4[15:0] }); // read ss
62
 
63
    SET(rd_glob_param_3_set);
64
    SET(rd_glob_param_3_value, glob_param_1);
65
 
66
    SET(rd_glob_descriptor_2_set);
67
    SET(rd_glob_descriptor_2_value, glob_descriptor);
68
 
69
    SET(read_length_word);
70
    SET(read_virtual);
71
 
72
    IF(~(read_for_rd_ready)); SET(rd_waiting); ENDIF();
73
ENDIF();
74
75
 
76
77
IF(rd_cmd == `CMD_RET_far && rd_cmdex == `CMDEX_RET_far_STEP_1);
78
 
79
    SET(address_stack_pop,       real_mode || v8086_mode);
80
    SET(address_stack_pop_next,  protected_mode);
81
    SET(address_stack_save);
82
    SET(address_stack_for_ret_first);
83
 
84
    IF(rd_mutex_busy_memory); SET(rd_waiting); // waiting for esp in 'address_waiting'
85
    ELSE();
86
 
87
        IF(real_mode || v8086_mode);
88
            SET(rd_glob_param_2_set);
89
            SET(rd_glob_param_2_value, (rd_operand_16bit)? { 16'd0, read_4[15:0] } : read_4); // read eip
90
        ENDIF();
91
 
92
        IF(protected_mode);
93
            SET(rd_glob_param_1_set);
94
            SET(rd_glob_param_1_value, { `MC_PARAM_1_FLAG_NO_WRITE, `SEGMENT_CS, read_4[15:0] }); // read cs
95
        ENDIF();
96
 
97
        SET(read_virtual);
98
 
99
        IF(~(read_for_rd_ready)); SET(rd_waiting); ENDIF();
100
    ENDIF();
101
ENDIF();
102
103
 
104
105
IF(rd_cmd == `CMD_RET_far && rd_cmdex == `CMDEX_RET_far_STEP_2);
106
 
107
    SET(address_stack_pop_speedup,  real_mode || v8086_mode);
108
    SET(address_stack_pop,          real_mode || v8086_mode);
109
 
110
    SET(address_stack_pop_next,     protected_mode);
111
 
112
    IF(rd_mutex_busy_memory); SET(rd_waiting); // waiting for esp in 'address_waiting'
113
    ELSE();
114
 
115
        IF(real_mode || v8086_mode);
116
            SET(rd_glob_param_1_set);
117
            SET(rd_glob_param_1_value, { `MC_PARAM_1_FLAG_NO_WRITE, `SEGMENT_CS, read_4[15:0] }); // read cs
118
        ENDIF();
119
 
120
        IF(protected_mode);
121
            SET(rd_glob_param_2_set);
122
            SET(rd_glob_param_2_value, (rd_operand_16bit)? { 16'd0, read_4[15:0] } : read_4); // read eip
123
        ENDIF();
124
 
125
        SET(read_virtual);
126
 
127
        IF(~(read_for_rd_ready)); SET(rd_waiting); ENDIF();
128
    ENDIF();
129
ENDIF();
130
131
 
132
133
IF(rd_cmd == `CMD_RET_far && rd_cmdex == `CMDEX_RET_far_outer_STEP_3);
134
    SET(address_stack_save);
135
    SET(address_stack_for_ret_second);
136
ENDIF();
137
138
 
139
 
140
141
IF(rd_cmd == `CMD_RET_far && rd_cmdex == `CMDEX_RET_far_outer_STEP_4);
142
 
143
    SET(address_stack_pop_next);
144
 
145
    SET(rd_glob_param_4_set);
146
    SET(rd_glob_param_4_value, (rd_operand_16bit)? { 16'd0, read_4[15:0] } : read_4); // read esp
147
 
148
    SET(read_virtual);
149
 
150
    IF(~(read_for_rd_ready)); SET(rd_waiting); ENDIF();
151
ENDIF();
152
153
 
154
155
IF(exe_cmd == `CMD_RET_far  && exe_cmdex == `CMDEX_RET_far_STEP_1);
156
    SET(offset_pop);
157
ENDIF();
158
159
 
160
161
IF(exe_cmd == `CMD_RET_far && exe_cmdex == `CMDEX_RET_far_STEP_2);
162
 
163
    IF((v8086_mode || real_mode) && glob_param_2 > cs_limit); // protected cs null check in load_seg
164
        SET(exe_waiting);
165
        SET(exe_trigger_gp_fault); //exception GP(val)
166
    ENDIF();
167
ENDIF();
168
169
 
170
 
171
172
IF(exe_cmd == `CMD_RET_far && exe_cmdex == `CMDEX_RET_far_same_STEP_3);
173
 
174
    SET(offset_pop, exe_decoder[0] == 1'b1);
175
    SET(offset_ret, exe_decoder[0] == 1'b0);
176
 
177
    IF(glob_param_2 > glob_desc_limit);
178
        SET(exe_waiting);
179
        SET(exe_trigger_gp_fault); //exception GP(0)
180
    ENDIF();
181
 
182
ENDIF();
183
184
 
185
186
IF(exe_cmd == `CMD_RET_far && exe_cmdex == `CMDEX_RET_far_outer_STEP_5);
187
 
188
    IF(glob_param_2 > glob_desc_2_limit);
189
 
190
        SET(exe_waiting);
191
        SET(exe_trigger_gp_fault); //exception GP(0)
192
    ELSE();
193
        SET(exe_glob_descriptor_set);
194
        SET(exe_glob_descriptor_value, glob_descriptor_2);
195
 
196
        SET(exe_glob_descriptor_2_set);
197
        SET(exe_glob_descriptor_2_value, glob_descriptor);
198
 
199
        SET(exe_glob_param_1_set);
200
        SET(exe_glob_param_1_value, glob_param_3);
201
 
202
        SET(exe_glob_param_3_set);
203
        SET(exe_glob_param_3_value, glob_param_1);
204
    ENDIF();
205
ENDIF();
206
207
 
208
209
IF(exe_cmd == `CMD_RET_far && exe_cmdex == `CMDEX_RET_far_outer_STEP_6);
210
 
211
    SET(exe_glob_descriptor_set, exe_ready);
212
    SET(exe_glob_descriptor_value, glob_descriptor_2);
213
 
214
    SET(exe_glob_descriptor_2_set, exe_ready);
215
    SET(exe_glob_descriptor_2_value, glob_descriptor);
216
 
217
    SET(exe_glob_param_1_set, exe_ready);
218
    SET(exe_glob_param_1_value, glob_param_3);
219
 
220
    SET(exe_glob_param_3_set, exe_ready);
221
    SET(exe_glob_param_3_value, glob_param_1);
222
ENDIF();
223
224
 
225
226
IF(exe_cmd == `CMD_RET_far && exe_cmdex == `CMDEX_RET_far_outer_STEP_7);
227
 
228
    SET(offset_iret_glob_param_4,   exe_decoder[0] == 1'b1);
229
    SET(offset_ret_imm,             exe_decoder[0] == 1'b0);
230
 
231
    SET(exe_eip_from_glob_param_2);
232
 
233
    IF(exe_mutex_current[`MUTEX_ACTIVE_BIT]); SET(exe_waiting); ENDIF(); // wait for ss write
234
ENDIF();
235
236
 
237
238
IF(exe_cmd == `CMD_RET_far && (exe_cmdex == `CMDEX_RET_far_real_STEP_3 || exe_cmdex == `CMDEX_RET_far_same_STEP_4));
239
 
240
    IF(exe_cmdex == `CMDEX_RET_far_real_STEP_3);
241
        SET(offset_pop, exe_decoder[0] == 1'b1); // RET far without imm
242
        SET(offset_ret, exe_decoder[0] == 1'b0); // RET far with imm
243
 
244
        SET(offset_ret_far_se);
245
    ENDIF();
246
 
247
    SET(exe_eip_from_glob_param_2);
248
ENDIF();
249
250
 
251
252
IF(wr_cmd == `CMD_RET_far && wr_cmdex == `CMDEX_RET_far_STEP_1);
253
 
254
    SET(wr_make_esp_speculative);
255
    SAVE(esp, wr_stack_esp);
256
 
257
    SET(wr_not_finished);
258
ENDIF();
259
260
 
261
262
IF(wr_cmd == `CMD_RET_far && wr_cmdex == `CMDEX_RET_far_STEP_2);
263
    SET(wr_not_finished);
264
ENDIF();
265
266
 
267
268
IF(wr_cmd == `CMD_RET_far && wr_cmdex == `CMDEX_RET_far_real_STEP_3);
269
 
270
    SAVE(esp, wr_stack_esp);
271
    SET(wr_make_esp_commit);
272
 
273
    // clear pipeline
274
    SET(wr_req_reset_pr);
275
    SET(wr_req_reset_dec);
276
    SET(wr_req_reset_micro);
277
    SET(wr_req_reset_rd);
278
    SET(wr_req_reset_exe);
279
ENDIF();
280
281
 
282
283
IF(wr_cmd == `CMD_RET_far && wr_cmdex == `CMDEX_RET_far_outer_STEP_3);
284
    SET(wr_not_finished);
285
ENDIF();
286
287
 
288
289
IF(wr_cmd == `CMD_RET_far && wr_cmdex == `CMDEX_RET_far_outer_STEP_4);
290
    SET(wr_not_finished);
291
ENDIF();
292

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.