Port-xen archive

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

Re: Fix for NetBSD Dom0 boot problem



On Wednesday 05 December 2007 23:11:31 Manuel Bouyer wrote:
> On Wed, Dec 05, 2007 at 06:23:46PM +0100, Christoph Egger wrote:
> > Hi Manuel,
> >
> > Please update pkgsrc's xenkernel3/patches/patch-ba:
> >
> > hg clone http://xenbits.xensource.com/staging/xen-unstable.hg/
> > hg diff -p -r16534 -r16535 >netbsd_dom0_bootfix.diff
> >
> > The content of netbsd_dom0_bootfix.diff should match this:
> > http://xenbits.xensource.com/staging/xen-unstable.hg/rev/c67d024fdd2d
> >
> > Add this diff to above patch-ba.
> >
> >
> > This fixes a NetBSD Dom0 Xen-amd64 boot problem for me, which I have
> > with Xen 3.1.x and Xen-unstable. The Xen crash output is below. The crash
> > happened right before NetBSD loaded the symbol table.
> >
> > The bug was a trampoline mapping leaking into Dom0s address space.
> > And the bug was hit when the Dom0 freed the pagetable.
> >
> > Linux Dom0 uses the builder-provided pagetable as its kernel idle
> > pagetable. So it never frees the pagetable and so never hit the bad path.
> >
> > Oh, I have no idea how you got NetBSD Dom0 booting without that fix.
>
> Yes, I did it see that problem too. It crashes when it tries to unpin the
> L4 page table provided by Xen. I debugged it and came with patch-cy in
> xenkernel3. I now have commited the Xen offical fix, and removed patch-cy
> which should have never been there in the first place (the same file
> patched twice ...) Thanks !

You're welcome.

Oh, I see you updated pkgsrc to Xen 3.1.2. There will also be a Xen 3.1.3.
But I don't know what comes first: 3.1.3 or 3.2.0.
Anyway, whenever 3.2.0 is out, I highly recommend you to package that one,
since this is of much more value for *BSD.

Now that you fetched xen-unstable in order to get the diff for patch-ba,
you can give it a try and give me feedback. :-)
Just run 'gmake' on the top-level directory and enjoy the result.

Apply attached patch to make tools/blktap building, but not functional
on *BSD. I don't submit this one since it has not the quality, but it's a 
start. Applying this on Xen 3.1.2 makes tools/blktap NOT building because
I already got two patches upstream which remove linux specific dependencies
in other files (i.e. #include <linux/fs.h> without actually using it.)

> BTW, I posted this to xen-devel@, but it seems it never went to the list
> (I can't see it in the archives), and got no bounce either. Do you know if
> this list is restricted in some way ?

I am subscribed there but never saw your mail. I am not aware of any
restrictions.

Christoph
diff -r 8ba08f2244b2 tools/blktap/drivers/block-aio.c
--- a/tools/blktap/drivers/block-aio.c  Wed Dec 05 17:56:13 2007 +0000
+++ b/tools/blktap/drivers/block-aio.c  Thu Dec 06 11:05:44 2007 +0100
@@ -41,11 +41,18 @@
 #include <sys/statvfs.h>
 #include <sys/stat.h>
 #include <sys/ioctl.h>
+#if defined(__linux__) || defined(__Linux__)
 #include <linux/fs.h>
+#endif
 #include "tapdisk.h"
 #include "tapaio.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;
@@ -88,6 +95,7 @@ static int get_image_info(struct td_stat
        if (S_ISBLK(stat.st_mode)) {
                /*Accessing block device directly*/
                s->size = 0;
+#if defined(BLKGETSIZE)
                if (ioctl(fd,BLKGETSIZE,&s->size)!=0) {
                        DPRINTF("ERR: BLKGETSIZE failed, couldn't stat image");
                        return -EINVAL;
@@ -99,6 +107,7 @@ static int get_image_info(struct td_stat
                        (long long unsigned)s->size);
 
                /*Get the sector size*/
+#endif
 #if defined(BLKSSZGET)
                {
                        int arg;
diff -r 8ba08f2244b2 tools/blktap/drivers/block-qcow.c
--- a/tools/blktap/drivers/block-qcow.c Wed Dec 05 17:56:13 2007 +0000
+++ b/tools/blktap/drivers/block-qcow.c Thu Dec 06 11:05:44 2007 +0100
@@ -21,6 +21,9 @@
  * furnished to do so, subject to the following conditions:
  */
 
+/* Linux/i386 needs this */
+#define _FILE_OFFSET_BITS      64
+
 #include <errno.h>
 #include <fcntl.h>
 #include <stdio.h>
@@ -29,7 +32,9 @@
 #include <sys/statvfs.h>
 #include <sys/stat.h>
 #include <sys/ioctl.h>
+#if defined(__linux__) || defined(__Linux__)
 #include <linux/fs.h>
+#endif
 #include <string.h>
 #include <zlib.h>
 #include <inttypes.h>
@@ -39,6 +44,11 @@
 #include "aes.h"
 #include "tapdisk.h"
 #include "tapaio.h"
+
+/* *BSD has no O_LARGEFILE */
+#ifndef O_LARGEFILE
+#define O_LARGEFILE    0
+#endif
 
 #if 1
 #define ASSERT(_p) \
@@ -284,11 +294,13 @@ static int get_filesize(char *filename, 
                fd = open(filename, O_RDONLY);
                if (fd < 0)
                        return -1;
+#if defined(BLKGETSIZE)
                if (ioctl(fd,BLKGETSIZE,size)!=0) {
                        printf("Unable to get Block device size\n");
                        close(fd);
                        return -1;
                }
+#endif
                close(fd);
        } else *size = (st->st_size >> SECTOR_SHIFT);   
        return 0;
@@ -990,8 +1002,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 +1242,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 8ba08f2244b2 tools/blktap/drivers/block-ram.c
--- a/tools/blktap/drivers/block-ram.c  Wed Dec 05 17:56:13 2007 +0000
+++ b/tools/blktap/drivers/block-ram.c  Thu Dec 06 11:05:44 2007 +0100
@@ -37,11 +37,18 @@
 #include <sys/statvfs.h>
 #include <sys/stat.h>
 #include <sys/ioctl.h>
+#if defined(__linux__) || defined(__Linux__)
 #include <linux/fs.h>
+#endif
 #include <string.h>
 #include "tapdisk.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;
@@ -72,6 +79,7 @@ static int get_image_info(struct td_stat
        if (S_ISBLK(stat.st_mode)) {
                /*Accessing block device directly*/
                s->size = 0;
+#if defined(BLKGETSIZE)
                if (ioctl(fd,BLKGETSIZE,&s->size)!=0) {
                        DPRINTF("ERR: BLKGETSIZE failed, couldn't stat image");
                        return -EINVAL;
@@ -82,6 +90,7 @@ static int get_image_info(struct td_stat
                        (long long unsigned)(s->size << SECTOR_SHIFT),
                        (long long unsigned)s->size);
 
+#endif
                /*Get the sector size*/
 #if defined(BLKSSZGET)
                {
diff -r 8ba08f2244b2 tools/blktap/drivers/block-sync.c
--- a/tools/blktap/drivers/block-sync.c Wed Dec 05 17:56:13 2007 +0000
+++ b/tools/blktap/drivers/block-sync.c Thu Dec 06 11:05:44 2007 +0100
@@ -37,8 +37,15 @@
 #include <sys/statvfs.h>
 #include <sys/stat.h>
 #include <sys/ioctl.h>
+#if defined(__linux__) || defined(__Linux__)
 #include <linux/fs.h>
+#endif
 #include "tapdisk.h"
+
+/* *BSD has no O_LARGEFILE */
+#ifndef O_LARGEFILE
+#define O_LARGEFILE    0
+#endif
 
 struct tdsync_state {
        int fd;
@@ -63,6 +70,7 @@ static int get_image_info(struct td_stat
        if (S_ISBLK(stat.st_mode)) {
                /*Accessing block device directly*/
                s->size = 0;
+#if defined(BLKGETSIZE)
                if (ioctl(fd,BLKGETSIZE,&s->size)!=0) {
                        DPRINTF("ERR: BLKGETSIZE failed, couldn't stat image");
                        return -EINVAL;
@@ -73,6 +81,7 @@ static int get_image_info(struct td_stat
                        (long long unsigned)(s->size << SECTOR_SHIFT),
                        (long long unsigned)s->size);
 
+#endif
                /*Get the sector size*/
 #if defined(BLKSSZGET)
                {
diff -r 8ba08f2244b2 tools/blktap/drivers/block-vmdk.c
--- a/tools/blktap/drivers/block-vmdk.c Wed Dec 05 17:56:13 2007 +0000
+++ b/tools/blktap/drivers/block-vmdk.c Thu Dec 06 11:05:44 2007 +0100
@@ -42,10 +42,17 @@
 #include <sys/statvfs.h>
 #include <sys/stat.h>
 #include <sys/ioctl.h>
+#if defined(__linux__) || defined(__Linux__)
 #include <linux/fs.h>
+#endif
 #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 8ba08f2244b2 tools/blktap/drivers/img2qcow.c
--- a/tools/blktap/drivers/img2qcow.c   Wed Dec 05 17:56:13 2007 +0000
+++ b/tools/blktap/drivers/img2qcow.c   Thu Dec 06 11:05:44 2007 +0100
@@ -37,7 +37,9 @@
 #include <sys/statvfs.h>
 #include <sys/stat.h>
 #include <sys/ioctl.h>
+#if defined(__linux__)
 #include <linux/fs.h>
+#endif
 #include <string.h>
 #include "tapdisk.h"
 
@@ -46,6 +48,12 @@
 #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
@@ -110,11 +118,13 @@ static int get_image_info(struct td_stat
        if (S_ISBLK(stat.st_mode)) {
                /*Accessing block device directly*/
                s->size = 0;
+#if defined(BLKGETSIZE)
                if (ioctl(fd,BLKGETSIZE,&s->size)!=0) {
                        DFPRINTF("ERR: BLKGETSIZE failed, "
                                 "couldn't stat image");
                        return -EINVAL;
                }
+#endif
 
                DFPRINTF("Image size: \n\tpre sector_shift  [%llu]\n\tpost "
                        "sector_shift [%llu]\n",
diff -r 8ba08f2244b2 tools/blktap/drivers/qcow2raw.c
--- a/tools/blktap/drivers/qcow2raw.c   Wed Dec 05 17:56:13 2007 +0000
+++ b/tools/blktap/drivers/qcow2raw.c   Thu Dec 06 11:05:44 2007 +0100
@@ -37,7 +37,9 @@
 #include <sys/statvfs.h>
 #include <sys/stat.h>
 #include <sys/ioctl.h>
+#if defined(__linux__)
 #include <linux/fs.h>
+#endif
 #include <string.h>
 #include "tapdisk.h"
 
@@ -45,6 +47,12 @@
 #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
@@ -227,6 +235,7 @@ int main(int argc, char *argv[])
                }
 
                if (S_ISBLK(finfo.st_mode)) {
+#if defined(BLKGETSIZE)
                        if(ioctl(fd,BLKGETSIZE,&size)!=0) {
                                DFPRINTF("ERROR: BLKGETSIZE failed, "
                                        "couldn't stat image [%s]\n", 
@@ -234,6 +243,9 @@ int main(int argc, char *argv[])
                                close(fd);
                                exit(-1);
                        }
+#else
+                       size = 0;
+#endif
                        if (size < ddqcow.td_state->size<<9) {
                                DFPRINTF("ERROR: Not enough space on device "
                                        "%s (%lu bytes available, %llu bytes 
required\n",


Home | Main Index | Thread Index | Old Index