]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/mini-os.git/commitdiff
minios: more assertions
authorKeir Fraser <keir.fraser@citrix.com>
Wed, 26 Mar 2008 13:13:50 +0000 (13:13 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Wed, 26 Mar 2008 13:13:50 +0000 (13:13 +0000)
- assert that we never allocate or free the same grant twice
- assert that network packets do not exceed a page
- assert that incoming network event IDs make sense

Signed-off-by: Samuel Thibault <samuel.thibault@eu.citrix.com>
gnttab.c
minios.mk
netfront.c

index 5c2dcea86386919927572f206770200a22f074d1..dd66b043bf7dadaba2092f1596a600bc4474b822 100644 (file)
--- a/gnttab.c
+++ b/gnttab.c
@@ -32,6 +32,9 @@
 
 static grant_entry_t *gnttab_table;
 static grant_ref_t gnttab_list[NR_GRANT_ENTRIES];
+#ifdef GNT_DEBUG
+static char inuse[NR_GRANT_ENTRIES];
+#endif
 static __DECLARE_SEMAPHORE_GENERIC(gnttab_sem, NR_GRANT_ENTRIES);
 
 static void
@@ -39,6 +42,10 @@ put_free_entry(grant_ref_t ref)
 {
     unsigned long flags;
     local_irq_save(flags);
+#ifdef GNT_DEBUG
+    BUG_ON(!inuse[ref]);
+    inuse[ref] = 0;
+#endif
     gnttab_list[ref] = gnttab_list[0];
     gnttab_list[0]  = ref;
     local_irq_restore(flags);
@@ -54,6 +61,10 @@ get_free_entry(void)
     local_irq_save(flags);
     ref = gnttab_list[0];
     gnttab_list[0] = gnttab_list[ref];
+#ifdef GNT_DEBUG
+    BUG_ON(inuse[ref]);
+    inuse[ref] = 1;
+#endif
     local_irq_restore(flags);
     return ref;
 }
@@ -92,10 +103,12 @@ gnttab_end_access(grant_ref_t ref)
 {
     u16 flags, nflags;
 
+    BUG_ON(ref >= NR_GRANT_ENTRIES || ref < NR_RESERVED_ENTRIES);
+
     nflags = gnttab_table[ref].flags;
     do {
         if ((flags = nflags) & (GTF_reading|GTF_writing)) {
-            printk("WARNING: g.e. still in use!\n");
+            printk("WARNING: g.e. still in use! (%x)\n", flags);
             return 0;
         }
     } while ((nflags = synch_cmpxchg(&gnttab_table[ref].flags, flags, 0)) !=
@@ -111,6 +124,8 @@ gnttab_end_transfer(grant_ref_t ref)
     unsigned long frame;
     u16 flags;
 
+    BUG_ON(ref >= NR_GRANT_ENTRIES || ref < NR_RESERVED_ENTRIES);
+
     while (!((flags = gnttab_table[ref].flags) & GTF_transfer_committed)) {
         if (synch_cmpxchg(&gnttab_table[ref].flags, flags, 0) == flags) {
             printk("Release unused transfer grant.\n");
@@ -164,6 +179,9 @@ init_gnttab(void)
     unsigned long frames[NR_GRANT_FRAMES];
     int i;
 
+#ifdef GNT_DEBUG
+    memset(inuse, 1, sizeof(inuse));
+#endif
     for (i = NR_RESERVED_ENTRIES; i < NR_GRANT_ENTRIES; i++)
         put_free_entry(i);
 
index 078c396fc29b5ada9d5c4089a1e96fe4c09468b8..d881e3da4e6582f9169f3ca90e38b4f11e71b296 100644 (file)
--- a/minios.mk
+++ b/minios.mk
@@ -16,6 +16,10 @@ DEF_LDFLAGS =
 
 ifeq ($(debug),y)
 DEF_CFLAGS += -g
+#DEF_CFLAGS += MM_DEBUG
+#DEF_CFLAGS += FS_DEBUG
+#DEF_CFLAGS += LIBC_DEBUG
+#DEF_CFLAGS += GNT_DEBUG
 else
 DEF_CFLAGS += -O3
 endif
index 3159c30445a5e0092e90972f887fe4e9b0aea9de..acdc76d994859160dc7724a55544d928f5ae5ff2 100644 (file)
@@ -120,6 +120,7 @@ moretodo:
         if (rx->status == NETIF_RSP_NULL) continue;
 
         int id = rx->id;
+        BUG_ON(id >= NET_TX_RING_SIZE);
 
         buf = &dev->rx_buffers[id];
         page = (unsigned char*)buf->page;
@@ -204,6 +205,7 @@ void network_tx_buf_gc(struct netfront_dev *dev)
                 printk("packet error\n");
 
             id  = txrsp->id;
+            BUG_ON(id >= NET_TX_RING_SIZE);
             struct net_buffer* buf = &dev->tx_buffers[id];
             gnttab_end_access(buf->gref);
             buf->gref=GRANT_INVALID_REF;
@@ -510,6 +512,8 @@ void netfront_xmit(struct netfront_dev *dev, unsigned char* data,int len)
     struct net_buffer* buf;
     void* page;
 
+    BUG_ON(len > PAGE_SIZE);
+
     down(&dev->tx_sem);
 
     local_irq_save(flags);