read-image.scm 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. ; Part of Scheme 48 1.9. See file COPYING for notices and license.
  2. ; Authors: Richard Kelsey, Jonathan Rees, Mike Sperber
  3. ;(define-syntax assert
  4. ; (lambda ignore
  5. ; ''assert))
  6. (define debugging? #t)
  7. ; ,bench
  8. ; ,load rts/defenum.scm
  9. ; ,for-syntax ,load my-vm/for-syntax.scm
  10. ; ,load my-vm/s48-prescheme.scm my-vm/util.scm my-vm/memory.scm
  11. ; ,load my-vm/arch.scm my-vm/data.scm my-vm/struct.scm
  12. ; ,load link/s48-features.scm link/read-image.scm
  13. ; ,load-into extended-numbers misc/bigbit.scm
  14. (define (resume filename arg)
  15. (call-startup-procedure (extract (read-image filename)) arg))
  16. (define (call-startup-procedure proc arg)
  17. (proc arg (current-input-port) (current-output-port)))
  18. (define level 14)
  19. (define (read-image filename)
  20. (call-with-input-file filename
  21. (lambda (port)
  22. (read-page port) ; read past any user cruft at the beginning of the file
  23. (let* ((old-level (read-number port))
  24. (old-bytes-per-cell (read-number port))
  25. (old-begin (cells->a-units (read-number port)))
  26. (old-hp (cells->a-units (read-number port)))
  27. (startup-proc (read-number port)))
  28. (read-page port)
  29. (if (not (= old-level level))
  30. (error 'read-image
  31. "format of image is incompatible with this version of system"
  32. old-level level))
  33. (if (not (= old-bytes-per-cell bytes-per-cell))
  34. (error 'read-image
  35. "incompatible bytes-per-cell"
  36. old-bytes-per-cell bytes-per-cell))
  37. ;; ***CHANGED***
  38. (create-memory (a-units->cells (- (addr1+ old-hp) old-begin))
  39. quiescent)
  40. (set! *hp* 0)
  41. (let* ((delta (- *hp* old-begin))
  42. (new-hp (+ old-hp delta)))
  43. (let ((reverse? (check-image-byte-order port)))
  44. (read-block port *memory* *hp* (- old-hp old-begin))
  45. (if reverse?
  46. (reverse-byte-order new-hp))
  47. (if (= delta 0)
  48. (set! *hp* new-hp)
  49. (relocate-image delta new-hp))
  50. (set! *extracted* (make-vector (a-units->cells *memory-end*) #f))
  51. (adjust startup-proc delta)))))))
  52. (define (check-image-byte-order port)
  53. (read-block port *memory* *hp* (cells->a-units 1))
  54. (cond ((= (fetch *hp*) 1)
  55. #f)
  56. (else
  57. (reverse-descriptor-byte-order! *hp*)
  58. (if (= (fetch *hp*) 1)
  59. #t
  60. (begin (error 'check-image-byte-order
  61. "unable to correct byte order" (fetch *hp*))
  62. #f)))))
  63. (define *hp* 0)
  64. (define *extracted* #f)
  65. (define (extract obj)
  66. (cond ((vm-fixnum? obj) (extract-vm-fixnum obj))
  67. ((stob? obj)
  68. (let ((index (a-units->cells (address-after-header obj))))
  69. (or (vector-ref *extracted* index)
  70. (extract-stored-object obj
  71. (lambda (new)
  72. (vector-set! *extracted* index new)
  73. new)))))
  74. ((vm-char? obj) (extract-char obj))
  75. ((vm-eq? obj null) '())
  76. ((vm-eq? obj false) #f)
  77. ((vm-eq? obj true) #t)
  78. ((vm-eq? obj vm-unspecific) (if #f 0))
  79. ((vm-eq? obj unbound-marker) '<unbound>)
  80. ((vm-eq? obj unassigned-marker) '<unassigned>)
  81. (else (error 'extract "random descriptor" obj))))
  82. (define (extract-stored-object old store-new!)
  83. ((vector-ref stored-object-extractors (header-type (stob-header old)))
  84. old store-new!))
  85. (define stored-object-extractors
  86. (make-vector stob-count
  87. (lambda rest
  88. (apply error 'stored-object-extractors "no extractor" rest))))
  89. (define (define-extractor which proc)
  90. (vector-set! stored-object-extractors which proc))
  91. (define-extractor stob/pair
  92. (lambda (old store-new!)
  93. (let ((new (cons #f #f)))
  94. (store-new! new)
  95. (set-car! new (extract (vm-car old)))
  96. (set-cdr! new (extract (vm-cdr old)))
  97. new)))
  98. (define-extractor stob/vm-closure
  99. (lambda (old store-new!)
  100. (store-new! (make-closure (extract (vm-closure-template old))
  101. (extract (vm-closure-env old))))))
  102. (define-extractor stob/symbol
  103. (lambda (obj store-new!)
  104. (store-new! (string->symbol (extract (vm-symbol->string obj))))))
  105. (define-extractor stob/vm-location
  106. (lambda (obj store-new!)
  107. (let ((new (store-new! (make-undefined-location
  108. (+ 10000
  109. (extract (vm-location-id obj))))))
  110. (val (vm-contents obj)))
  111. (if (not (vm-eq? val unbound-marker))
  112. (begin (set-location-defined?! new #t)
  113. (if (not (vm-eq? val unassigned-marker))
  114. (set-contents! new (extract val)))))
  115. new)))
  116. (define-extractor stob/string
  117. (lambda (obj store-new!)
  118. (store-new! (extract-string obj))))
  119. (define-extractor stob/vm-code-vector
  120. (lambda (obj store-new!)
  121. (store-new! (extract-code-vector obj))))
  122. (define-extractor stob/vector
  123. (lambda (obj store-new!)
  124. (let* ((z (vm-vector-length obj))
  125. (v (make-vector z)))
  126. (store-new! v)
  127. (do ((i 0 (+ i 1)))
  128. ((= i z) v)
  129. (vector-set! v i (extract (vm-vector-ref obj i)))))))
  130. ;(define-extractor stob/record
  131. ; (lambda (obj store-new!)
  132. ; (let* ((z (vm-record-length obj))
  133. ; (v (make-record z)))
  134. ; (store-new! v)
  135. ; (do ((i 0 (+ i 1)))
  136. ; ((= i z) v)
  137. ; (record-set! v i (extract (vm-record-ref obj i)))))))
  138. (define-extractor stob/port
  139. (lambda (obj store-new!)
  140. (store-new!
  141. (case (extract-vm-fixnum (port-index obj))
  142. ((0) (current-input-port))
  143. ((1) (current-output-port))
  144. (else (error 'stob/port "unextractable port" obj))))))
  145. (define (extract-code-vector x)
  146. (let ((z (vm-code-vector-length x)))
  147. (let ((v (make-code-vector z 0)))
  148. (do ((i 0 (+ i 1)))
  149. ((>= i z) v)
  150. (code-vector-set! v i (vm-code-vector-ref x i))))))
  151. ; Various things copied from vm/gc.scm
  152. (define (store-next! descriptor)
  153. (store! *hp* descriptor)
  154. (set! *hp* (addr1+ *hp*)))
  155. (define (reverse-descriptor-byte-order! addr)
  156. (let ((x (fetch-byte addr)))
  157. (store-byte! addr (fetch-byte (addr+ addr 3)))
  158. (store-byte! (addr+ addr 3) x))
  159. (let ((x (fetch-byte (addr+ addr 1))))
  160. (store-byte! (addr+ addr 1) (fetch-byte (addr+ addr 2)))
  161. (store-byte! (addr+ addr 2) x)))
  162. (define (reverse-byte-order end)
  163. (write-string "Correcting byte order of resumed image."
  164. (current-output-port))
  165. (newline (current-output-port))
  166. (let loop ((ptr *hp*))
  167. (reverse-descriptor-byte-order! ptr)
  168. (let ((value (fetch ptr)))
  169. (if (addr< ptr end)
  170. (loop (if (b-vector-header? value)
  171. (addr+ (addr1+ ptr) (header-a-units value))
  172. (addr1+ ptr)))))))
  173. (define (adjust descriptor delta)
  174. (if (stob? descriptor)
  175. (make-stob-descriptor (addr+ (address-after-header descriptor) delta))
  176. descriptor))
  177. (define (relocate-image delta new-hp)
  178. (let loop ()
  179. (cond ((addr< *hp* new-hp)
  180. (let ((d (adjust (fetch *hp*) delta)))
  181. (store-next! d)
  182. (cond ;;((eq? d the-primitive-header)
  183. ;; Read symbolic label name.
  184. ;;(store-next!
  185. ;; (label->fixnum (name->label (read port)))))
  186. ((b-vector-header? d)
  187. (set! *hp* (addr+ *hp*
  188. (cells->bytes
  189. (bytes->cells
  190. (header-length-in-bytes d)))))))
  191. (loop))))))