/[pearpc]/src/cpu/cpu_jitc_x86/jitc_mmu.S
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /src/cpu/cpu_jitc_x86/jitc_mmu.S

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (show annotations)
Wed Sep 5 17:11:21 2007 UTC (16 years, 6 months ago) by dpavlin
File size: 39674 byte(s)
import upstream CVS
1 /*
2 * PearPC
3 * jitc_mmu.S
4 *
5 * Copyright (C) 2003-2006 Sebastian Biallas (sb@biallas.net)
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 */
20
21 #ifndef PREFIX
22 #define PREFIX
23 #endif
24
25 #define EXPORT(sym) EXPORT2(PREFIX, sym)
26 #define EXPORT2(p, sym) EXPORT3(p, sym)
27 #define EXPORT3(p, sym) .globl p##sym; p##sym
28
29 #define EXTERN(sym) EXTERN2(PREFIX, sym)
30 #define EXTERN2(p, sym) EXTERN3(p, sym)
31 #define EXTERN3(p, sym) p##sym
32
33 #define STRUCT .struct 0
34 #define MEMBER(m, s) m:;.struct m+s
35
36 .intel_syntax prefix
37
38 #define TLB_ENTRIES 32
39
40 # Define this if you want exact handling of the SO bit.
41 /* #define EXACT_SO */
42
43 STRUCT #PPC_CPU_State
44 MEMBER(dummy, 4)
45 MEMBER(gpr, 32*4)
46 MEMBER(fpr, 32*8)
47 MEMBER(cr, 4)
48 MEMBER(fpscr, 4)
49 MEMBER(xer, 4)
50 MEMBER(xer_ca, 4)
51 MEMBER(lt, 4)
52 MEMBER(ctr, 4)
53
54 MEMBER(msr, 4)
55 MEMBER(pvr, 4)
56
57 MEMBER(ibatu, 4*4)
58 MEMBER(ibatl, 4*4)
59 MEMBER(ibat_bl, 4*4)
60 MEMBER(ibat_nbl, 4*4)
61 MEMBER(ibat_bepi, 4*4)
62 MEMBER(ibat_brpn, 4*4)
63
64 MEMBER(dbatu, 4*4)
65 MEMBER(dbatl, 4*4)
66 MEMBER(dbat_bl, 4*4)
67 MEMBER(dbat_nbl, 4*4)
68 MEMBER(dbat_bepi, 4*4)
69 MEMBER(dbat_brpn, 4*4)
70
71 MEMBER(sdr1, 4)
72
73 MEMBER(sr, 16*4)
74
75 MEMBER(dar, 4)
76 MEMBER(dsisr, 4)
77 MEMBER(sprg, 4*4)
78 MEMBER(srr0, 4)
79 MEMBER(srr1, 4)
80
81 MEMBER(decr, 4)
82 MEMBER(ear, 4)
83 MEMBER(pir, 4)
84 MEMBER(tb, 8)
85
86 MEMBER(hid, 16*4)
87
88 MEMBER(pc, 4)
89 MEMBER(npc, 4)
90 MEMBER(current_opc, 4)
91
92 MEMBER(exception_pending, 1)
93 MEMBER(dec_exception, 1)
94 MEMBER(ext_exception, 1)
95 MEMBER(stop_exception, 1)
96 MEMBER(singlestep_ignore, 1)
97 MEMBER(align1, 1)
98 MEMBER(align2, 1)
99 MEMBER(align3, 1)
100
101 MEMBER(pagetable_base, 4)
102 MEMBER(pagetable_hashmask, 4)
103 MEMBER(reserve, 4)
104 MEMBER(have_reservation, 4)
105
106 MEMBER(tlb_last, 4)
107 MEMBER(tlb_pa, 4*4)
108 MEMBER(tlb_va, 4*4)
109 MEMBER(effective_code_page, 4)
110 MEMBER(physical_code_page, 4)
111 MEMBER(pdec, 2*4)
112 MEMBER(ptb, 2*4)
113
114 MEMBER(temp, 4)
115 MEMBER(temp2, 4)
116 MEMBER(x87cw, 4)
117 MEMBER(pc_ofs, 4)
118 MEMBER(current_code_base, 4)
119
120 STRUCT #JITC
121 MEMBER(clientPages, 4)
122 MEMBER(tlb_code_0_eff, TLB_ENTRIES*4)
123 MEMBER(tlb_data_0_eff, TLB_ENTRIES*4)
124 MEMBER(tlb_data_8_eff, TLB_ENTRIES*4)
125 MEMBER(tlb_code_0_phys, TLB_ENTRIES*4)
126 MEMBER(tlb_data_0_phys, TLB_ENTRIES*4)
127 MEMBER(tlb_data_8_phys, TLB_ENTRIES*4)
128 MEMBER(blblbl, 4)
129 MEMBER(tlb_code_0_hits, 8)
130 MEMBER(tlb_data_0_hits, 8)
131 MEMBER(tlb_data_8_hits, 8)
132 MEMBER(tlb_code_0_misses, 8)
133 MEMBER(tlb_data_0_misses, 8)
134 MEMBER(tlb_data_8_misses, 8)
135
136 MEMBER(nativeReg, 8*4)
137
138 MEMBER(nativeRegState, 8*4)
139
140 MEMBER(nativeFlags, 4)
141
142 MEMBER(nativeFlagsState, 4)
143 MEMBER(nativeCarryState, 4)
144
145 MEMBER(clientReg, 600*4)
146
147 MEMBER(nativeRegsList, 8*4)
148
149 MEMBER(LRUreg, 4)
150 MEMBER(MRUreg, 4)
151
152 MEMBER(LRUpage, 4)
153 MEMBER(MRUpage, 4)
154
155 MEMBER(freeFragmentsList, 4)
156
157 MEMBER(freeClientPages, 4)
158
159 MEMBER(translationCache, 4)
160
161 STRUCT #ClientPage
162 MEMBER(entrypoints, 1024*4)
163 MEMBER(baseaddress, 4)
164 MEMBER(tcf_current, 4)
165 MEMBER(bytesLeft, 4)
166 MEMBER(tcp, 4)
167 MEMBER(moreRU, 4)
168 MEMBER(lessRU, 4)
169
170 #define gCPU(r) EXTERN(gCPU)+r
171 #define gJITC(r) EXTERN(gJITC)+r
172
173 .text
174
175 .balign 16
176 ##############################################################################################
177 ##
178 EXPORT(ppc_mmu_tlb_invalidate_all_asm):
179 cld
180 or %eax, -1
181 mov %ecx, TLB_ENTRIES*4*3 / 4
182 mov %edi, offset gJITC(tlb_code_0_eff)
183 rep stosd
184 ret
185
186 ##############################################################################################
187 ##
188 ## IN: %eax: effective address to invalidate
189 ##
190 EXPORT(ppc_mmu_tlb_invalidate_entry_asm):
191 mov %ecx, %eax
192 or %eax, -1
193 shr %ecx, 12
194 and %ecx, TLB_ENTRIES-1
195 mov [gJITC(tlb_code_0_eff+%ecx*4)], %eax
196 mov [gJITC(tlb_data_0_eff+%ecx*4)], %eax
197 mov [gJITC(tlb_data_8_eff+%ecx*4)], %eax
198 ret
199
200 ##############################################################################################
201 ## read_physical_word_pg
202 .macro read_physical_word_pg r1, r2
203 mov \r2, [EXTERN(gMemory)]
204 mov \r2, [\r2 + \r1]
205 bswap \r2
206 .endm
207
208 .balign 16
209 ##############################################################################################
210 ## ppc_pte_protection
211 ppc_pte_protection:
212
213 ## read(0)/write(1)*8 | key*4 | pp
214
215 ## read
216 .byte 1 # r/w
217 .byte 1 # r/w
218 .byte 1 # r/w
219 .byte 1 # r
220 .byte 0 # -
221 .byte 1 # r
222 .byte 1 # r/w
223 .byte 1 # r
224
225 ## write
226 .byte 1 # r/w
227 .byte 1 # r/w
228 .byte 1 # r/w
229 .byte 0 # r
230 .byte 0 # -
231 .byte 0 # r
232 .byte 1 # r/w
233 .byte 0 # r
234
235 ###############################################################################
236 ## bat_lookup
237 #define bat_lookup(di, n, rw, datacode) \
238 mov %edx, [gCPU(di##bat_bl + n*4)]; \
239 mov %ebx, [gCPU(di##bat_bepi + n*4)]; \
240 \
241 and %edx, %eax; \
242 cmp %ebx, %edx; \
243 jne 3f; \
244 \
245 bt dword ptr [gCPU(msr)], 14; \
246 mov %ebp, 2; \
247 sbb %ebp, 0; /* BATU_Vp / BATU_Vs */ \
248 \
249 test [gCPU(di##batu + n*4)], %ebp; \
250 jz 3f; \
251 \
252 /* FIXME: check access rights */ \
253 mov %esi, %eax; \
254 mov %edi, %eax; \
255 mov %edx, 0xfffff000; \
256 and %eax, [gCPU(di##bat_nbl + n*4)]; \
257 or %eax, [gCPU(di##bat_brpn + n*4)]; \
258 \
259 /** TLB-Code */ \
260 shr %edi, 12; \
261 and %esi, %edx; \
262 and %edi, TLB_ENTRIES-1; \
263 and %edx, %eax; \
264 mov [gJITC(tlb_##datacode##_##rw##_eff+%edi*4)], %esi; \
265 mov [gJITC(tlb_##datacode##_##rw##_phys+%edi*4)], %edx; \
266 /* add dword ptr [gJITC(tlb_##datatcode##_##rw##_misses)], 1; */ \
267 /* adc dword ptr [gJITC(tlb_##datatcode##_##rw##_misses+4)], 0; */ \
268 ret 4; \
269 3:
270
271 ##############################################################################################
272 ## pg_table_lookup
273 ##
274 ## param1: PTE1_H or 0
275 ## param2: 0 for read, 8 for write
276 ## param3: data / code
277 ## param4: pt offset
278 #define pg_table_lookup(n, rw, datacode, offset) \
279 read_physical_word_pg %ebx+offset, %eax; \
280 /* %ecx = pte1 */ \
281 \
282 mov %ecx, %eax; \
283 and %eax, (1<<6) | (1<<31); /* (PTE1_V | PTE1_H) */ \
284 cmp %eax, (n) | (1<<31); \
285 jne 1f; \
286 \
287 mov %eax, %ecx; \
288 shr %ecx, 7; \
289 and %ecx, 0xffffff; /* VSID */ \
290 cmp %ecx, %ebp; \
291 jne 1f; \
292 \
293 and %eax, 0x3f; /* API */ \
294 cmp %eax, %edi; \
295 jne 1f; \
296 \
297 /* page found */ \
298 \
299 read_physical_word_pg %ebx+4+offset, %esi; \
300 /* # %esi = pte2; */ \
301 \
302 /* FIXME: use bt trick? */ \
303 test dword ptr [gCPU(msr)], (1<<14); /* MSR_PR */ \
304 mov %eax, (1<<29); /* SR_Kp */ \
305 setz %cl; \
306 shl %eax, %cl; /* SR_Kp <--> SR_Ks */ \
307 test %edx, %eax; /* SR_Kp / SR_Ks */ \
308 setnz %al; \
309 movzx %eax, %al; \
310 \
311 mov %ecx, %esi; \
312 and %ecx, 3; \
313 \
314 cmp byte ptr [ppc_pte_protection + (rw) + 4*%eax + %ecx], 1; \
315 .if n==0; \
316 /* add %esp, 4; /* hash1, no longer needed */ \
317 pop %edx; \
318 .endif; \
319 pop %eax; /* the effective address */ \
320 jne protection_fault_##rw##_##datacode; \
321 \
322 /* update R and C bits */ \
323 mov %edx, %esi; \
324 .if rw==0; \
325 or %edx, (1<<8); /* PTE2_R */ \
326 .else; \
327 or %edx, (1<<8) | (1<<7); /* PTE2_R | PTE2_C */ \
328 .endif; \
329 bswap %edx; \
330 add %ebx, [EXTERN(gMemory)]; \
331 mov [%ebx+4+offset], %edx; \
332 \
333 and %esi, 0xfffff000; \
334 /** TLB-Code */ \
335 mov %edx, %eax; \
336 mov %ecx, %eax; \
337 shr %edx, 12; \
338 and %ecx, 0xfffff000; \
339 and %edx, TLB_ENTRIES-1; \
340 mov [gJITC(tlb_## datacode ##_## rw ##_eff + %edx*4)], %ecx; \
341 mov [gJITC(tlb_## datacode ##_## rw ##_phys + %edx*4)], %esi; \
342 /* add dword ptr [gJITC(tlb_## datacode ##_## rw ##_misses)], 1;*/ \
343 /* adc dword ptr [gJITC(tlb_## datacode ##_## rw ##_misses+4)], 0;*/ \
344 /***/ \
345 and %eax, 0x00000fff; \
346 or %eax, %esi; \
347 ret 4; \
348 1:
349
350 ##############################################################################################
351 ## protection_fault_%2_%3
352 protection_fault_0_code:
353 # ppc_exception(PPC_EXC_ISI, PPC_EXC_SRR1_PROT, addr);
354 pop %edx # return address is no longer needed
355 pop %ebx # bytes to roll back
356 add %esp, %ebx
357 mov %ecx, (1<<27) # PPC_EXC_SRR1_PROT
358 jmp EXTERN(ppc_isi_exception_asm)
359 protection_fault_0_data:
360 # ppc_exception(PPC_EXC_DSI, PPC_EXC_DSISR_PROT, addr);
361 pop %edx # return address is no longer needed
362 pop %ebx # bytes to roll back
363 add %esp, %ebx
364 mov %ecx, (1<<27) # PPC_EXC_DSISR_PROT
365 jmp EXTERN(ppc_dsi_exception_asm)
366 protection_fault_8_data:
367 # ppc_exception(PPC_EXC_DSI, PPC_EXC_DSISR_PROT | PPC_EXC_DSISR_STORE, addr);
368 pop %edx # return address is no longer needed
369 pop %ebx # bytes to roll back
370 add %esp, %ebx
371 mov %ecx, (1<<27) | (1<<25) # PPC_EXC_DSISR_PROT | PPC_EXC_DSISR_STORE
372 jmp EXTERN(ppc_dsi_exception_asm)
373
374 ##############################################################################################
375 ## param1: 0 for read, 8 for write
376 ## param2: data / code
377 #define tlb_lookup(rw, datacode) \
378 mov %edx, %eax; \
379 mov %ecx, %eax; \
380 shr %edx, 12; \
381 and %ecx, 0xfffff000; \
382 and %edx, TLB_ENTRIES-1; \
383 cmp %ecx, [gJITC(tlb_##datacode##_##rw##_eff + %edx*4)]; \
384 jne 1f; \
385 /* \
386 * if a tlb entry is invalid, its \
387 * lower 12 bits are 1, so the cmp is guaranteed to fail. \
388 */ \
389 /* add dword ptr [gJITC(tlb_##datacode##_##rw##_hits)], 1; */ \
390 /* adc dword ptr [gJITC(tlb_##datacode##_##rw##_hits+4)], 0; */ \
391 and %eax, 0x00000fff; \
392 or %eax, [gJITC(tlb_##datacode##_##rw##_phys + %edx*4)]; \
393 ret 4; \
394 1: \
395
396 .balign 16
397 ppc_effective_to_physical_code_ret:
398 mov %edx, %eax
399 mov %ecx, %eax
400 shr %edx, 12
401 and %ecx, 0xfffff000
402 and %edx, TLB_ENTRIES-1
403 mov [gJITC(tlb_code_0_eff+%edx*4)], %ecx
404 mov [gJITC(tlb_code_0_phys+%edx*4)], %ecx
405 ret 4
406
407 .balign 16
408 ##############################################################################################
409 ## uint32 FASTCALL ppc_effective_to_physical_code(uint32 addr)
410 ##
411 ## IN %eax: address to translate
412 ##
413 ## WILL NOT RETURN ON EXCEPTION!
414 ##
415 EXPORT(ppc_effective_to_physical_code):
416 tlb_lookup(0, code)
417
418 test byte ptr [gCPU(msr)], (1<<5) # MSR_IR
419 jz ppc_effective_to_physical_code_ret
420
421 bat_lookup(i, 0, 0, code)
422 bat_lookup(i, 1, 0, code)
423 bat_lookup(i, 2, 0, code)
424 bat_lookup(i, 3, 0, code)
425
426 mov %ebx, %eax
427 shr %ebx, 28 # SR
428 mov %edx, [gCPU(sr+4*%ebx)]
429
430 # test %edx, SR_T --> die
431
432 test %edx, (1<<28) # SR_N
433 jnz 9f
434
435 mov %ebx, %eax
436 mov %ebp, %edx
437 shr %ebx, 12
438 mov %edi, %eax
439 and %ebx, 0xffff
440 shr %edi, 22
441 and %ebp, 0xffffff
442 and %edi, 0x3f
443
444 # now:
445 # %eax = addr
446 # %ebx = page_index
447 # %ebp = VSID
448 # %edi = api
449
450 xor %ebx, %ebp
451
452 # %ebx = hash1
453
454 push %eax
455 push %ebx # das brauch ich
456
457 and %ebx, [gCPU(pagetable_hashmask)]
458 shl %ebx, 6
459 or %ebx, [gCPU(pagetable_base)]
460
461 # %ebx = pteg_addr
462
463 pg_table_lookup(0, 0, code, 0)
464 pg_table_lookup(0, 0, code, 8)
465 pg_table_lookup(0, 0, code, 16)
466 pg_table_lookup(0, 0, code, 24)
467 pg_table_lookup(0, 0, code, 32)
468 pg_table_lookup(0, 0, code, 40)
469 pg_table_lookup(0, 0, code, 48)
470 pg_table_lookup(0, 0, code, 56)
471
472 # hash function number 2
473 pop %ebx
474 not %ebx
475 and %ebx, [gCPU(pagetable_hashmask)]
476 shl %ebx, 6
477 or %ebx, [gCPU(pagetable_base)]
478
479 pg_table_lookup(1<<6, 0, code, 0)
480 pg_table_lookup(1<<6, 0, code, 8)
481 pg_table_lookup(1<<6, 0, code, 16)
482 pg_table_lookup(1<<6, 0, code, 24)
483 pg_table_lookup(1<<6, 0, code, 32)
484 pg_table_lookup(1<<6, 0, code, 40)
485 pg_table_lookup(1<<6, 0, code, 48)
486 pg_table_lookup(1<<6, 0, code, 56)
487
488 # page lookup failed --> throw exception
489
490 pop %eax
491 pop %edx # return address is no longer needed
492 pop %ecx # bytes to roll back
493 add %esp, %ecx
494
495 mov %ecx, (1<<30) # PPC_EXC_SRR1_PAGE
496 jmp EXTERN(ppc_isi_exception_asm)
497 9:
498 # segment isnt executable --> throw exception
499 pop %edx # return address is no longer needed
500 pop %ecx # bytes to roll back
501 add %esp, %ecx
502
503 mov %ecx, (1<<28) # PPC_EXC_SRR1_GUARD
504 jmp EXTERN(ppc_isi_exception_asm)
505
506 .balign 16
507 ppc_effective_to_physical_data_read_ret:
508 mov %edx, %eax
509 mov %ecx, %eax
510 shr %edx, 12
511 and %ecx, 0xfffff000
512 and %edx, TLB_ENTRIES-1
513 mov [gJITC(tlb_data_0_eff+%edx*4)], %ecx
514 mov [gJITC(tlb_data_0_phys+%edx*4)], %ecx
515 ret 4
516
517 .balign 16
518 ##############################################################################################
519 ## uint32 FASTCALL ppc_effective_to_physical_data_read(uint32 addr)
520 ##
521 ## IN %eax: address to translate
522 ##
523 ## WILL NOT RETURN ON EXCEPTION!
524 ##
525 ppc_effective_to_physical_data_read:
526 tlb_lookup(0, data)
527
528 test byte ptr [gCPU(msr)], (1<<4) # MSR_DR
529 jz ppc_effective_to_physical_data_read_ret
530
531 bat_lookup(d, 0, 0, data)
532 bat_lookup(d, 1, 0, data)
533 bat_lookup(d, 2, 0, data)
534 bat_lookup(d, 3, 0, data)
535
536 mov %ebx, %eax
537 shr %ebx, 28 # SR
538 mov %edx, [gCPU(sr+4*%ebx)]
539
540 # test %edx, SR_T --> die
541
542 mov %ebx, %eax
543 mov %ebp, %edx
544 shr %ebx, 12
545 mov %edi, %eax
546 and %ebx, 0xffff
547 shr %edi, 22
548 and %ebp, 0xffffff
549 and %edi, 0x3f
550
551 # now:
552 # %eax = addr
553 # %ebx = page_index
554 # %ebp = VSID
555 # %edi = api
556
557 xor %ebx, %ebp
558
559 # %ebx = hash1
560
561 push %eax
562 push %ebx # das brauch ich
563
564 and %ebx, [gCPU(pagetable_hashmask)]
565 shl %ebx, 6
566 or %ebx, [gCPU(pagetable_base)]
567
568 # %ebx = pteg_addr
569
570 pg_table_lookup(0, 0, data, 0)
571 pg_table_lookup(0, 0, data, 8)
572 pg_table_lookup(0, 0, data, 16)
573 pg_table_lookup(0, 0, data, 24)
574 pg_table_lookup(0, 0, data, 32)
575 pg_table_lookup(0, 0, data, 40)
576 pg_table_lookup(0, 0, data, 48)
577 pg_table_lookup(0, 0, data, 56)
578
579 # hash function number 2
580 pop %ebx
581 not %ebx
582 and %ebx, [gCPU(pagetable_hashmask)]
583 shl %ebx, 6
584 or %ebx, [gCPU(pagetable_base)]
585
586 pg_table_lookup(1<<6, 0, data, 0)
587 pg_table_lookup(1<<6, 0, data, 8)
588 pg_table_lookup(1<<6, 0, data, 16)
589 pg_table_lookup(1<<6, 0, data, 24)
590 pg_table_lookup(1<<6, 0, data, 32)
591 pg_table_lookup(1<<6, 0, data, 40)
592 pg_table_lookup(1<<6, 0, data, 48)
593 pg_table_lookup(1<<6, 0, data, 56)
594
595 # page lookup failed --> throw exception
596
597 pop %eax
598 pop %edx # return address is no longer needed
599 pop %ecx # bytes to roll back
600 add %esp, %ecx
601
602 mov %ecx, (1<<30) # PPC_EXC_DSISR_PAGE
603 jmp EXTERN(ppc_dsi_exception_asm)
604
605 .balign 16
606 ppc_effective_to_physical_data_write_ret:
607 mov %edx, %eax
608 mov %ecx, %eax
609 shr %edx, 12
610 and %ecx, 0xfffff000
611 and %edx, TLB_ENTRIES-1
612 mov [gJITC(tlb_data_8_eff+%edx*4)], %ecx
613 mov [gJITC(tlb_data_8_phys+%edx*4)], %ecx
614 ret 4
615
616 .balign 16
617 ##############################################################################################
618 ## uint32 FASTCALL ppc_effective_to_physical_data_write(uint32 addr)
619 ##
620 ## IN %eax: address to translate
621 ##
622 ## WILL NOT RETURN ON EXCEPTION!
623 ##
624 ppc_effective_to_physical_data_write:
625 tlb_lookup(8, data)
626
627 test byte ptr [gCPU(msr)], (1<<4) # MSR_DR
628 jz ppc_effective_to_physical_data_write_ret
629
630 bat_lookup(d, 0, 8, data)
631 bat_lookup(d, 1, 8, data)
632 bat_lookup(d, 2, 8, data)
633 bat_lookup(d, 3, 8, data)
634
635 mov %ebx, %eax
636 shr %eax, 28 # SR
637 mov %edx, [gCPU(sr+4*%eax)]
638
639 # test %edx, SR_T --> die
640
641 mov %eax, %ebx
642 mov %edi, %ebx
643 mov %ebp, %edx
644 shr %ebx, 12
645 and %ebx, 0xffff
646 shr %edi, 22
647 and %ebp, 0xffffff
648 and %edi, 0x3f
649
650 # now:
651 # %eax = addr
652 # %ebx = page_index
653 # %ebp = VSID
654 # %edi = api
655
656 xor %ebx, %ebp
657
658 # %ebx = hash1
659
660 push %eax
661 push %ebx # das brauch ich
662
663 and %ebx, [gCPU(pagetable_hashmask)]
664 shl %ebx, 6
665 or %ebx, [gCPU(pagetable_base)]
666
667 # %ebx = pteg_addr
668
669 pg_table_lookup(0, 8, data, 0)
670 pg_table_lookup(0, 8, data, 8)
671 pg_table_lookup(0, 8, data, 16)
672 pg_table_lookup(0, 8, data, 24)
673 pg_table_lookup(0, 8, data, 32)
674 pg_table_lookup(0, 8, data, 40)
675 pg_table_lookup(0, 8, data, 48)
676 pg_table_lookup(0, 8, data, 56)
677
678 # hash function number 2
679 mov %ebx, [%esp]
680 add %esp, 4
681 not %ebx
682 and %ebx, [gCPU(pagetable_hashmask)]
683 shl %ebx, 6
684 or %ebx, [gCPU(pagetable_base)]
685
686 pg_table_lookup(1<<6, 8, data, 0)
687 pg_table_lookup(1<<6, 8, data, 8)
688 pg_table_lookup(1<<6, 8, data, 16)
689 pg_table_lookup(1<<6, 8, data, 24)
690 pg_table_lookup(1<<6, 8, data, 32)
691 pg_table_lookup(1<<6, 8, data, 40)
692 pg_table_lookup(1<<6, 8, data, 48)
693 pg_table_lookup(1<<6, 8, data, 56)
694
695 # page lookup failed --> throw exception
696
697 pop %eax
698 pop %edx # return address is no longer needed
699 pop %ebx # bytes to roll back
700 add %esp, %ebx
701
702 mov %ecx, (1<<30)|(1<<25) # PPC_EXC_DSISR_PAGE | PPC_EXC_DSISR_STORE
703 jmp EXTERN(ppc_dsi_exception_asm)
704
705 .balign 16
706 ##############################################################################################
707 ## uint32 FASTCALL ppc_effective_write_byte()
708 ##
709 ## IN %eax: address to translate
710 ## %esi: current client pc offset
711 ## %dl: byte to be written
712 ##
713 ## WILL NOT RETURN ON EXCEPTION!
714 ##
715 EXPORT(ppc_write_effective_byte_asm):
716 mov [gCPU(pc_ofs)], %esi
717
718 push %edx
719 push 8 # roll back 8 bytes in case of exception
720 call ppc_effective_to_physical_data_write
721 cmp %eax, [EXTERN(gMemorySize)]
722 pop %edx
723 jae 1f
724 add %eax, [EXTERN(gMemory)]
725 mov [%eax], %dl
726 ret
727 1:
728 mov %ecx, 1
729 movzx %edx, %dl
730 jmp EXTERN(io_mem_write_glue)
731
732 .balign 16
733 ##############################################################################################
734 ## uint32 FASTCALL ppc_effective_write_half()
735 ##
736 ## IN %eax: address to translate
737 ## %dx: half to be written
738 ## %esi: current client pc offset
739 ##
740 ## WILL NOT RETURN ON EXCEPTION!
741 ##
742 EXPORT(ppc_write_effective_half_asm):
743 mov [gCPU(pc_ofs)], %esi
744 mov %ebx, %eax
745 and %ebx, 0xfff
746 cmp %ebx, 4095
747 jae 1f
748
749 push %edx
750 push 8 # roll back 8 bytes in case of exception
751 call ppc_effective_to_physical_data_write
752 cmp %eax, [EXTERN(gMemorySize)]
753 pop %edx
754 jae 2f
755 add %eax, [EXTERN(gMemory)]
756 mov [%eax], %dh
757 mov [%eax+1], %dl
758 ret
759 2:
760 xchg %dh, %dl
761 mov %ecx, 2
762 movzx %edx, %dx
763 jmp EXTERN(io_mem_write_glue)
764
765 1:
766 push %edx
767 push %eax
768 push 12 # roll back 12 bytes in case of exception
769 call ppc_effective_to_physical_data_write
770 mov %ebx, %eax
771 pop %eax
772 push %ebx
773 inc %eax
774 push 12 # roll back 12 bytes in case of exception
775 call ppc_effective_to_physical_data_write
776 pop %ebx
777 pop %edx
778 cmp %ebx, [EXTERN(gMemorySize)]
779 jae 1f
780 add %ebx, [EXTERN(gMemory)]
781 mov [%ebx], %dh
782 3:
783 cmp %eax, [EXTERN(gMemorySize)]
784 jae 2f
785 add %eax, [EXTERN(gMemory)]
786 mov [%eax], %dl
787 ret
788
789 1:
790 push %eax
791 push %edx
792 movzx %edx, %dh
793 mov %eax, %ebx
794 mov %ecx, 1
795 call EXTERN(io_mem_write_glue)
796 pop %edx
797 pop %eax
798 jmp 3b
799 2:
800 movzx %edx, %dl
801 mov %ecx, 1
802 jmp EXTERN(io_mem_write_glue)
803
804 .balign 16
805 ##############################################################################################
806 ## uint32 FASTCALL ppc_effective_write_word()
807 ##
808 ## IN %eax: address to translate
809 ## %edx: word to be written
810 ## %esi: current client pc offset
811 ##
812 ## WILL NOT RETURN ON EXCEPTION!
813 ##
814 EXPORT(ppc_write_effective_word_asm):
815 mov [gCPU(pc_ofs)], %esi
816 mov %ebx, %eax
817 and %ebx, 0xfff
818 cmp %ebx, 4093
819 jae 1f
820
821 bswap %edx
822
823 push %edx
824 push 8 # roll back 8 bytes in case of exception
825 call ppc_effective_to_physical_data_write
826 cmp %eax, [EXTERN(gMemorySize)]
827 pop %edx
828 jae 2f
829 add %eax, [EXTERN(gMemory)]
830 mov [%eax], %edx
831 ret
832
833 2:
834 mov %ecx, 4
835 jmp EXTERN(io_mem_write_glue)
836
837 1:
838 push %edx
839 push %eax
840 push 12 # roll back 12 bytes in case of exception
841 call ppc_effective_to_physical_data_write
842 mov %ebx, %eax
843 pop %eax
844 add %eax, 4
845 push %ebx
846 push 12 # roll back 12 bytes in case of exception
847 call ppc_effective_to_physical_data_write
848 pop %ebx
849 pop %edx
850 mov %ebp, %ebx
851 and %ebp, 0xfff
852 neg %ebp
853 add %ebp, 4096
854 cmp %ebx, [EXTERN(gMemorySize)]
855 jae 2f
856 add %ebx, [EXTERN(gMemory)]
857 1:
858 rol %edx, 8
859 mov [%ebx], %dl
860 inc %ebx
861 dec %ebp
862 jnz 1b
863 4:
864 mov %ebp, %eax
865 and %eax, 0xfffff000
866 and %ebp, 0x00000fff
867 cmp %eax, [EXTERN(gMemorySize)]
868 jae 3f
869 add %eax, [EXTERN(gMemory)]
870 1:
871 rol %edx, 8
872 mov [%eax], %dl
873 inc %eax
874 dec %ebp
875 jnz 1b
876 ret
877
878 2:
879 push %eax
880 1:
881 rol %edx, 8
882 push %ebp
883 #push %ebx
884 push %edx
885 movzx %edx, %dl
886 mov %eax, %ebx
887 mov %ecx, 1
888 call EXTERN(io_mem_write_glue)
889 pop %edx
890 pop %ebp
891 inc %ebx
892 dec %ebp
893 jnz 1b
894 pop %eax
895 jmp 4b
896 3:
897 1:
898 rol %edx, 8
899 push %ebp
900 push %eax
901 push %edx
902 movzx %edx, %dl
903 mov %ecx, 1
904 call EXTERN(io_mem_write_glue)
905 pop %edx
906 pop %eax
907 pop %ebp
908 inc %eax
909 dec %ebp
910 jnz 1b
911 ret
912 .balign 16
913 ##############################################################################################
914 ## uint32 FASTCALL ppc_effective_write_dword()
915 ##
916 ## IN %eax: address to translate
917 ## %ecx:%edx dword to be written
918 ## %esi: current client pc offset
919 ##
920 ## WILL NOT RETURN ON EXCEPTION!
921 ##
922 EXPORT(ppc_write_effective_dword_asm):
923 mov [gCPU(pc_ofs)], %esi
924 mov %ebx, %eax
925 and %ebx, 0xfff
926 cmp %ebx, 4089
927 jae 2f # overlap
928
929 bswap %ecx
930 bswap %edx
931
932 push %ecx
933 push %edx
934 push 12 # roll back 12 bytes in case of exception
935 call ppc_effective_to_physical_data_write
936 cmp %eax, [EXTERN(gMemorySize)]
937 pop %edx
938 pop %ecx
939 jae 1f
940 add %eax, [EXTERN(gMemory)]
941 mov [%eax], %ecx
942 mov [%eax+4], %edx
943 ret
944 1:
945 mov %ebx, %ecx
946 mov %ecx, %edx
947 mov %edx, %ebx
948 jmp EXTERN(io_mem_write64_glue)
949
950 2:
951 push %ecx
952 push %edx
953 push %eax
954 push 16 # roll back 16 bytes in case of exception
955 call ppc_effective_to_physical_data_write
956 mov %ebx, %eax
957 pop %eax
958 add %eax, 8
959 push %ebx
960 push 16 # roll back 16 bytes in case of exception
961 call ppc_effective_to_physical_data_write
962 pop %ebx
963 pop %edx
964 pop %ecx
965 mov %ebp, %ebx
966 and %ebp, 0xfff
967 neg %ebp
968 add %ebp, 4096
969 bswap %ecx
970 bswap %edx
971 cmp %ebx, [EXTERN(gMemorySize)]
972 jae 3f
973 add %ebx, [EXTERN(gMemory)]
974 1:
975 mov [%ebx], %cl
976 shrd %ecx, %edx, 8
977 inc %ebx
978 shr %edx, 8
979 dec %ebp
980 jnz 1b
981 4:
982 mov %ebp, %eax
983 and %eax, 0xfffff000
984 and %ebp, 0x00000fff
985 cmp %eax, [EXTERN(gMemorySize)]
986 jae 5f
987 add %eax, [EXTERN(gMemory)]
988 1:
989 mov [%eax], %cl
990 shrd %ecx, %edx, 8
991 inc %eax
992 shr %edx, 8
993 dec %ebp
994 jnz 1b
995 ret
996 3:
997 1:
998 pusha
999 movzx %edx, %cl
1000 mov %eax, %ebx
1001 mov %ecx, 1
1002 call EXTERN(io_mem_write_glue)
1003 popa
1004 shrd %ecx, %edx, 8
1005 inc %ebx
1006 shr %edx, 8
1007 dec %ebp
1008 jnz 1b
1009 jmp 4b
1010 5:
1011 1:
1012 pusha
1013 movzx %edx, %cl
1014 mov %ecx, 1
1015 call EXTERN(io_mem_write_glue)
1016 popa
1017 shrd %ecx, %edx, 8
1018 inc %eax
1019 shr %edx, 8
1020 dec %ebp
1021 jnz 1b
1022 ret
1023 .balign 16
1024 ##############################################################################################
1025 ## uint32 FASTCALL ppc_effective_write_qword()
1026 ##
1027 ## IN %eax: address to translate
1028 ## %edx: address from which to get the values to be written
1029 ## %esi: current client pc offset
1030 ##
1031 ## WILL NOT RETURN ON EXCEPTION!
1032 ##
1033 EXPORT(ppc_write_effective_qword_asm):
1034 mov [gCPU(pc_ofs)], %esi
1035 and %eax, 0xfffffff0
1036 push %edx
1037
1038 push 8 # roll back 8 bytes in case of exception
1039 call ppc_effective_to_physical_data_write
1040
1041 cmp %eax, [EXTERN(gMemorySize)]
1042 pop %edx
1043 jae 1f
1044
1045 add %eax, [EXTERN(gMemory)]
1046
1047 mov %ebx, [%edx]
1048 mov %ecx, [%edx+4]
1049 mov %edi, [%edx+8]
1050 mov %esi, [%edx+12]
1051
1052 bswap %ebx
1053 bswap %ecx
1054 bswap %edi
1055 bswap %esi
1056
1057 mov [%eax+12], %ebx
1058 mov [%eax+8], %ecx
1059 mov [%eax+4], %edi
1060 mov [%eax], %esi
1061 ret
1062 1:
1063 call EXTERN(io_mem_write128_glue)
1064 ret
1065
1066 ppc_write_effective_qword_sse_asm:
1067 mov [gCPU(pc_ofs)], %esi
1068 and %eax, 0xfffffff0
1069 push %edx
1070
1071 push 8 # roll back 8 bytes in case of exception
1072 call ppc_effective_to_physical_data_write
1073
1074 cmp %eax, [EXTERN(gMemorySize)]
1075 pop %edx
1076 jae 1f
1077
1078 add %eax, [EXTERN(gMemory)]
1079
1080 movaps [%eax], %xmm0
1081 ret
1082 1:
1083 movaps [%edx], %xmm0
1084 call EXTERN(io_mem_write128_native_glue)
1085 ret
1086 .balign 16
1087 ##############################################################################################
1088 ## uint32 FASTCALL ppc_read_effective_byte()
1089 ##
1090 ## IN %eax: address to translate
1091 ## %esi: current client pc offset
1092 ##
1093 ## OUT %edx: byte, zero extended
1094 ##
1095 ## WILL NOT RETURN ON EXCEPTION!
1096 ##
1097 EXPORT(ppc_read_effective_byte_asm):
1098 mov [gCPU(pc_ofs)], %esi
1099
1100 push 4 # roll back 4 bytes in case of exception
1101 call ppc_effective_to_physical_data_read
1102 cmp %eax, [EXTERN(gMemorySize)]
1103 jae 1f
1104 add %eax, [EXTERN(gMemory)]
1105 movzx %edx, byte ptr [%eax]
1106 ret
1107 1:
1108 mov %edx, 1
1109 call EXTERN(io_mem_read_glue)
1110 movzx %edx, %al
1111 ret
1112
1113 .balign 16
1114 ##############################################################################################
1115 ## uint32 FASTCALL ppc_read_effective_half()
1116 ##
1117 ## IN %eax: address to translate
1118 ## %esi: current client pc offset
1119 ##
1120 ## OUT %edx: half, zero extended
1121 ##
1122 ## WILL NOT RETURN ON EXCEPTION!
1123 ##
1124 EXPORT(ppc_read_effective_half_z_asm):
1125 mov [gCPU(pc_ofs)], %esi
1126 mov %ebx, %eax
1127 and %ebx, 0xfff
1128 cmp %ebx, 4095
1129 jae 1f
1130
1131 push 4 # roll back 4 bytes in case of exception
1132 call ppc_effective_to_physical_data_read
1133 cmp %eax, [EXTERN(gMemorySize)]
1134 jae 2f
1135 add %eax, [EXTERN(gMemory)]
1136 movzx %edx, word ptr [%eax]
1137 xchg %dl, %dh
1138 ret
1139 2:
1140 mov %edx, 2
1141 call EXTERN(io_mem_read_glue)
1142 xchg %al, %ah
1143 movzx %edx, %ax
1144 ret
1145
1146 1:
1147 push %eax
1148 push 8 # roll back 8 bytes in case of exception
1149 call ppc_effective_to_physical_data_read
1150 xor %edx, %edx
1151 cmp %eax, [EXTERN(gMemorySize)]
1152 jae 2f
1153 add %eax, [EXTERN(gMemory)]
1154 mov %dh, [%eax]
1155 1:
1156 pop %eax
1157 push %edx
1158 inc %eax
1159 push 8 # roll back 8 bytes in case of exception
1160 call ppc_effective_to_physical_data_read
1161 pop %edx
1162 cmp %eax, [EXTERN(gMemorySize)]
1163 jae 3f
1164 add %eax, [EXTERN(gMemory)]
1165 mov %dl, [%eax]
1166 ret
1167
1168 2:
1169 pusha
1170 mov %edx, 1
1171 call EXTERN(io_mem_read_glue)
1172 mov [gCPU(temp2)], %al
1173 popa
1174 mov %dh, [gCPU(temp2)]
1175 jmp 1b
1176 3:
1177 push %edx
1178 mov %edx, 1
1179 call EXTERN(io_mem_read_glue)
1180 pop %edx
1181 mov %dl, %al
1182 ret
1183 .balign 16
1184 ##############################################################################################
1185 ## uint32 FASTCALL ppc_read_effective_half()
1186 ##
1187 ## IN %eax: address to translate
1188 ## %esi: current client pc offset
1189 ##
1190 ## OUT %edx: half, sign extended
1191 ##
1192 ## WILL NOT RETURN ON EXCEPTION!
1193 ##
1194 EXPORT(ppc_read_effective_half_s_asm):
1195 mov [gCPU(pc_ofs)], %esi
1196 mov %ebx, %eax
1197 and %ebx, 0xfff
1198 cmp %ebx, 4095
1199 jae 1f
1200
1201 push 4 # roll back 4 bytes in case of exception
1202 call ppc_effective_to_physical_data_read
1203 cmp %eax, [EXTERN(gMemorySize)]
1204 jae 2f
1205 add %eax, [EXTERN(gMemory)]
1206 mov %cx, [%eax]
1207 xchg %ch, %cl
1208 movsx %edx, %cx
1209 ret
1210 2:
1211 mov %edx, 2
1212 call EXTERN(io_mem_read_glue)
1213 xchg %ah, %al
1214 movsx %edx, %ax
1215 ret
1216
1217 1:
1218 push %eax
1219 push 8 # roll back 8 bytes in case of exception
1220 call ppc_effective_to_physical_data_read
1221 cmp %eax, [EXTERN(gMemorySize)]
1222 jae 2f
1223 add %eax, [EXTERN(gMemory)]
1224 mov %ch, [%eax]
1225 1:
1226 pop %eax
1227 push %ecx
1228 inc %eax
1229 push 8 # roll back 8 bytes in case of exception
1230 call ppc_effective_to_physical_data_read
1231 pop %ecx
1232 cmp %eax, [EXTERN(gMemorySize)]
1233 jae 3f
1234 add %eax, [EXTERN(gMemory)]
1235 mov %cl, [%eax]
1236 movsx %edx, %cx
1237 ret
1238
1239 2:
1240 pusha
1241 mov %edx, 1
1242 call EXTERN(io_mem_read_glue)
1243 mov [gCPU(temp2)], %al
1244 popa
1245 mov %ch, [gCPU(temp2)]
1246 jmp 1b
1247 3:
1248 push %ecx
1249 mov %edx, 1
1250 call EXTERN(io_mem_read_glue)
1251 pop %ecx
1252 mov %cl, %al
1253 movsx %edx, %cx
1254 ret
1255
1256 .balign 16
1257 ##############################################################################################
1258 ## uint32 FASTCALL ppc_read_effective_word()
1259 ##
1260 ## IN %eax: address to translate
1261 ## %esi: current client pc offset
1262 ##
1263 ## OUT %edx: word
1264 ##
1265 ## WILL NOT RETURN ON EXCEPTION!
1266 ##
1267 EXPORT(ppc_read_effective_word_asm):
1268 mov [gCPU(pc_ofs)], %esi
1269 mov %ebx, %eax
1270 and %ebx, 0xfff
1271 cmp %ebx, 4093
1272 jae 1f
1273
1274 push 4 # roll back 4 bytes in case of exception
1275 call ppc_effective_to_physical_data_read
1276 cmp %eax, [EXTERN(gMemorySize)]
1277 jae 2f
1278 add %eax, [EXTERN(gMemory)]
1279 mov %edx, [%eax]
1280 bswap %edx
1281 ret
1282 2:
1283 mov %edx, 4
1284 call EXTERN(io_mem_read_glue)
1285 mov %edx, %eax
1286 bswap %edx
1287 ret
1288 1:
1289 push %eax
1290 push %ebx
1291 push 12 # roll back 12 bytes in case of exception
1292 call ppc_effective_to_physical_data_read
1293 pop %ebx
1294 mov %ecx, 4096
1295 sub %ecx, %ebx
1296 cmp %eax, [EXTERN(gMemorySize)]
1297 jae 2f
1298 add %eax, [EXTERN(gMemory)]
1299 1:
1300 shl %edx, 8
1301 mov %dl, [%eax]
1302 inc %eax
1303 dec %ecx
1304 jnz 1b
1305 4:
1306 pop %eax
1307 push %edx
1308 add %eax, 4
1309 push %ebx
1310 and %eax, 0xfffff000
1311 push 12 # roll back 12 bytes in case of exception
1312 call ppc_effective_to_physical_data_read
1313 pop %ebx
1314 pop %edx
1315 sub %ebx, 4092
1316 cmp %eax, [EXTERN(gMemorySize)]
1317 jae 3f
1318 add %eax, [EXTERN(gMemory)]
1319 1:
1320 shl %edx, 8
1321 mov %dl, [%eax]
1322 inc %eax
1323 dec %ebx
1324 jnz 1b
1325 ret
1326
1327 2:
1328 1:
1329 shl %edx, 8
1330 pusha
1331 mov %edx, 1
1332 call EXTERN(io_mem_read_glue)
1333 mov [gCPU(temp2)], %al
1334 popa
1335 mov %dl, [gCPU(temp2)]
1336 inc %eax
1337 dec %ecx
1338 jnz 1b
1339 jmp 4b
1340 3:
1341 1:
1342 shl %edx, 8
1343 pusha
1344 mov %edx, 1
1345 call EXTERN(io_mem_read_glue)
1346 mov [gCPU(temp2)], %al
1347 popa
1348 mov %dl, [gCPU(temp2)]
1349 inc %eax
1350 dec %ebx
1351 jnz 1b
1352 ret
1353 .balign 16
1354 ##############################################################################################
1355 ## uint32 FASTCALL ppc_read_effective_dword()
1356 ##
1357 ## IN %eax: address to translate
1358 ## %esi: current client pc offset
1359 ##
1360 ## OUT %ecx:%edx dword
1361 ##
1362 ## WILL NOT RETURN ON EXCEPTION!
1363 ##
1364 EXPORT(ppc_read_effective_dword_asm):
1365 mov [gCPU(pc_ofs)], %esi
1366 mov %ebx, %eax
1367 and %ebx, 0xfff
1368 cmp %ebx, 4089
1369 jae 1f
1370
1371 push 4 # roll back 4 bytes in case of exception
1372 call ppc_effective_to_physical_data_read
1373 cmp %eax, [EXTERN(gMemorySize)]
1374 jae 2f
1375 add %eax, [EXTERN(gMemory)]
1376 mov %ecx, [%eax]
1377 mov %edx, [%eax+4]
1378 bswap %ecx
1379 bswap %edx
1380 ret
1381 2:
1382 call EXTERN(io_mem_read64_glue)
1383 mov %ecx, %eax
1384 mov %edx, %edx
1385 bswap %ecx
1386 bswap %edx
1387 ret
1388
1389 1:
1390 push %eax
1391 push %ebx
1392 push 12 # roll back 12 bytes in case of exception
1393 call ppc_effective_to_physical_data_read
1394 pop %ebx
1395 mov %ebp, 4096
1396 sub %ebp, %ebx
1397 cmp %eax, [EXTERN(gMemorySize)]
1398 jae 2f
1399 add %eax, [EXTERN(gMemory)]
1400 1:
1401 shld %ecx, %edx, 8
1402 shl %edx, 8
1403 mov %dl, [%eax]
1404 inc %eax
1405 dec %ebp
1406 jnz 1b
1407 4:
1408 pop %eax
1409 push %ecx
1410 push %edx
1411 add %eax, 8
1412 push %ebx
1413 and %eax, 0xfffff000
1414 push 16 # roll back 16 bytes in case of exception
1415 call ppc_effective_to_physical_data_read
1416 pop %ebx
1417 pop %edx
1418 pop %ecx
1419 sub %ebx, 4088
1420 cmp %eax, [EXTERN(gMemorySize)]
1421 jae 3f
1422 add %eax, [EXTERN(gMemory)]
1423 1:
1424 shld %ecx, %edx, 8
1425 shl %edx, 8
1426 mov %dl, [%eax]
1427 inc %eax
1428 dec %ebx
1429 jnz 1b
1430 ret
1431
1432 2:
1433 1:
1434 shld %ecx, %edx, 8
1435 shl %edx, 8
1436 pusha
1437 mov %edx, 1
1438 call EXTERN(io_mem_read_glue)
1439 mov [gCPU(temp2)], %al
1440 popa
1441 mov %dl, [gCPU(temp2)]
1442 inc %eax
1443 dec %ebp
1444 jnz 1b
1445 jmp 4b
1446 3:
1447 1:
1448 shld %ecx, %edx, 8
1449 shl %edx, 8
1450 pusha
1451 mov %edx, 1
1452 call EXTERN(io_mem_read_glue)
1453 mov [gCPU(temp2)], %al
1454 popa
1455 mov %dl, [gCPU(temp2)]
1456 inc %eax
1457 dec %ebx
1458 jnz 1b
1459 ret
1460 .balign 16
1461 ##############################################################################################
1462 ## uint32 FASTCALL ppc_read_effective_qword()
1463 ##
1464 ## IN %eax: address to translate
1465 ## %edx: address to store the qword
1466 ## %esi: current client pc offset
1467 ##
1468 ## WILL NOT RETURN ON EXCEPTION!
1469 ##
1470 EXPORT(ppc_read_effective_qword_asm):
1471 mov [gCPU(pc_ofs)], %esi
1472 and %eax, 0xfffffff0
1473 push %edx
1474
1475 push 8 # roll back 8 bytes in case of exception
1476 call ppc_effective_to_physical_data_read
1477
1478 cmp %eax, [EXTERN(gMemorySize)]
1479 pop %edx
1480 jae 1f
1481
1482 add %eax, [EXTERN(gMemory)]
1483
1484 mov %ebx, [%eax]
1485 mov %ecx, [%eax+4]
1486 mov %edi, [%eax+8]
1487 mov %esi, [%eax+12]
1488
1489 bswap %ebx
1490 bswap %ecx
1491 bswap %edi
1492 bswap %esi
1493
1494 mov [%edx+12], %ebx
1495 mov [%edx+8], %ecx
1496 mov [%edx+4], %edi
1497 mov [%edx], %esi
1498 ret
1499 1:
1500 call EXTERN(io_mem_read128_glue)
1501 ret
1502
1503 EXPORT(ppc_read_effective_qword_sse_asm):
1504 mov [gCPU(pc_ofs)], %esi
1505 and %eax, 0xfffffff0
1506 push %edx
1507
1508 push 8 # roll back 8 bytes in case of exception
1509 call ppc_effective_to_physical_data_read
1510
1511 cmp %eax, [EXTERN(gMemorySize)]
1512 pop %edx
1513 jae 1f
1514
1515 add %eax, [EXTERN(gMemory)]
1516
1517 movaps %xmm0, [%eax]
1518
1519 mov %ebx, [%eax]
1520 mov %ecx, [%eax+4]
1521 mov %edi, [%eax+8]
1522 mov %esi, [%eax+12]
1523
1524 bswap %ebx
1525 bswap %ecx
1526 bswap %edi
1527 bswap %esi
1528
1529 mov [%edx+12], %ebx
1530 mov [%edx+8], %ecx
1531 mov [%edx+4], %edi
1532 mov [%edx], %esi
1533 ret
1534
1535 1:
1536 push %edx
1537 call EXTERN(io_mem_read128_native_glue)
1538 pop %edx
1539
1540 movaps %xmm0, [%edx]
1541
1542 mov %eax, [%edx]
1543 mov %ebx, [%edx+4]
1544 mov %edi, [%edx+8]
1545 mov %esi, [%edx+12]
1546
1547 bswap %eax
1548 bswap %ebx
1549 bswap %edi
1550 bswap %esi
1551
1552 mov [%edx+12], %esi
1553 mov [%edx+8], %edi
1554 mov [%edx+4], %ebx
1555 mov [%edx], %eax
1556 ret
1557
1558 .balign 16
1559 ##############################################################################################
1560 ## uint32 FASTCALL ppc_opc_stswi_asm()
1561 ##
1562 ## IN %ecx: NB
1563 ## %ebx: source
1564 ## %eax: dest
1565 ## %esi: current client pc offset
1566 ##
1567 ## WILL NOT RETURN ON EXCEPTION!
1568 ##
1569 EXPORT(ppc_opc_stswi_asm):
1570 mov [gCPU(pc_ofs)], %esi
1571 mov %edi, 1
1572
1573 1:
1574 dec %edi
1575 jnz 2f
1576 mov %edx, [gCPU(gpr+4*%ebx)]
1577 inc %ebx
1578 mov %edi, 4
1579 and %ebx, 0x1f
1580 2:
1581 push %eax
1582 push %ecx
1583 push %ebx
1584 push %edi
1585 push %edx
1586 push 24 # roll back 24 bytes in case of exception
1587 call ppc_effective_to_physical_data_write
1588 cmp %eax, [EXTERN(gMemorySize)]
1589 pop %edx
1590 mov %ecx, %edx
1591 jae 3f
1592 shr %ecx, 24
1593 add %eax, [EXTERN(gMemory)]
1594 mov [%eax], %cl
1595 4:
1596 pop %edi
1597 pop %ebx
1598 pop %ecx
1599 pop %eax
1600 shl %edx, 8
1601 inc %eax
1602 dec %ecx
1603 jnz 1b
1604 ret
1605
1606 3:
1607 push %edx
1608 mov %ecx, 1
1609 shr %edx, 24
1610 call EXTERN(io_mem_write_glue)
1611 pop %edx
1612 jmp 4b
1613 .balign 16
1614 ##############################################################################################
1615 ## uint32 FASTCALL ppc_opc_lswi_asm()
1616 ##
1617 ## IN %ecx: NB
1618 ## %ebx: dest
1619 ## %eax: source
1620 ## %esi: current client pc offset
1621 ##
1622 ## WILL NOT RETURN ON EXCEPTION!
1623 ##
1624 EXPORT(ppc_opc_lswi_asm):
1625 mov [gCPU(pc_ofs)], %esi
1626 mov %edi, 4
1627 1:
1628 or %edi, %edi
1629 jnz 2f
1630 mov [gCPU(gpr+4*%ebx)], %edx
1631 inc %ebx
1632 mov %edi, 4
1633 and %ebx, 0x1f
1634 xor %edx, %edx
1635 2:
1636
1637 push %eax
1638 push %ecx
1639 push %ebx
1640 push %edi
1641 push %edx
1642 push 24 # roll back 24 bytes in case of exception
1643 call ppc_effective_to_physical_data_read
1644 pop %edx
1645 cmp %eax, [EXTERN(gMemorySize)]
1646 jae 3f
1647 add %eax, [EXTERN(gMemory)]
1648 shl %edx, 8
1649 mov %dl, byte ptr [%eax]
1650 4:
1651 pop %edi
1652 pop %ebx
1653 pop %ecx
1654 pop %eax
1655
1656 dec %edi
1657 inc %eax
1658 dec %ecx
1659 jnz 1b
1660
1661 or %edi, %edi
1662 jz 5f
1663 2:
1664 shl %edx, 8
1665 dec %edi
1666 jnz 2b
1667
1668 5:
1669 mov [gCPU(gpr)+4*%ebx], %edx
1670 ret
1671
1672 3:
1673 push %edx
1674 mov %edx, 1
1675 call EXTERN(io_mem_read_glue)
1676 pop %edx
1677 shl %edx, 8
1678 mov %dl, %al
1679 jmp 4b
1680
1681 .balign 16
1682 ##############################################################################################
1683 ## uint32 FASTCALL ppc_opc_icbi_asm()
1684 ##
1685 ## IN %eax: effective address
1686 EXPORT(ppc_opc_icbi_asm):
1687 mov [gCPU(pc_ofs)], %esi
1688 push 4 # roll back 4 bytes in case of exception
1689 add %eax, 1 # FIXME: WTF???
1690 call ppc_effective_to_physical_data_read
1691 cmp %eax, [EXTERN(gMemorySize)]
1692 mov %ebp, [gJITC(clientPages)]
1693 jae 1f
1694 shr %eax, 12
1695 cmp dword ptr [%ebp+%eax*4], 0
1696 jnz 2f
1697 1:
1698 ret
1699
1700 2:
1701 mov %eax, [%ebp+%eax*4]
1702 jmp EXTERN(jitcDestroyAndFreeClientPage)

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26