mmap_helper.S 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. /* Mmap management. */
  2. /*
  3. * GRUB -- GRand Unified Bootloader
  4. * Copyright (C) 2009 Free Software Foundation, Inc.
  5. *
  6. * GRUB is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * GRUB 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 GRUB. If not, see <http://www.gnu.org/licenses/>.
  18. */
  19. #include <grub/symbol.h>
  20. #define DS(x) ((x) - LOCAL (segstart))
  21. LOCAL (segstart):
  22. VARIABLE(grub_machine_mmaphook_start)
  23. .code16
  24. VARIABLE(grub_machine_mmaphook_int12)
  25. push %ds
  26. push %cs
  27. pop %ds
  28. #ifdef __APPLE__
  29. LOCAL(kblow_offset) = DS (LOCAL (kblow))
  30. movw LOCAL(kblow_offset), %ax
  31. #else
  32. movw DS (LOCAL (kblow)), %ax
  33. #endif
  34. pop %ds
  35. iret
  36. VARIABLE(grub_machine_mmaphook_int15)
  37. pushf
  38. cmpw $0xe801, %ax
  39. jz LOCAL (e801)
  40. cmpw $0xe820, %ax
  41. jz LOCAL (e820)
  42. cmpb $0x88, %ah
  43. jz LOCAL (h88)
  44. popf
  45. /* ljmp */
  46. .byte 0xea
  47. VARIABLE (grub_machine_mmaphook_int15offset)
  48. .word 0
  49. VARIABLE (grub_machine_mmaphook_int15segment)
  50. .word 0
  51. LOCAL (e801):
  52. popf
  53. push %ds
  54. push %cs
  55. pop %ds
  56. #ifdef __APPLE__
  57. LOCAL(kbin16mb_offset) = DS (LOCAL (kbin16mb))
  58. LOCAL(m64kbin4gb_offset) = DS (LOCAL (m64kbin4gb))
  59. movw LOCAL(kbin16mb_offset), %ax
  60. movw LOCAL(m64kbin4gb_offset), %bx
  61. #else
  62. movw DS (LOCAL (kbin16mb)), %ax
  63. movw DS (LOCAL (m64kbin4gb)), %bx
  64. #endif
  65. movw %ax, %cx
  66. movw %bx, %dx
  67. pop %ds
  68. clc
  69. jmp LOCAL (iret_cf)
  70. LOCAL (h88):
  71. popf
  72. push %ds
  73. push %cs
  74. pop %ds
  75. #ifdef __APPLE__
  76. movw LOCAL(kbin16mb_offset), %ax
  77. #else
  78. movw DS (LOCAL (kbin16mb)), %ax
  79. #endif
  80. pop %ds
  81. clc
  82. jmp LOCAL (iret_cf)
  83. LOCAL (e820):
  84. popf
  85. push %ds
  86. push %cs
  87. pop %ds
  88. cmpw $20, %cx
  89. jb LOCAL (errexit)
  90. #ifdef __APPLE__
  91. LOCAL(mmap_num_offset) = DS (LOCAL (mmap_num))
  92. cmpw LOCAL(mmap_num_offset), %bx
  93. #else
  94. cmpw DS (LOCAL (mmap_num)), %bx
  95. #endif
  96. jae LOCAL (errexit)
  97. cmp $0x534d4150, %edx
  98. jne LOCAL (errexit)
  99. push %si
  100. push %di
  101. movw $20, %cx
  102. #ifdef __APPLE__
  103. LOCAL(mmaphook_map_offset) = DS(LOCAL (mmaphook_mmap))
  104. movw $LOCAL(mmaphook_map_offset), %si
  105. #else
  106. movw $(DS(LOCAL (mmaphook_mmap))), %si
  107. #endif
  108. mov %bx, %ax
  109. imul $20, %ax
  110. add %ax, %si
  111. rep movsb
  112. pop %di
  113. pop %si
  114. movl $20, %ecx
  115. inc %bx
  116. #ifdef __APPLE__
  117. cmpw LOCAL(mmap_num_offset), %bx
  118. #else
  119. cmpw DS(LOCAL (mmap_num)), %bx
  120. #endif
  121. jb LOCAL (noclean)
  122. xor %bx, %bx
  123. LOCAL (noclean):
  124. mov $0x534d4150, %eax
  125. pop %ds
  126. clc
  127. jmp LOCAL (iret_cf)
  128. LOCAL (errexit):
  129. mov $0x534d4150, %eax
  130. pop %ds
  131. xor %bx, %bx
  132. stc
  133. LOCAL (iret_cf):
  134. push %bp
  135. mov %sp, %bp
  136. setc 6(%bp)
  137. pop %bp
  138. iret
  139. VARIABLE(grub_machine_mmaphook_mmap_num)
  140. LOCAL (mmap_num):
  141. .word 0
  142. VARIABLE(grub_machine_mmaphook_kblow)
  143. LOCAL (kblow):
  144. .word 0
  145. VARIABLE (grub_machine_mmaphook_kbin16mb)
  146. LOCAL (kbin16mb):
  147. .word 0
  148. VARIABLE (grub_machine_mmaphook_64kbin4gb)
  149. LOCAL (m64kbin4gb):
  150. .word 0
  151. LOCAL (mmaphook_mmap):
  152. /* Memory map is placed just after the interrupt handlers. */
  153. VARIABLE(grub_machine_mmaphook_end)
  154. .byte 0