[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] Merge with ia64 tree.



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1200407963 0
# Node ID d13c4d2836a8669427608ddbfdaa1a0da0edc7ed
# Parent  235bef53d5bd04b4ac3b0c443369fa09d5d99e48
# Parent  fba4e7357744e96797916689e3274344b82a8e5f
Merge with ia64 tree.
---
 tools/blktap/drivers/Makefile             |   23 +--
 tools/blktap/drivers/blk.h                |    3 
 tools/blktap/drivers/blk_linux.c          |   42 +++++
 tools/blktap/drivers/block-aio.c          |   25 +--
 tools/blktap/drivers/block-qcow.c         |   16 +-
 tools/blktap/drivers/block-ram.c          |   30 +--
 tools/blktap/drivers/block-sync.c         |   25 +--
 tools/blktap/drivers/block-vmdk.c         |    6 
 tools/blktap/drivers/img2qcow.c           |   27 +--
 tools/blktap/drivers/qcow2raw.c           |   26 ++-
 tools/blktap/drivers/tapdisk.h            |    4 
 tools/firmware/rombios/rombios.c          |  227 +++++++++++++++++++++++++++++-
 tools/python/xen/xend/XendNode.py         |    8 -
 tools/python/xen/xend/server/SrvDaemon.py |    6 
 xen/Makefile                              |    4 
 xen/arch/x86/mm.c                         |  110 +++++++++-----
 xen/include/public/xen.h                  |   11 +
 17 files changed, 433 insertions(+), 160 deletions(-)

diff -r 235bef53d5bd -r d13c4d2836a8 tools/blktap/drivers/Makefile
--- a/tools/blktap/drivers/Makefile     Tue Jan 15 07:07:01 2008 -0700
+++ b/tools/blktap/drivers/Makefile     Tue Jan 15 14:39:23 2008 +0000
@@ -28,28 +28,29 @@ LIBS      += -L$(XEN_XENSTORE) -lxenstor
 
 AIOLIBS   := $(LIBAIO_DIR)/libaio.a
 
-BLK-OBJS  := block-aio.o
-BLK-OBJS  += block-sync.o
-BLK-OBJS  += block-vmdk.o
-BLK-OBJS  += block-ram.o
-BLK-OBJS  += block-qcow.o
-BLK-OBJS  += aes.o
-BLK-OBJS  += tapaio.o
+BLK-OBJS-y  := block-aio.o
+BLK-OBJS-y  += block-sync.o
+BLK-OBJS-y  += block-vmdk.o
+BLK-OBJS-y  += block-ram.o
+BLK-OBJS-y  += block-qcow.o
+BLK-OBJS-y  += aes.o
+BLK-OBJS-y  += tapaio.o
+BLK-OBJS-$(CONFIG_Linux) += blk_linux.c
 
 all: $(IBIN) qcow-util
 
 blktapctrl: blktapctrl.c
        $(CC) $(CFLAGS) -o blktapctrl $(LIBS) blktapctrl.c
 
-tapdisk: $(BLK-OBJS) tapdisk.c
-       $(CC) $(CFLAGS) -o tapdisk $(BLK-OBJS) tapdisk.c \
+tapdisk: $(BLK-OBJS-y) tapdisk.c
+       $(CC) $(CFLAGS) -o tapdisk $(BLK-OBJS-y) tapdisk.c \
                $(AIOLIBS) $(LIBS)
 
 .PHONY: qcow-util
 qcow-util: img2qcow qcow2raw qcow-create
 
-img2qcow qcow2raw qcow-create: %: $(BLK-OBJS)
-       $(CC) $(CFLAGS) -o $* $(BLK-OBJS) $*.c $(AIOLIBS) $(LIBS)
+img2qcow qcow2raw qcow-create: %: $(BLK-OBJS-y)
+       $(CC) $(CFLAGS) -o $* $(BLK-OBJS-y) $*.c $(AIOLIBS) $(LIBS)
 
 install: all
        $(INSTALL_PROG) $(IBIN) $(QCOW_UTIL) $(VHD_UTIL) $(DESTDIR)$(INST_DIR)
diff -r 235bef53d5bd -r d13c4d2836a8 tools/blktap/drivers/blk.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/blktap/drivers/blk.h        Tue Jan 15 14:39:23 2008 +0000
@@ -0,0 +1,3 @@
+
+int blk_getimagesize(int fd, uint64_t *size);
+int blk_getsectorsize(int fd, uint64_t *sector_size);
diff -r 235bef53d5bd -r d13c4d2836a8 tools/blktap/drivers/blk_linux.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/blktap/drivers/blk_linux.c  Tue Jan 15 14:39:23 2008 +0000
@@ -0,0 +1,42 @@
+#include <inttypes.h>
+#include <sys/ioctl.h>
+#include <linux/fs.h>
+#include "tapdisk.h"
+#include "blk.h"
+
+int blk_getimagesize(int fd, uint64_t *size)
+{
+       int rc;
+
+       *size = 0;
+       rc = ioctl(fd, BLKGETSIZE, size);
+       if (rc) {
+               DPRINTF("ERR: BLKGETSIZE failed, couldn't stat image");
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+int blk_getsectorsize(int fd, uint64_t *sector_size)
+{
+#if defined(BLKSSZGET)
+       int rc;
+
+       *sector_size = DEFAULT_SECTOR_SIZE;
+       rc = ioctl(fd, BLKSSZGET, sector_size);
+       if (rc) {
+               DPRINTF("ERR: BLKSSZGET failed. Falling back to use default 
sector size");
+               *sector_size = DEFAULT_SECTOR_SIZE;
+       }
+
+       if (*sector_size != DEFAULT_SECTOR_SIZE)
+               DPRINTF("Note: sector size is %"PRIu64" (not %u)\n",
+                       *sector_size, DEFAULT_SECTOR_SIZE);
+#else
+       *sector_size = DEFAULT_SECTOR_SIZE;
+#endif
+
+       return 0;
+}
+
diff -r 235bef53d5bd -r d13c4d2836a8 tools/blktap/drivers/block-aio.c
--- a/tools/blktap/drivers/block-aio.c  Tue Jan 15 07:07:01 2008 -0700
+++ b/tools/blktap/drivers/block-aio.c  Tue Jan 15 14:39:23 2008 +0000
@@ -41,11 +41,16 @@
 #include <sys/statvfs.h>
 #include <sys/stat.h>
 #include <sys/ioctl.h>
-#include <linux/fs.h>
 #include "tapdisk.h"
 #include "tapaio.h"
+#include "blk.h"
 
 #define MAX_AIO_REQS (MAX_REQUESTS * MAX_SEGMENTS_PER_REQ)
+
+/* *BSD has no O_LARGEFILE */
+#ifndef O_LARGEFILE
+#define O_LARGEFILE    0
+#endif
 
 struct pending_aio {
        td_callback_t cb;
@@ -87,11 +92,8 @@ static int get_image_info(struct td_stat
 
        if (S_ISBLK(stat.st_mode)) {
                /*Accessing block device directly*/
-               s->size = 0;
-               if (ioctl(fd,BLKGETSIZE,&s->size)!=0) {
-                       DPRINTF("ERR: BLKGETSIZE failed, couldn't stat image");
+               if (blk_getimagesize(fd, &s->size) != 0)
                        return -EINVAL;
-               }
 
                DPRINTF("Image size: \n\tpre sector_shift  [%llu]\n\tpost "
                        "sector_shift [%llu]\n",
@@ -99,19 +101,8 @@ static int get_image_info(struct td_stat
                        (long long unsigned)s->size);
 
                /*Get the sector size*/
-#if defined(BLKSSZGET)
-               {
-                       int arg;
+               if (blk_getsectorsize(fd, &s->sector_size) != 0)
                        s->sector_size = DEFAULT_SECTOR_SIZE;
-                       ioctl(fd, BLKSSZGET, &s->sector_size);
-                       
-                       if (s->sector_size != DEFAULT_SECTOR_SIZE)
-                               DPRINTF("Note: sector size is %ld (not %d)\n",
-                                       s->sector_size, DEFAULT_SECTOR_SIZE);
-               }
-#else
-               s->sector_size = DEFAULT_SECTOR_SIZE;
-#endif
 
        } else {
                /*Local file? try fstat instead*/
diff -r 235bef53d5bd -r d13c4d2836a8 tools/blktap/drivers/block-qcow.c
--- a/tools/blktap/drivers/block-qcow.c Tue Jan 15 07:07:01 2008 -0700
+++ b/tools/blktap/drivers/block-qcow.c Tue Jan 15 14:39:23 2008 +0000
@@ -29,7 +29,6 @@
 #include <sys/statvfs.h>
 #include <sys/stat.h>
 #include <sys/ioctl.h>
-#include <linux/fs.h>
 #include <string.h>
 #include <zlib.h>
 #include <inttypes.h>
@@ -39,6 +38,12 @@
 #include "aes.h"
 #include "tapdisk.h"
 #include "tapaio.h"
+#include "blk.h"
+
+/* *BSD has no O_LARGEFILE */
+#ifndef O_LARGEFILE
+#define O_LARGEFILE    0
+#endif
 
 #if 1
 #define ASSERT(_p) \
@@ -284,8 +289,7 @@ static int get_filesize(char *filename, 
                fd = open(filename, O_RDONLY);
                if (fd < 0)
                        return -1;
-               if (ioctl(fd,BLKGETSIZE,size)!=0) {
-                       printf("Unable to get Block device size\n");
+               if (blk_getimagesize(fd, size) != 0) {
                        close(fd);
                        return -1;
                }
@@ -990,8 +994,8 @@ int tdqcow_open (struct disk_driver *dd,
        if (!final_cluster)
                s->fd_end = s->l1_table_offset + l1_table_size;
        else {
-               s->fd_end = lseek64(fd, 0, SEEK_END);
-               if (s->fd_end == (off64_t)-1)
+               s->fd_end = lseek(fd, 0, SEEK_END);
+               if (s->fd_end == (off_t)-1)
                        goto fail;
        }
 
@@ -1230,7 +1234,7 @@ int qcow_create(const char *filename, ui
        DPRINTF("Qcow_create: size %llu\n",(long long unsigned)total_size);
 
        fd = open(filename, 
-                 O_WRONLY | O_CREAT | O_TRUNC | O_BINARY | O_LARGEFILE, 
+                 O_WRONLY | O_CREAT | O_TRUNC | O_BINARY | O_LARGEFILE,
                  0644);
        if (fd < 0)
                return -1;
diff -r 235bef53d5bd -r d13c4d2836a8 tools/blktap/drivers/block-ram.c
--- a/tools/blktap/drivers/block-ram.c  Tue Jan 15 07:07:01 2008 -0700
+++ b/tools/blktap/drivers/block-ram.c  Tue Jan 15 14:39:23 2008 +0000
@@ -33,15 +33,21 @@
 #include <fcntl.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <inttypes.h>
 #include <unistd.h>
 #include <sys/statvfs.h>
 #include <sys/stat.h>
 #include <sys/ioctl.h>
-#include <linux/fs.h>
 #include <string.h>
 #include "tapdisk.h"
+#include "blk.h"
 
 #define MAX_DISK_SIZE 1024000 /*500MB disk limit*/
+
+/* *BSD has no O_LARGEFILE */
+#ifndef O_LARGEFILE
+#define O_LARGEFILE    0
+#endif
 
 char *img;
 long int   disksector_size;
@@ -71,11 +77,8 @@ static int get_image_info(struct td_stat
 
        if (S_ISBLK(stat.st_mode)) {
                /*Accessing block device directly*/
-               s->size = 0;
-               if (ioctl(fd,BLKGETSIZE,&s->size)!=0) {
-                       DPRINTF("ERR: BLKGETSIZE failed, couldn't stat image");
+               if (blk_getimagesize(fd, &s->size) != 0)
                        return -EINVAL;
-               }
 
                DPRINTF("Image size: \n\tpre sector_shift  [%llu]\n\tpost "
                        "sector_shift [%llu]\n",
@@ -83,19 +86,8 @@ static int get_image_info(struct td_stat
                        (long long unsigned)s->size);
 
                /*Get the sector size*/
-#if defined(BLKSSZGET)
-               {
-                       int arg;
+               if (blk_getsectorsize(fd, &s->sector_size) != 0)
                        s->sector_size = DEFAULT_SECTOR_SIZE;
-                       ioctl(fd, BLKSSZGET, &s->sector_size);
-                       
-                       if (s->sector_size != DEFAULT_SECTOR_SIZE)
-                               DPRINTF("Note: sector size is %ld (not %d)\n",
-                                       s->sector_size, DEFAULT_SECTOR_SIZE);
-               }
-#else
-               s->sector_size = DEFAULT_SECTOR_SIZE;
-#endif
 
        } else {
                /*Local file? try fstat instead*/
@@ -117,7 +109,7 @@ static int get_image_info(struct td_stat
        disksector_size = s->sector_size;
        disksize        = s->size;
        diskinfo        = s->info;
-       DPRINTF("Image sector_size: \n\t[%lu]\n",
+       DPRINTF("Image sector_size: \n\t[%"PRIu64"]\n",
                s->sector_size);
 
        return 0;
@@ -159,7 +151,7 @@ int tdram_open (struct disk_driver *dd, 
                        "sector_shift [%llu]\n",
                        (long long unsigned)(s->size << SECTOR_SHIFT),
                        (long long unsigned)s->size);
-               DPRINTF("Image sector_size: \n\t[%lu]\n",
+               DPRINTF("Image sector_size: \n\t[%"PRIu64"]\n",
                        s->sector_size);
 
                prv->fd = -1;
diff -r 235bef53d5bd -r d13c4d2836a8 tools/blktap/drivers/block-sync.c
--- a/tools/blktap/drivers/block-sync.c Tue Jan 15 07:07:01 2008 -0700
+++ b/tools/blktap/drivers/block-sync.c Tue Jan 15 14:39:23 2008 +0000
@@ -37,8 +37,13 @@
 #include <sys/statvfs.h>
 #include <sys/stat.h>
 #include <sys/ioctl.h>
-#include <linux/fs.h>
 #include "tapdisk.h"
+#include "blk.h"
+
+/* *BSD has no O_LARGEFILE */
+#ifndef O_LARGEFILE
+#define O_LARGEFILE    0
+#endif
 
 struct tdsync_state {
        int fd;
@@ -62,11 +67,8 @@ static int get_image_info(struct td_stat
 
        if (S_ISBLK(stat.st_mode)) {
                /*Accessing block device directly*/
-               s->size = 0;
-               if (ioctl(fd,BLKGETSIZE,&s->size)!=0) {
-                       DPRINTF("ERR: BLKGETSIZE failed, couldn't stat image");
+               if (blk_getimagesize(fd, &s->size) != 0)
                        return -EINVAL;
-               }
 
                DPRINTF("Image size: \n\tpre sector_shift  [%llu]\n\tpost "
                        "sector_shift [%llu]\n",
@@ -74,19 +76,8 @@ static int get_image_info(struct td_stat
                        (long long unsigned)s->size);
 
                /*Get the sector size*/
-#if defined(BLKSSZGET)
-               {
-                       int arg;
+               if (blk_getsectorsize(fd, &s->sector_size) != 0)
                        s->sector_size = DEFAULT_SECTOR_SIZE;
-                       ioctl(fd, BLKSSZGET, &s->sector_size);
-                       
-                       if (s->sector_size != DEFAULT_SECTOR_SIZE)
-                               DPRINTF("Note: sector size is %ld (not %d)\n",
-                                       s->sector_size, DEFAULT_SECTOR_SIZE);
-               }
-#else
-               s->sector_size = DEFAULT_SECTOR_SIZE;
-#endif
 
        } else {
                /*Local file? try fstat instead*/
diff -r 235bef53d5bd -r d13c4d2836a8 tools/blktap/drivers/block-vmdk.c
--- a/tools/blktap/drivers/block-vmdk.c Tue Jan 15 07:07:01 2008 -0700
+++ b/tools/blktap/drivers/block-vmdk.c Tue Jan 15 14:39:23 2008 +0000
@@ -42,10 +42,14 @@
 #include <sys/statvfs.h>
 #include <sys/stat.h>
 #include <sys/ioctl.h>
-#include <linux/fs.h>
 #include <string.h>
 #include "tapdisk.h"
 #include "bswap.h"
+
+/* *BSD has no O_LARGEFILE */
+#ifndef O_LARGEFILE
+#define O_LARGEFILE    0
+#endif
 
 #define safer_free(_x)       \
   do {                       \
diff -r 235bef53d5bd -r d13c4d2836a8 tools/blktap/drivers/img2qcow.c
--- a/tools/blktap/drivers/img2qcow.c   Tue Jan 15 07:07:01 2008 -0700
+++ b/tools/blktap/drivers/img2qcow.c   Tue Jan 15 14:39:23 2008 +0000
@@ -37,15 +37,21 @@
 #include <sys/statvfs.h>
 #include <sys/stat.h>
 #include <sys/ioctl.h>
-#include <linux/fs.h>
 #include <string.h>
 #include "tapdisk.h"
+#include "blk.h"
 
 #if 1
 #define DFPRINTF(_f, _a...) fprintf ( stderr, _f , ## _a )
 #else
 #define DFPRINTF(_f, _a...) ((void)0)
 #endif
+
+/* *BSD has no O_LARGEFILE */
+#ifndef O_LARGEFILE
+#define O_LARGEFILE    0
+#endif
+
 
 #define TAPDISK 1
 #define BLOCK_PROCESSSZ 4096
@@ -109,12 +115,8 @@ static int get_image_info(struct td_stat
 
        if (S_ISBLK(stat.st_mode)) {
                /*Accessing block device directly*/
-               s->size = 0;
-               if (ioctl(fd,BLKGETSIZE,&s->size)!=0) {
-                       DFPRINTF("ERR: BLKGETSIZE failed, "
-                                "couldn't stat image");
+               if (blk_getimagesize(fd, &s->size) != 0)
                        return -EINVAL;
-               }
 
                DFPRINTF("Image size: \n\tpre sector_shift  [%llu]\n\tpost "
                        "sector_shift [%llu]\n",
@@ -122,19 +124,8 @@ static int get_image_info(struct td_stat
                        (long long unsigned)s->size);
 
                /*Get the sector size*/
-#if defined(BLKSSZGET)
-               {
-                       int arg;
+               if (blk_getsectorsize(fd, &s->sector_size) != 0)
                        s->sector_size = DEFAULT_SECTOR_SIZE;
-                       ioctl(fd, BLKSSZGET, &s->sector_size);
-                       
-                       if (s->sector_size != DEFAULT_SECTOR_SIZE)
-                               DFPRINTF("Note: sector size is %ld (not %d)\n",
-                                       s->sector_size, DEFAULT_SECTOR_SIZE);
-               }
-#else
-               s->sector_size = DEFAULT_SECTOR_SIZE;
-#endif
 
        } else {
                /*Local file? try fstat instead*/
diff -r 235bef53d5bd -r d13c4d2836a8 tools/blktap/drivers/qcow2raw.c
--- a/tools/blktap/drivers/qcow2raw.c   Tue Jan 15 07:07:01 2008 -0700
+++ b/tools/blktap/drivers/qcow2raw.c   Tue Jan 15 14:39:23 2008 +0000
@@ -33,18 +33,25 @@
 #include <fcntl.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <inttypes.h>
 #include <unistd.h>
 #include <sys/statvfs.h>
 #include <sys/stat.h>
 #include <sys/ioctl.h>
-#include <linux/fs.h>
 #include <string.h>
 #include "tapdisk.h"
+#include "blk.h"
 
 #if 1
 #define DFPRINTF(_f, _a...) fprintf ( stderr, _f , ## _a )
 #else
 #define DFPRINTF(_f, _a...) ((void)0)
+#endif
+
+
+/* *BSD has no O_LARGEFILE */
+#ifndef O_LARGEFILE
+#define O_LARGEFILE 0
 #endif
 
 #define TAPDISK 1
@@ -142,7 +149,7 @@ int main(int argc, char *argv[])
 int main(int argc, char *argv[])
 {
        int ret = -1, fd, len,input;
-       long int size;
+       uint64_t size;
        fd_set readfds;
        struct timeval timeout;
        uint64_t i;
@@ -227,16 +234,15 @@ int main(int argc, char *argv[])
                }
 
                if (S_ISBLK(finfo.st_mode)) {
-                       if(ioctl(fd,BLKGETSIZE,&size)!=0) {
-                               DFPRINTF("ERROR: BLKGETSIZE failed, "
-                                       "couldn't stat image [%s]\n", 
-                                       argv[1]);
-                               close(fd);
-                               exit(-1);
-                       }
+                       if (blk_getimagesize(fd, &size) != 0) {
+                               close(fd);
+                               return -1;
+                       }
+
                        if (size < ddqcow.td_state->size<<9) {
                                DFPRINTF("ERROR: Not enough space on device "
-                                       "%s (%lu bytes available, %llu bytes 
required\n",
+                                       "%s (%"PRIu64" bytes available, "
+                                       "%llu bytes required\n",
                                        argv[1], size, 
                                        (long long 
unsigned)ddqcow.td_state->size<<9);
                                close(fd);
diff -r 235bef53d5bd -r d13c4d2836a8 tools/blktap/drivers/tapdisk.h
--- a/tools/blktap/drivers/tapdisk.h    Tue Jan 15 07:07:01 2008 -0700
+++ b/tools/blktap/drivers/tapdisk.h    Tue Jan 15 14:39:23 2008 +0000
@@ -108,8 +108,8 @@ struct td_state {
        void *image;
        void *ring_info;
        void *fd_entry;
-       unsigned long      sector_size;
-       unsigned long long size;
+       uint64_t sector_size;
+       uint64_t size;
        unsigned int       info;
 };
 
diff -r 235bef53d5bd -r d13c4d2836a8 tools/firmware/rombios/rombios.c
--- a/tools/firmware/rombios/rombios.c  Tue Jan 15 07:07:01 2008 -0700
+++ b/tools/firmware/rombios/rombios.c  Tue Jan 15 14:39:23 2008 +0000
@@ -2030,6 +2030,229 @@ print_cdromboot_failure( code )
   
   return;
 }
+
+#define WAIT_HZ 18
+/**
+ * Check for keystroke.
+ * @returns    True if keystroke available, False if not.
+ */
+Bit8u check_for_keystroke()
+{
+ASM_START
+    mov  ax, #0x100
+    int  #0x16
+    jz   no_key
+    mov  al, #1
+    jmp  done
+no_key:
+    xor  al, al
+done:
+ASM_END
+}
+
+/**
+ * Get keystroke.
+ * @returns    BIOS scan code.
+ */
+Bit8u get_keystroke()
+{
+ASM_START
+    mov  ax, #0x0
+    int  #0x16
+    xchg ah, al
+ASM_END
+}
+
+/**
+ * Waits (sleeps) for the given number of ticks.
+ * Checks for keystroke.
+ *
+ * @returns BIOS scan code if available, 0 if not.
+ * @param   ticks       Number of ticks to sleep.
+ * @param   stop_on_key Whether to stop immediately upon keypress.
+ */
+Bit8u wait(ticks, stop_on_key)
+  Bit16u ticks;
+  Bit8u stop_on_key;
+{
+    long ticks_to_wait, delta;
+    Bit32u prev_ticks, t;
+    Bit8u scan_code = 0;
+
+    /*
+     * The 0:046c wraps around at 'midnight' according to a 18.2Hz clock.
+     * We also have to be careful about interrupt storms.
+     */
+    ticks_to_wait = ticks;
+    prev_ticks = read_dword(0x0, 0x46c);
+    do
+    {
+        t = read_dword(0x0, 0x46c);
+        if (t > prev_ticks)
+        {
+            delta = t - prev_ticks;     /* The temp var is required or bcc 
screws up. */
+            ticks_to_wait -= delta;
+        }
+        else if (t < prev_ticks)
+            ticks_to_wait -= t;         /* wrapped */
+        prev_ticks = t;
+
+        if (check_for_keystroke())
+        {
+            scan_code = get_keystroke();
+            bios_printf(BIOS_PRINTF_DEBUG, "Key pressed: %x\n", scan_code);
+            if (stop_on_key)
+                return scan_code;
+        }
+    } while (ticks_to_wait > 0);
+    return scan_code;
+}
+
+static void clearscreen() {
+    /* Hide cursor, clear screen and move cursor to starting position */
+ASM_START
+        push bx
+        push cx
+        push dx
+
+        mov  ax, #0x100
+        mov  cx, #0x1000
+        int  #0x10
+
+        mov  ax, #0x700
+        mov  bh, #7
+        xor  cx, cx
+        mov  dx, #0x184f
+        int  #0x10
+
+        mov  ax, #0x200
+        xor  bx, bx
+        xor  dx, dx
+        int  #0x10
+
+        pop  dx
+        pop  cx
+        pop  bx
+ASM_END
+}
+
+int bootmenu(selected)
+  int selected;
+{
+    Bit8u scode;
+    int max;
+
+    /* get the number of boot devices */
+    max = read_word(IPL_SEG, IPL_COUNT_OFFSET);
+
+    for(;;) {
+        if (selected > max || selected < 1) selected = 1;
+        clearscreen();
+        bios_printf(BIOS_PRINTF_SCREEN | BIOS_PRINTF_INFO, "\n\n\n\n\n\n\n");
+        bios_printf(BIOS_PRINTF_SCREEN | BIOS_PRINTF_INFO, "          Select 
boot device\n\n");
+        bios_printf(BIOS_PRINTF_SCREEN | BIOS_PRINTF_INFO, "            1. 
Floppy\n");
+        bios_printf(BIOS_PRINTF_SCREEN | BIOS_PRINTF_INFO, "            2. 
Hard drive\n");
+        bios_printf(BIOS_PRINTF_SCREEN | BIOS_PRINTF_INFO, "            3. 
CD-ROM\n");
+        if (max == 4)
+            bios_printf(BIOS_PRINTF_SCREEN | BIOS_PRINTF_INFO, "            4. 
Network\n");
+        bios_printf(BIOS_PRINTF_SCREEN | BIOS_PRINTF_INFO, "\n\n          
Currently selected: %d\n", selected);
+
+        do {
+            scode = wait(WAIT_HZ, 1);
+        } while (scode == 0);
+        switch(scode) {
+        case 0x02:
+        case 0x03:
+        case 0x04:
+            selected = scode - 1;
+            break;
+        case 0x05:
+            if (max == 4)
+                selected = scode -1 ;
+            else
+                scode = 0;
+            break;
+        case 0x48:
+            selected -= 1;
+            if (selected < 1)
+                selected = 1;
+            scode = 0;
+            break;
+        case 0x50:
+            selected += 1;
+            if (selected > max)
+                selected = max;
+            scode = 0;
+            break;
+        case 0x1c:
+            break;
+        default:
+            scode = 0;
+            break;
+        }
+        if (scode != 0)
+            break;
+    }
+
+    switch (selected) {
+    case 1:
+        return 0x3D;
+    case 2:
+        return 0x3E;
+    case 3:
+        return 0x3F;
+    case 4:
+        return 0x58;
+    default:
+        return 0;
+    }
+}
+
+void interactive_bootkey()
+{
+    Bit16u i;
+    Bit8u scan = 0;
+
+    bios_printf(BIOS_PRINTF_SCREEN | BIOS_PRINTF_INFO, "\n\nPress F10 to 
select boot device.\n");
+    for (i = 3; i > 0; i--)
+    {
+        scan = wait(WAIT_HZ, 0);
+        switch (scan) {
+        case 0x3D:
+        case 0x3E:
+        case 0x3F:
+        case 0x58:
+            break;
+        case 0x44:
+            scan = bootmenu(inb_cmos(0x3d) & 0x0f);
+            break;
+        default:
+            scan = 0;
+            break;
+        }
+        if (scan != 0)
+            break;
+    }
+
+    /* set the default based on the keypress or menu */
+    switch(scan) {
+    case 0x3D:
+        outb_cmos(0x3d, 0x01);
+        break;
+    case 0x3E:
+        outb_cmos(0x3d, 0x02);
+        break;
+    case 0x3F:
+        outb_cmos(0x3d, 0x03);
+        break;
+    case 0x58:
+        outb_cmos(0x3d, 0x04);
+        break;
+    default:
+        break;
+    }
+}
+
 
 void
 nmi_handler_msg()
@@ -9825,7 +10048,9 @@ post_default_ints:
   call _cdemu_init
   ;;
 #endif // BX_ELTORITO_BOOT
- 
+
+  call _interactive_bootkey
+
 #if BX_TCGBIOS
   call _tcpa_calling_int19h          /* specs: 8.2.3 step 1 */
   call _tcpa_add_event_separators    /* specs: 8.2.3 step 2 */
diff -r 235bef53d5bd -r d13c4d2836a8 tools/python/xen/xend/XendNode.py
--- a/tools/python/xen/xend/XendNode.py Tue Jan 15 07:07:01 2008 -0700
+++ b/tools/python/xen/xend/XendNode.py Tue Jan 15 14:39:23 2008 +0000
@@ -377,13 +377,7 @@ class XendNode:
     def xen_version(self):
         info = self.xc.xeninfo()
 
-        try:
-            from xen import VERSION
-            info = {'Xen': '%(xen_major)d.%(xen_minor)d' % info,
-                    'Xend': VERSION}
-        except (ImportError, AttributeError):
-            info = {'Xen': '%(xen_major)d.%(xen_minor)d' % info,
-                    'Xend': '3.0.3'}
+        info = {'Xen': '%(xen_major)d.%(xen_minor)d' % info}
 
         # Add xend_config_format
         info.update(self.xendinfo_dict())
diff -r 235bef53d5bd -r d13c4d2836a8 tools/python/xen/xend/server/SrvDaemon.py
--- a/tools/python/xen/xend/server/SrvDaemon.py Tue Jan 15 07:07:01 2008 -0700
+++ b/tools/python/xen/xend/server/SrvDaemon.py Tue Jan 15 14:39:23 2008 +0000
@@ -335,12 +335,6 @@ class Daemon:
             log.info("Xend changeset: %s.", xinfo['xen_changeset'])
             del xc
 
-            try:
-                from xen import VERSION
-                log.info("Xend version: %s", VERSION)
-            except ImportError:
-                log.info("Xend version: Unknown.")
-
             relocate.listenRelocation()
             servers = SrvServer.create()
             servers.start(status)
diff -r 235bef53d5bd -r d13c4d2836a8 xen/Makefile
--- a/xen/Makefile      Tue Jan 15 07:07:01 2008 -0700
+++ b/xen/Makefile      Tue Jan 15 14:39:23 2008 +0000
@@ -1,8 +1,8 @@
 # This is the correct place to edit the build version.
 # All other places this is stored (eg. compile.h) should be autogenerated.
 export XEN_VERSION       = 3
-export XEN_SUBVERSION    = 2
-export XEN_EXTRAVERSION ?= .0-rc6$(XEN_VENDORVERSION)
+export XEN_SUBVERSION    = 3
+export XEN_EXTRAVERSION ?= -unstable$(XEN_VENDORVERSION)
 export XEN_FULLVERSION   = $(XEN_VERSION).$(XEN_SUBVERSION)$(XEN_EXTRAVERSION)
 -include xen-version
 
diff -r 235bef53d5bd -r d13c4d2836a8 xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c Tue Jan 15 07:07:01 2008 -0700
+++ b/xen/arch/x86/mm.c Tue Jan 15 14:39:23 2008 +0000
@@ -1342,21 +1342,30 @@ static inline int update_intpte(intpte_t
                                 intpte_t old, 
                                 intpte_t new,
                                 unsigned long mfn,
-                                struct vcpu *v)
+                                struct vcpu *v,
+                                int preserve_ad)
 {
     int rv = 1;
 #ifndef PTE_UPDATE_WITH_CMPXCHG
-    rv = paging_write_guest_entry(v, p, new, _mfn(mfn));
-#else
+    if ( !preserve_ad )
+    {
+        rv = paging_write_guest_entry(v, p, new, _mfn(mfn));
+    }
+    else
+#endif
     {
         intpte_t t = old;
         for ( ; ; )
         {
-            rv = paging_cmpxchg_guest_entry(v, p, &t, new, _mfn(mfn));
+            intpte_t _new = new;
+            if ( preserve_ad )
+                _new |= old & (_PAGE_ACCESSED | _PAGE_DIRTY);
+
+            rv = paging_cmpxchg_guest_entry(v, p, &t, _new, _mfn(mfn));
             if ( unlikely(rv == 0) )
             {
                 MEM_LOG("Failed to update %" PRIpte " -> %" PRIpte
-                        ": saw %" PRIpte, old, new, t);
+                        ": saw %" PRIpte, old, _new, t);
                 break;
             }
 
@@ -1369,20 +1378,19 @@ static inline int update_intpte(intpte_t
             old = t;
         }
     }
-#endif
     return rv;
 }
 
 /* Macro that wraps the appropriate type-changes around update_intpte().
  * Arguments are: type, ptr, old, new, mfn, vcpu */
-#define UPDATE_ENTRY(_t,_p,_o,_n,_m,_v)                             \
+#define UPDATE_ENTRY(_t,_p,_o,_n,_m,_v,_ad)                         \
     update_intpte(&_t ## e_get_intpte(*(_p)),                       \
                   _t ## e_get_intpte(_o), _t ## e_get_intpte(_n),   \
-                  (_m), (_v))
+                  (_m), (_v), (_ad))
 
 /* Update the L1 entry at pl1e to new value nl1e. */
 static int mod_l1_entry(l1_pgentry_t *pl1e, l1_pgentry_t nl1e, 
-                        unsigned long gl1mfn)
+                        unsigned long gl1mfn, int preserve_ad)
 {
     l1_pgentry_t ol1e;
     struct vcpu *curr = current;
@@ -1393,7 +1401,7 @@ static int mod_l1_entry(l1_pgentry_t *pl
         return 0;
 
     if ( unlikely(paging_mode_refcounts(d)) )
-        return UPDATE_ENTRY(l1, pl1e, ol1e, nl1e, gl1mfn, curr);
+        return UPDATE_ENTRY(l1, pl1e, ol1e, nl1e, gl1mfn, curr, preserve_ad);
 
     if ( l1e_get_flags(nl1e) & _PAGE_PRESENT )
     {
@@ -1415,12 +1423,14 @@ static int mod_l1_entry(l1_pgentry_t *pl
 
         /* Fast path for identical mapping, r/w and presence. */
         if ( !l1e_has_changed(ol1e, nl1e, _PAGE_RW | _PAGE_PRESENT) )
-            return UPDATE_ENTRY(l1, pl1e, ol1e, nl1e, gl1mfn, curr);
+            return UPDATE_ENTRY(l1, pl1e, ol1e, nl1e, gl1mfn, curr,
+                                preserve_ad);
 
         if ( unlikely(!get_page_from_l1e(nl1e, FOREIGNDOM)) )
             return 0;
         
-        if ( unlikely(!UPDATE_ENTRY(l1, pl1e, ol1e, nl1e, gl1mfn, curr)) )
+        if ( unlikely(!UPDATE_ENTRY(l1, pl1e, ol1e, nl1e, gl1mfn, curr,
+                                    preserve_ad)) )
         {
             put_page_from_l1e(nl1e, d);
             return 0;
@@ -1428,7 +1438,8 @@ static int mod_l1_entry(l1_pgentry_t *pl
     }
     else
     {
-        if ( unlikely(!UPDATE_ENTRY(l1, pl1e, ol1e, nl1e, gl1mfn, curr)) )
+        if ( unlikely(!UPDATE_ENTRY(l1, pl1e, ol1e, nl1e, gl1mfn, curr,
+                                    preserve_ad)) )
             return 0;
     }
 
@@ -1441,7 +1452,8 @@ static int mod_l2_entry(l2_pgentry_t *pl
 static int mod_l2_entry(l2_pgentry_t *pl2e, 
                         l2_pgentry_t nl2e, 
                         unsigned long pfn,
-                        unsigned long type)
+                        unsigned long type,
+                        int preserve_ad)
 {
     l2_pgentry_t ol2e;
     struct vcpu *curr = current;
@@ -1469,18 +1481,20 @@ static int mod_l2_entry(l2_pgentry_t *pl
 
         /* Fast path for identical mapping and presence. */
         if ( !l2e_has_changed(ol2e, nl2e, _PAGE_PRESENT))
-            return UPDATE_ENTRY(l2, pl2e, ol2e, nl2e, pfn, curr);
+            return UPDATE_ENTRY(l2, pl2e, ol2e, nl2e, pfn, curr, preserve_ad);
 
         if ( unlikely(!get_page_from_l2e(nl2e, pfn, d)) )
             return 0;
 
-        if ( unlikely(!UPDATE_ENTRY(l2, pl2e, ol2e, nl2e, pfn, curr)) )
+        if ( unlikely(!UPDATE_ENTRY(l2, pl2e, ol2e, nl2e, pfn, curr,
+                                    preserve_ad)) )
         {
             put_page_from_l2e(nl2e, pfn);
             return 0;
         }
     }
-    else if ( unlikely(!UPDATE_ENTRY(l2, pl2e, ol2e, nl2e, pfn, curr)) )
+    else if ( unlikely(!UPDATE_ENTRY(l2, pl2e, ol2e, nl2e, pfn, curr,
+                                     preserve_ad)) )
     {
         return 0;
     }
@@ -1494,7 +1508,8 @@ static int mod_l2_entry(l2_pgentry_t *pl
 /* Update the L3 entry at pl3e to new value nl3e. pl3e is within frame pfn. */
 static int mod_l3_entry(l3_pgentry_t *pl3e, 
                         l3_pgentry_t nl3e, 
-                        unsigned long pfn)
+                        unsigned long pfn,
+                        int preserve_ad)
 {
     l3_pgentry_t ol3e;
     struct vcpu *curr = current;
@@ -1532,18 +1547,20 @@ static int mod_l3_entry(l3_pgentry_t *pl
 
         /* Fast path for identical mapping and presence. */
         if (!l3e_has_changed(ol3e, nl3e, _PAGE_PRESENT))
-            return UPDATE_ENTRY(l3, pl3e, ol3e, nl3e, pfn, curr);
+            return UPDATE_ENTRY(l3, pl3e, ol3e, nl3e, pfn, curr, preserve_ad);
 
         if ( unlikely(!get_page_from_l3e(nl3e, pfn, d)) )
             return 0;
 
-        if ( unlikely(!UPDATE_ENTRY(l3, pl3e, ol3e, nl3e, pfn, curr)) )
+        if ( unlikely(!UPDATE_ENTRY(l3, pl3e, ol3e, nl3e, pfn, curr,
+                                    preserve_ad)) )
         {
             put_page_from_l3e(nl3e, pfn);
             return 0;
         }
     }
-    else if ( unlikely(!UPDATE_ENTRY(l3, pl3e, ol3e, nl3e, pfn, curr)) )
+    else if ( unlikely(!UPDATE_ENTRY(l3, pl3e, ol3e, nl3e, pfn, curr,
+                                     preserve_ad)) )
     {
         return 0;
     }
@@ -1564,7 +1581,8 @@ static int mod_l3_entry(l3_pgentry_t *pl
 /* Update the L4 entry at pl4e to new value nl4e. pl4e is within frame pfn. */
 static int mod_l4_entry(l4_pgentry_t *pl4e, 
                         l4_pgentry_t nl4e, 
-                        unsigned long pfn)
+                        unsigned long pfn,
+                        int preserve_ad)
 {
     struct vcpu *curr = current;
     struct domain *d = curr->domain;
@@ -1592,18 +1610,20 @@ static int mod_l4_entry(l4_pgentry_t *pl
 
         /* Fast path for identical mapping and presence. */
         if (!l4e_has_changed(ol4e, nl4e, _PAGE_PRESENT))
-            return UPDATE_ENTRY(l4, pl4e, ol4e, nl4e, pfn, curr);
+            return UPDATE_ENTRY(l4, pl4e, ol4e, nl4e, pfn, curr, preserve_ad);
 
         if ( unlikely(!get_page_from_l4e(nl4e, pfn, d)) )
             return 0;
 
-        if ( unlikely(!UPDATE_ENTRY(l4, pl4e, ol4e, nl4e, pfn, curr)) )
+        if ( unlikely(!UPDATE_ENTRY(l4, pl4e, ol4e, nl4e, pfn, curr,
+                                    preserve_ad)) )
         {
             put_page_from_l4e(nl4e, pfn);
             return 0;
         }
     }
-    else if ( unlikely(!UPDATE_ENTRY(l4, pl4e, ol4e, nl4e, pfn, curr)) )
+    else if ( unlikely(!UPDATE_ENTRY(l4, pl4e, ol4e, nl4e, pfn, curr,
+                                     preserve_ad)) )
     {
         return 0;
     }
@@ -1946,7 +1966,7 @@ int new_guest_cr3(unsigned long mfn)
                     l4e_from_pfn(
                         mfn,
                         (_PAGE_PRESENT|_PAGE_RW|_PAGE_USER|_PAGE_ACCESSED)),
-                    pagetable_get_pfn(v->arch.guest_table));
+                    pagetable_get_pfn(v->arch.guest_table), 0);
         if ( unlikely(!okay) )
         {
             MEM_LOG("Error while installing new compat baseptr %lx", mfn);
@@ -2458,13 +2478,16 @@ int do_mmu_update(
         {
             /*
              * MMU_NORMAL_PT_UPDATE: Normal update to any level of page table.
+             * MMU_UPDATE_PT_PRESERVE_AD: As above but also preserve (OR)
+             * current A/D bits.
              */
         case MMU_NORMAL_PT_UPDATE:
-
+        case MMU_PT_UPDATE_PRESERVE_AD:
             rc = xsm_mmu_normal_update(d, req.val);
             if ( rc )
                 break;
 
+            req.ptr -= cmd;
             gmfn = req.ptr >> PAGE_SHIFT;
             mfn = gmfn_to_mfn(d, gmfn);
 
@@ -2501,20 +2524,23 @@ int do_mmu_update(
                 case PGT_l1_page_table:
                 {
                     l1_pgentry_t l1e = l1e_from_intpte(req.val);
-                    okay = mod_l1_entry(va, l1e, mfn);
+                    okay = mod_l1_entry(va, l1e, mfn,
+                                        cmd == MMU_PT_UPDATE_PRESERVE_AD);
                 }
                 break;
                 case PGT_l2_page_table:
                 {
                     l2_pgentry_t l2e = l2e_from_intpte(req.val);
-                    okay = mod_l2_entry(va, l2e, mfn, type_info);
+                    okay = mod_l2_entry(va, l2e, mfn, type_info,
+                                        cmd == MMU_PT_UPDATE_PRESERVE_AD);
                 }
                 break;
 #if CONFIG_PAGING_LEVELS >= 3
                 case PGT_l3_page_table:
                 {
                     l3_pgentry_t l3e = l3e_from_intpte(req.val);
-                    okay = mod_l3_entry(va, l3e, mfn);
+                    okay = mod_l3_entry(va, l3e, mfn,
+                                        cmd == MMU_PT_UPDATE_PRESERVE_AD);
                 }
                 break;
 #endif
@@ -2522,7 +2548,8 @@ int do_mmu_update(
                 case PGT_l4_page_table:
                 {
                     l4_pgentry_t l4e = l4e_from_intpte(req.val);
-                    okay = mod_l4_entry(va, l4e, mfn);
+                    okay = mod_l4_entry(va, l4e, mfn,
+                                        cmd == MMU_PT_UPDATE_PRESERVE_AD);
                 }
                 break;
 #endif
@@ -2652,7 +2679,7 @@ static int create_grant_pte_mapping(
     }
 
     ol1e = *(l1_pgentry_t *)va;
-    if ( !UPDATE_ENTRY(l1, (l1_pgentry_t *)va, ol1e, nl1e, mfn, v) )
+    if ( !UPDATE_ENTRY(l1, (l1_pgentry_t *)va, ol1e, nl1e, mfn, v, 0) )
     {
         put_page_type(page);
         rc = GNTST_general_error;
@@ -2720,9 +2747,11 @@ static int destroy_grant_pte_mapping(
     }
 
     /* Delete pagetable entry. */
-    if ( unlikely(!UPDATE_ENTRY(l1, 
-                      (l1_pgentry_t *)va, ol1e, l1e_empty(), mfn, 
-                      d->vcpu[0] /* Change if we go to per-vcpu shadows. */)) )
+    if ( unlikely(!UPDATE_ENTRY
+                  (l1, 
+                   (l1_pgentry_t *)va, ol1e, l1e_empty(), mfn, 
+                   d->vcpu[0] /* Change if we go to per-vcpu shadows. */,
+                   0)) )
     {
         MEM_LOG("Cannot delete PTE entry at %p", va);
         put_page_type(page);
@@ -2758,7 +2787,7 @@ static int create_grant_va_mapping(
         return GNTST_general_error;
     }
     ol1e = *pl1e;
-    okay = UPDATE_ENTRY(l1, pl1e, ol1e, nl1e, gl1mfn, v);
+    okay = UPDATE_ENTRY(l1, pl1e, ol1e, nl1e, gl1mfn, v, 0);
     guest_unmap_l1e(v, pl1e);
     pl1e = NULL;
 
@@ -2796,7 +2825,7 @@ static int replace_grant_va_mapping(
     }
 
     /* Delete pagetable entry. */
-    if ( unlikely(!UPDATE_ENTRY(l1, pl1e, ol1e, nl1e, gl1mfn, v)) )
+    if ( unlikely(!UPDATE_ENTRY(l1, pl1e, ol1e, nl1e, gl1mfn, v, 0)) )
     {
         MEM_LOG("Cannot delete PTE entry at %p", (unsigned long *)pl1e);
         rc = GNTST_general_error;
@@ -2860,7 +2889,8 @@ int replace_grant_host_mapping(
     }
     ol1e = *pl1e;
 
-    if ( unlikely(!UPDATE_ENTRY(l1, pl1e, ol1e, l1e_empty(), gl1mfn, curr)) )
+    if ( unlikely(!UPDATE_ENTRY(l1, pl1e, ol1e, l1e_empty(),
+                                gl1mfn, curr, 0)) )
     {
         MEM_LOG("Cannot delete PTE entry at %p", (unsigned long *)pl1e);
         guest_unmap_l1e(curr, pl1e);
@@ -2948,7 +2978,7 @@ int do_update_va_mapping(unsigned long v
 
     pl1e = guest_map_l1e(v, va, &gl1mfn);
 
-    if ( unlikely(!pl1e || !mod_l1_entry(pl1e, val, gl1mfn)) )
+    if ( unlikely(!pl1e || !mod_l1_entry(pl1e, val, gl1mfn, 0)) )
         rc = -EINVAL;
 
     if ( pl1e )
@@ -3517,7 +3547,7 @@ static int ptwr_emulated_update(
     else
     {
         ol1e = *pl1e;
-        if ( !UPDATE_ENTRY(l1, pl1e, ol1e, nl1e, mfn, v) )
+        if ( !UPDATE_ENTRY(l1, pl1e, ol1e, nl1e, mfn, v, 0) )
             BUG();
     }
 
diff -r 235bef53d5bd -r d13c4d2836a8 xen/include/public/xen.h
--- a/xen/include/public/xen.h  Tue Jan 15 07:07:01 2008 -0700
+++ b/xen/include/public/xen.h  Tue Jan 15 14:39:23 2008 +0000
@@ -168,9 +168,14 @@
  * ptr[:2]  -- Machine address within the frame whose mapping to modify.
  *             The frame must belong to the FD, if one is specified.
  * val      -- Value to write into the mapping entry.
- */
-#define MMU_NORMAL_PT_UPDATE     0 /* checked '*ptr = val'. ptr is MA.       */
-#define MMU_MACHPHYS_UPDATE      1 /* ptr = MA of frame to modify entry for  */
+ * 
+ * ptr[1:0] == MMU_PT_UPDATE_PRESERVE_AD:
+ * As MMU_NORMAL_PT_UPDATE above, but A/D bits currently in the PTE are ORed
+ * with those in @val.
+ */
+#define MMU_NORMAL_PT_UPDATE      0 /* checked '*ptr = val'. ptr is MA.      */
+#define MMU_MACHPHYS_UPDATE       1 /* ptr = MA of frame to modify entry for */
+#define MMU_PT_UPDATE_PRESERVE_AD 2 /* atomically: *ptr = val | (*ptr&(A|D)) */
 
 /*
  * MMU EXTENDED OPERATIONS

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.