Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame^] | 1 | /* $Id: map.S,v 1.2 1999/11/19 05:53:02 davem Exp $ |
| 2 | * map.S: Tricky coding required to fixup the kernel OBP maps |
| 3 | * properly. |
| 4 | * |
| 5 | * Copyright (C) 1999 David S. Miller (davem@redhat.com) |
| 6 | */ |
| 7 | |
| 8 | .text |
| 9 | .align 8192 |
| 10 | .globl prom_boot_page |
| 11 | prom_boot_page: |
| 12 | call_method: |
| 13 | .asciz "call-method" |
| 14 | .align 8 |
| 15 | map: |
| 16 | .asciz "map" |
| 17 | .align 8 |
| 18 | |
| 19 | /* When we are invoked, our caller has remapped us to |
| 20 | * page zero, therefore we must use PC relative addressing |
| 21 | * for everything after we begin performing the unmap/map |
| 22 | * calls. |
| 23 | */ |
| 24 | .globl prom_remap |
| 25 | prom_remap: /* %o0 = physpage, %o1 = virtpage, %o2 = mmu_ihandle */ |
| 26 | rd %pc, %g1 |
| 27 | srl %o2, 0, %o2 ! kill sign extension |
| 28 | sethi %hi(p1275buf), %g2 |
| 29 | or %g2, %lo(p1275buf), %g2 |
| 30 | ldx [%g2 + 0x10], %g3 ! prom_cif_stack |
| 31 | save %g3, -(192 + 128), %sp |
| 32 | ldx [%g2 + 0x08], %l0 ! prom_cif_handler |
| 33 | mov %g6, %i3 |
| 34 | mov %g4, %i4 |
| 35 | mov %g5, %i5 |
| 36 | flushw |
| 37 | |
| 38 | sethi %hi(prom_remap - call_method), %g7 |
| 39 | or %g7, %lo(prom_remap - call_method), %g7 |
| 40 | sub %g1, %g7, %l2 ! call-method string |
| 41 | sethi %hi(prom_remap - map), %g7 |
| 42 | or %g7, %lo(prom_remap - map), %g7 |
| 43 | sub %g1, %g7, %l4 ! map string |
| 44 | |
| 45 | /* OK, map the 4MB region we really live at. */ |
| 46 | stx %l2, [%sp + 2047 + 128 + 0x00] ! call-method |
| 47 | mov 7, %l5 |
| 48 | stx %l5, [%sp + 2047 + 128 + 0x08] ! num_args |
| 49 | mov 1, %l5 |
| 50 | stx %l5, [%sp + 2047 + 128 + 0x10] ! num_rets |
| 51 | stx %l4, [%sp + 2047 + 128 + 0x18] ! map |
| 52 | stx %i2, [%sp + 2047 + 128 + 0x20] ! mmu_ihandle |
| 53 | mov -1, %l5 |
| 54 | stx %l5, [%sp + 2047 + 128 + 0x28] ! mode == default |
| 55 | sethi %hi(4 * 1024 * 1024), %l5 |
| 56 | stx %l5, [%sp + 2047 + 128 + 0x30] ! size |
| 57 | stx %i1, [%sp + 2047 + 128 + 0x38] ! vaddr |
| 58 | stx %g0, [%sp + 2047 + 128 + 0x40] ! filler |
| 59 | stx %i0, [%sp + 2047 + 128 + 0x48] ! paddr |
| 60 | call %l0 |
| 61 | add %sp, (2047 + 128), %o0 ! argument array |
| 62 | |
| 63 | /* Restore hard-coded globals. */ |
| 64 | mov %i3, %g6 |
| 65 | mov %i4, %g4 |
| 66 | mov %i5, %g5 |
| 67 | |
| 68 | /* Wheee.... we are done. */ |
| 69 | ret |
| 70 | restore |
| 71 | |
| 72 | .align 8192 |