read-image.scm 6.7 KB

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