[movitz-cvs] CVS movitz

ffjeld ffjeld at common-lisp.net
Fri Mar 16 17:40:43 UTC 2007


Update of /project/movitz/cvsroot/movitz
In directory clnet:/tmp/cvs-serv13497

Modified Files:
	image.lisp 
Log Message:
Add qemu-align-p argument to dump-image. When true, pad (floppy) image
such that QEMU's (rather stupid) floppy geometry auto-detection will
work.


--- /project/movitz/cvsroot/movitz/image.lisp	2007/03/13 20:40:06	1.111
+++ /project/movitz/cvsroot/movitz/image.lisp	2007/03/16 17:40:43	1.112
@@ -9,7 +9,7 @@
 ;;;; Created at:    Sun Oct 22 00:22:43 2000
 ;;;; Distribution:  See the accompanying file COPYING.
 ;;;;                
-;;;; $Id: image.lisp,v 1.111 2007/03/13 20:40:06 ffjeld Exp $
+;;;; $Id: image.lisp,v 1.112 2007/03/16 17:40:43 ffjeld Exp $
 ;;;;                
 ;;;;------------------------------------------------------------------
 
@@ -843,7 +843,7 @@
   (values))
 
 (defun dump-image (&key (path *default-image-file*) ((:image *image*) *image*)
-			(multiboot-p t) ignore-dump-count)
+                   (multiboot-p t) ignore-dump-count (qemu-align-p t))
   "When <multiboot-p> is true, include a MultiBoot-compliant header in the image."
   (when (and (not ignore-dump-count)
 	     (= 0 (dump-count *image*)))
@@ -934,7 +934,7 @@
 		   (warn "non-used setf: ~S" v)))
 	  ;; symbol plists
 	  (loop for (symbol plist) on (movitz-environment-plists *movitz-global-environment*) by #'cddr
-											   ;; do (warn "sp: ~S ~S" symbol plist)
+              ;; do (warn "sp: ~S ~S" symbol plist)
 	      do (let ((x (movitz-read symbol)))
 		   (typecase x
 		     (movitz-null)
@@ -974,9 +974,24 @@
 		   (image-end (file-position stream))
 		   (kernel-size (- image-end image-start)))
 	      (format t "~&;; Kernel size: ~D octets.~%" kernel-size)
-	      (unless (zerop (mod image-end 512)) ; Ensure image is multiple of 512 octets
-		(set-file-position stream (+ image-end (- 511 (mod image-end 512))) 'pad-image-tail)
-		(write-byte #x0 stream))
+              (cond
+                (qemu-align-p
+                 ;; QEMU is rather stupid about "auto-detecting" floppy geometries.
+                 (loop for qemu-geo in '(320 360 640 720 720 820 840 1440 1440 1600 1640 1660 1760 2080 2240 2400
+                                         2880 2952 2988 3200 3200 3360 3444 3486 3520 3680 3840 5760 6240 6400 7040 7680)
+                     as qemu-size = (* qemu-geo 512)
+                     do (when (>= qemu-size image-end)
+                          (set-file-position stream (1- qemu-size) 'pad-image-tail)
+                          (write-byte #x0 stream)
+                          (return))
+                     finally
+                      (cerror "Never mind, dump the image."
+                              "No matching QEMU floppy geometry for size ~,2F MB." (/ image-end (* 1024 1024)))))
+                (t (let ((align-image-size 512)) ; Ensure image is multiple of x octets
+                     (unless (zerop (mod image-end align-image-size))
+                       (set-file-position stream (+ image-end (- (1- align-image-size) (mod image-end 512)))
+                                          'pad-image-tail)
+                       (write-byte #x0 stream)))))         
 	      (format t "~&;; Image file size: ~D octets.~%" image-end)
 	      ;; Write simple stage1 bootblock into sector 0..
 	      (format t "~&;; Dump count: ~D." (incf (dump-count *image*)))




More information about the Movitz-cvs mailing list