read-image.scm 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. ; Part of Scheme 48 1.9. See file COPYING for notices and license.
  2. ; Authors: David Frese, Mike Sperber
  3. ;; Image reader that reads images into the BIBOP GC
  4. (define (really-read-image format reverse-byte-order? port)
  5. (enum-case image-format format
  6. ((two-space)
  7. (really-read-image-portable format reverse-byte-order? port))
  8. ((bibop)
  9. (really-read-image-bibop-native reverse-byte-order? port))
  10. (else
  11. (read-lost "invalid image format" port))))
  12. (define (really-read-image-bibop-native reverse-byte-order? port)
  13. ;; debugging
  14. ;;(describe-small)
  15. ;;(describe-large)
  16. ;;(describe-weaks)
  17. (let* ((small-delta (address-difference (s48-get-new-small-start-addr)
  18. (get-small-img-start-addr)))
  19. (small-new-hp (address+ (get-small-img-hp-addr) small-delta))
  20. (large-delta (address-difference (s48-get-new-large-start-addr)
  21. (get-large-img-start-addr)))
  22. (large-new-hp (address+ (get-large-img-hp-addr) large-delta))
  23. (weaks-delta (address-difference (s48-get-new-weaks-start-addr)
  24. (get-weaks-img-start-addr)))
  25. (weaks-new-hp (address+ (get-weaks-img-hp-addr) weaks-delta)))
  26. (cond
  27. ((got-error? (really-read-weaks-image port))
  28. (read-lost "error reading weaks area from image" port))
  29. ((got-error? (really-read-large-image port))
  30. (read-lost "error reading large area from image" port))
  31. ((got-error? (really-read-small-image port))
  32. (read-lost "error reading small area from image" port))
  33. (else
  34. (receive (ch eof? status)
  35. (read-char port)
  36. (cond ((error? status)
  37. (read-lost "Error reading from image file" port))
  38. ((not eof?)
  39. (read-lost "Image file has extraneous data after image" port))
  40. ((error? (close-input-port port))
  41. (read-lost "Error closing image file" port))
  42. (else
  43. (if reverse-byte-order?
  44. (begin
  45. (reverse-byte-order! (s48-get-new-small-start-addr) small-new-hp)
  46. (reverse-byte-order! (s48-get-new-large-start-addr) large-new-hp)
  47. (reverse-byte-order! (s48-get-new-weaks-start-addr) weaks-new-hp)))
  48. ;; here we have to adjust along the new sizes of the areas
  49. ;; TODO: the adjustment must depend on where the
  50. ;; addresses point to (small, large, weaks). If the
  51. ;; delta's differ, it won't work like it is, so for now
  52. ;; we make sure they are equal
  53. (if (not (and (= small-delta large-delta)
  54. (= large-delta weaks-delta)))
  55. (error "Bug: Cannot load image, because the deltas of all parts aren't equal. Notify the authors."))
  56. (if (not (= small-delta 0))
  57. (begin
  58. (set-startup-procedure! (adjust (get-startup-procedure) small-delta))
  59. (set-symbols! (adjust (get-symbols) small-delta))
  60. (set-imported-bindings! (adjust (get-imported-bindings) small-delta))
  61. (set-exported-bindings! (adjust (get-exported-bindings) small-delta))
  62. (set-resumer-records! (adjust (get-resumer-records) small-delta))
  63. (relocate-symbol-table-two-space! (get-symbols) small-delta)
  64. (relocate-binding-table-two-space! (get-imported-bindings) small-delta)
  65. (relocate-binding-table-two-space! (get-exported-bindings) small-delta)
  66. (relocate-image small-delta (s48-get-new-small-start-addr) small-new-hp)))
  67. (if (not (= large-delta 0))
  68. (begin
  69. ;; debugging
  70. ;;(notify-large-delta)
  71. (relocate-image large-delta (s48-get-new-large-start-addr) large-new-hp)
  72. (unspecific)))
  73. (if (not (= weaks-delta 0))
  74. (begin
  75. ;; debugging
  76. ;;(notify-weaks-delta)
  77. (relocate-image weaks-delta (s48-get-new-weaks-start-addr) weaks-new-hp)
  78. (unspecific)))
  79. 0)))))))
  80. (define s48-get-new-small-end-addr
  81. (external "s48_get_new_small_end_addr" (=> () address)))
  82. (define s48-get-new-large-end-addr
  83. (external "s48_get_new_large_end_addr" (=> () address)))
  84. (define s48-get-new-weaks-end-addr
  85. (external "s48_get_new_weaks_end_addr" (=> () address)))
  86. (define s48-get-new-small-size
  87. (external "s48_get_new_small_size" (=> () integer)))
  88. (define s48-get-new-large-size
  89. (external "s48_get_new_large_size" (=> () integer)))
  90. (define s48-get-new-weaks-size
  91. (external "s48_get_new_weaks_size" (=> () integer)))
  92. (define (get-small-img-whole-size)
  93. (address-difference (get-small-img-end-addr)
  94. (get-small-img-start-addr)))
  95. (define (get-large-img-whole-size)
  96. (address-difference (get-large-img-end-addr)
  97. (get-large-img-start-addr)))
  98. (define (get-weaks-img-whole-size)
  99. (address-difference (get-weaks-img-end-addr)
  100. (get-weaks-img-start-addr)))
  101. (define (initialize-image-areas!)
  102. (s48-initialize-image-areas (get-small-img-whole-size)
  103. (address-difference (get-small-img-hp-addr)
  104. (get-small-img-start-addr))
  105. (get-large-img-whole-size)
  106. (address-difference (get-large-img-hp-addr)
  107. (get-large-img-start-addr))
  108. (get-weaks-img-whole-size)
  109. (address-difference (get-weaks-img-hp-addr)
  110. (get-weaks-img-start-addr))))
  111. ; debugging
  112. (define (describe-small)
  113. (write-out-newline)
  114. (write-out-string "-----------")
  115. (write-out-newline)
  116. (write-out-string "SMALL DATA ")
  117. (write-out-newline)
  118. (write-out-string "-----------")
  119. (write-out-newline)
  120. (write-out-string "(get-small-img-start-addr): ")
  121. (write-out-integer (address->integer (get-small-img-start-addr)))
  122. (write-out-newline)
  123. (write-out-string "(get-small-img-hp-addr): ")
  124. (write-out-integer (address->integer (get-small-img-hp-addr)))
  125. (write-out-newline)
  126. (write-out-string "(get-small-img-end-addr): ")
  127. (write-out-integer (address->integer (get-small-img-end-addr)))
  128. (write-out-newline)
  129. (write-out-string "PAGES: ")
  130. (write-out-integer (quotient (address-difference (get-small-img-end-addr)
  131. (get-small-img-start-addr))
  132. 4096))
  133. (write-out-newline)
  134. (write-out-string "(get-new-small-start-addr): ")
  135. (write-out-integer (address->integer (s48-get-new-small-start-addr)))
  136. (write-out-newline)
  137. (write-out-string "(get-new-small-end-addr): ")
  138. (write-out-integer (address->integer (s48-get-new-small-end-addr)))
  139. (write-out-newline)
  140. (write-out-string "PAGES: : ")
  141. (write-out-integer (quotient (address-difference (s48-get-new-small-end-addr)
  142. (s48-get-new-small-start-addr))
  143. 4096))
  144. (write-out-newline)
  145. (write-out-string "(get-new-small-size): ")
  146. (write-out-integer (s48-get-new-small-size))
  147. (write-out-newline)
  148. (write-out-string "(get-small-img-heap-size): ")
  149. (write-out-integer (cells->a-units (get-small-img-heap-size)))
  150. (write-out-newline)
  151. )
  152. (define (describe-large)
  153. (write-out-newline)
  154. (write-out-string "-----------")
  155. (write-out-newline)
  156. (write-out-string "LARGE DATA ")
  157. (write-out-newline)
  158. (write-out-string "-----------")
  159. (write-out-newline)
  160. (write-out-newline)
  161. (write-out-string "(get-large-img-start-addr): ")
  162. (write-out-integer (address->integer (get-large-img-start-addr)))
  163. (write-out-newline)
  164. (write-out-string "(get-large-img-end-addr): ")
  165. (write-out-integer (address->integer (get-large-img-end-addr)))
  166. (write-out-newline)
  167. (write-out-string "PAGES: ")
  168. (write-out-integer (quotient (address-difference (get-large-img-end-addr)
  169. (get-large-img-start-addr))
  170. 4096))
  171. (write-out-newline)
  172. (write-out-string "(get-new-large-start-addr): ")
  173. (write-out-integer (address->integer (s48-get-new-large-start-addr)))
  174. (write-out-newline)
  175. (write-out-string "(get-new-large-end-addr): ")
  176. (write-out-integer (address->integer (s48-get-new-large-end-addr)))
  177. (write-out-newline)
  178. (write-out-string "PAGES: : ")
  179. (write-out-integer (quotient (s48-get-new-large-size) 4096))
  180. (write-out-newline)
  181. (write-out-string "(get-new-large-size): ")
  182. (write-out-integer (s48-get-new-large-size))
  183. (write-out-newline)
  184. (write-out-string "(get-large-img-heap-size): ")
  185. (write-out-integer (cells->a-units (get-large-img-heap-size)))
  186. (write-out-newline))
  187. (define (describe-weaks)
  188. (write-out-newline)
  189. (write-out-string "-----------")
  190. (write-out-newline)
  191. (write-out-string "WEAKS DATA ")
  192. (write-out-newline)
  193. (write-out-string "-----------")
  194. (write-out-newline)
  195. (write-out-newline)
  196. (write-out-string "(get-weaks-img-start-addr): ")
  197. (write-out-integer (address->integer (get-weaks-img-start-addr)))
  198. (write-out-newline)
  199. (write-out-string "(get-weaks-img-end-addr): ")
  200. (write-out-integer (address->integer (get-weaks-img-end-addr)))
  201. (write-out-newline)
  202. (write-out-string "PAGES: ")
  203. (write-out-integer (quotient (address-difference (get-weaks-img-end-addr)
  204. (get-weaks-img-start-addr))
  205. 4096))
  206. (write-out-newline)
  207. (write-out-string "(get-new-weaks-start-addr): ")
  208. (write-out-integer (address->integer (s48-get-new-weaks-start-addr)))
  209. (write-out-newline)
  210. (write-out-string "(get-new-weaks-end-addr): ")
  211. (write-out-integer (address->integer (s48-get-new-weaks-end-addr)))
  212. (write-out-newline)
  213. (write-out-string "PAGES: : ")
  214. (write-out-integer (quotient (s48-get-new-weaks-size) 4096))
  215. (write-out-newline)
  216. (write-out-string "(get-new-weaks-size): ")
  217. (write-out-integer (s48-get-new-weaks-size))
  218. (write-out-newline)
  219. (write-out-string "(get-weaks-img-heap-size): ")
  220. (write-out-integer (cells->a-units (get-weaks-img-heap-size)))
  221. (write-out-newline))
  222. (define (notify-small-delta)
  223. (break "ADJUST SMALL DELTA"))
  224. (define (notify-large-delta)
  225. (break "ADJUST LARGE DELTA"))
  226. (define (notify-weaks-delta)
  227. (break "ADJUST WEAKS DELTA"))
  228. (define (break str)
  229. (write-out-newline)
  230. (write-out-string str)
  231. (write-out-newline))
  232. ; Utilities for portable reader
  233. (define (read-image-area new-start-addr img-heap-size port)
  234. (receive (okay? string)
  235. (image-read-block port
  236. new-start-addr
  237. (cells->a-units img-heap-size))
  238. (cond ((not okay?)
  239. (read-lost string port))
  240. (else 0))))
  241. (define (really-read-small-image port)
  242. (read-image-area (s48-get-new-small-start-addr)
  243. (get-small-img-heap-size)
  244. port))
  245. (define (really-read-large-image port)
  246. (read-image-area (s48-get-new-large-start-addr)
  247. (get-large-img-heap-size)
  248. port))
  249. (define (really-read-weaks-image port)
  250. (read-image-area (s48-get-new-weaks-start-addr)
  251. (get-weaks-img-heap-size)
  252. port))