map.S 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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. .text
  8. .align 8192
  9. .globl prom_boot_page
  10. prom_boot_page:
  11. call_method:
  12. .asciz "call-method"
  13. .align 8
  14. map:
  15. .asciz "map"
  16. .align 8
  17. /* When we are invoked, our caller has remapped us to
  18. * page zero, therefore we must use PC relative addressing
  19. * for everything after we begin performing the unmap/map
  20. * calls.
  21. */
  22. .globl prom_remap
  23. prom_remap: /* %o0 = physpage, %o1 = virtpage, %o2 = mmu_ihandle */
  24. rd %pc, %g1
  25. srl %o2, 0, %o2 ! kill sign extension
  26. sethi %hi(p1275buf), %g2
  27. or %g2, %lo(p1275buf), %g2
  28. ldx [%g2 + 0x10], %g3 ! prom_cif_stack
  29. save %g3, -(192 + 128), %sp
  30. ldx [%g2 + 0x08], %l0 ! prom_cif_handler
  31. mov %g6, %i3
  32. mov %g4, %i4
  33. mov %g5, %i5
  34. flushw
  35. sethi %hi(prom_remap - call_method), %g7
  36. or %g7, %lo(prom_remap - call_method), %g7
  37. sub %g1, %g7, %l2 ! call-method string
  38. sethi %hi(prom_remap - map), %g7
  39. or %g7, %lo(prom_remap - map), %g7
  40. sub %g1, %g7, %l4 ! map string
  41. /* OK, map the 4MB region we really live at. */
  42. stx %l2, [%sp + 2047 + 128 + 0x00] ! call-method
  43. mov 7, %l5
  44. stx %l5, [%sp + 2047 + 128 + 0x08] ! num_args
  45. mov 1, %l5
  46. stx %l5, [%sp + 2047 + 128 + 0x10] ! num_rets
  47. stx %l4, [%sp + 2047 + 128 + 0x18] ! map
  48. stx %i2, [%sp + 2047 + 128 + 0x20] ! mmu_ihandle
  49. mov -1, %l5
  50. stx %l5, [%sp + 2047 + 128 + 0x28] ! mode == default
  51. sethi %hi(4 * 1024 * 1024), %l5
  52. stx %l5, [%sp + 2047 + 128 + 0x30] ! size
  53. stx %i1, [%sp + 2047 + 128 + 0x38] ! vaddr
  54. stx %g0, [%sp + 2047 + 128 + 0x40] ! filler
  55. stx %i0, [%sp + 2047 + 128 + 0x48] ! paddr
  56. call %l0
  57. add %sp, (2047 + 128), %o0 ! argument array
  58. /* Restore hard-coded globals. */
  59. mov %i3, %g6
  60. mov %i4, %g4
  61. mov %i5, %g5
  62. /* Wheee.... we are done. */
  63. ret
  64. restore
  65. .align 8192