chiark / gitweb /
better memory mapping, wip debugging record now?
authorian <ian>
Tue, 12 Feb 2008 23:41:25 +0000 (23:41 +0000)
committerian <ian>
Tue, 12 Feb 2008 23:41:25 +0000 (23:41 +0000)
hostside/persist.c
hostside/record.c
hostside/record.h

index e95aca1a526e778254bccb51110f9033cacbd5a7..fcf0be2e319409450e14e374b6b5ef85e1107994 100644 (file)
@@ -160,55 +160,37 @@ void persist_entrails_interpret(void) {
 
 /*---------- stupid mmap workaround ----------*/
 
-static Byte resaddrbuf[1024*1024], *resaddrbegin;
+static Byte resaddrbuf[1024*1024];
 static long pagesize;
 static unsigned long resaddruse;
 
 #define RESADDR_DIEFMT   "(persist mapping parameters:" \
                          " %p+0x%lx%%0x%lx->%p+0x%lx)"
 #define RESADDR_DIEARGS  resaddrbuf,(unsigned long)sizeof(resaddrbuf), \
-                         pagesize, resaddrbegin,resaddruse
+                         pagesize, mapbase,resaddruse
 
 static void resaddrdiee(const char *why) {
   diee("%s " RESADDR_DIEFMT, why, RESADDR_DIEARGS);
 }
 
-static void showmaps(int lno) {
-  FILE *f;
-  int c;
-  fprintf(stderr,"=======%d======\n",lno);
-  f= fopen("/proc/self/maps","r");  if (!f) diee("open maps");
-  while ((c=getc(f)) != EOF)
-    fputc(c,stderr);
-  if (ferror(f)) diee("read maps");
-  fclose(f);
-system("grep Committed_AS /proc/meminfo");
-}
-
-#define SHOWMAPS showmaps(__LINE__);
-
 void persist_map_veryearly(void) {
   int r;
         
-SHOWMAPS
-
   errno= 0; pagesize= sysconf(_SC_PAGE_SIZE);
   if (pagesize<=0) diee("could not find pagesize");
 
   if (pagesize & (pagesize-1)) return;
   if (pagesize > sizeof(resaddrbuf)/2) return;
 
-  resaddrbegin= (void*)(((unsigned long)resaddrbuf + pagesize - 1) &
-                       ~(pagesize - 1UL));
+  mapbase= (void*)(((unsigned long)resaddrbuf + pagesize - 1) &
+                  ~(pagesize - 1UL));
   resaddruse= sizeof(resaddrbuf) - pagesize;
 
-  r= mprotect(resaddrbegin,resaddruse,PROT_READ);
+  r= mprotect(mapbase,resaddruse,PROT_READ);
   if (r) resaddrdiee("mprotect reserve buffer");
-
-SHOWMAPS
 }
 
-static void *mapmem(int fd, int datalen, int prot) {
+static void mapmem(int fd, int datalen, int prot) {
   void *rv;
   int r;
 
@@ -218,18 +200,15 @@ static void *mapmem(int fd, int datalen, int prot) {
   if (datalen > resaddruse)
     die("data length %d too large " RESADDR_DIEFMT, datalen, RESADDR_DIEARGS);
   
-  r= munmap(resaddrbegin, resaddruse);
+  r= munmap(mapbase, resaddruse);
   if (r) resaddrdiee("munmap reserve buffer");
     
-  rv= mmap(resaddrbegin, datalen, prot, MAP_SHARED|MAP_FIXED, fd, 0);
+  rv= mmap(mapbase, datalen, prot, MAP_SHARED|MAP_FIXED, fd, 0);
   if (rv == MAP_FAILED)
     resaddrdiee(prot==(PROT_READ|PROT_WRITE) ? "map data rw" :
                prot==PROT_READ ? "map data ro" : "map data badly");
         
-  assert(rv == resaddrbegin);
-  
-SHOWMAPS
-  return rv;
+  assert(rv == mapbase);
 }
 
 /*---------- installing of our data as the current one ----------*/
@@ -341,7 +320,7 @@ void *record_allocate(int datalen_spec) {
 
   fd= fileno(data);
 
-  mapbase= mapmem(fd, datalen, PROT_READ|PROT_WRITE);
+  mapmem(fd, datalen, PROT_READ|PROT_WRITE);
 
   return mapbase;
 }
@@ -368,10 +347,9 @@ static void phi_check(const void *expected, size_t sz, int *offset) {
   if (memcmp(actual, expected, sz)) die("header magic check failed");
 }
   
-static void *persist_mapread(void) {
+static void persist_mapread(void) {
   struct stat stab;
   int offset=0, r;
-  void *rv;
 
   r= fstat(0, &stab);  if (r) diee("could not fstat persist data file");
   if (!(stab.st_mode & 0111)) die("persist data file is not executable");
@@ -380,30 +358,16 @@ static void *persist_mapread(void) {
 #define PHI_LOAD(x) phi_load(&(x), sizeof(x), &offset);
   DO_PERSIST_HEADER_ITEMS(PHI_CHECK, PHI_LOAD, PHI_LOAD)
 
-  rv= mapmem(0, datalen, PROT_READ|PROT_WRITE);
-  return rv;
+  mapmem(0, datalen, PROT_READ);
 }
 
 void persist_entrails_run_converter(void) {
   Train *tra; int tran;
   Segment *seg; const SegmentInfo *segi; int segn;
-  void *realbase;
-  ptrdiff_t adjust;
-
-  realbase= persist_mapread();
-  adjust= (Byte*)realbase - (Byte*)mapbase;
-  assert(!adjust);
 
-#define CP(lvalue) \
-  ((lvalue)= (lvalue) ? (void*)((Byte*)(lvalue) + adjust) : 0);
-
-#define PHI_IGNORE(x) /*nothing*/
-  DO_PERSIST_HEADER_ITEMS(PHI_IGNORE, PHI_IGNORE, CP)
+  persist_mapread();
 
   for (tran=0, tra=trains; tran<n_trains; tran++, tra++) {
-    CP(tra->pname);
-    CP(tra->foredetect);
-    
     if (!tra->pname || !tra->foredetect ||
        !tra->foredetect->i || !tra->foredetect->i->pname)
       continue;
@@ -413,7 +377,6 @@ void persist_entrails_run_converter(void) {
   }
   for (segn=0, seg=segments, segi=info_segments; segn<info_nsegments;
        segn++, seg++, segi++) {
-    CP(seg->owner);
     
     if (seg->i != segi || !segi->pname ||
        !seg->owner || !seg->owner->pname)
index 67d34a13b8dc2769f2b506f758f0aa2651ea435a..0a2041800f2e9c7dd52533145a74549ea665d560 100644 (file)
@@ -224,13 +224,20 @@ static void sort_curves(void) {
 
 static void *alloc_some(void *mapbase, int *offset, size_t sz, int count) {
   void *r;
+  size_t totalsz;
   
   while (*offset % sz) {
     if (mapbase) ((Byte*)mapbase)[*offset]= 0xaa;
     (*offset)++;
   }
-  r= mapbase ? (Byte*)mapbase + *offset : 0;
-  *offset += sz*count;
+  totalsz= sz*count;
+  if (mapbase) {
+    r= (Byte*)mapbase + *offset;
+    memset(r,0,totalsz);
+  } else {
+    r= 0;
+  }
+  *offset += totalsz;
   return r;
 }
 
@@ -256,17 +263,11 @@ static void alloc(void) {
 #define PHI_SAVE(x) {                          \
       typeof(x) *p;                            \
       ALLOC(p,1);                              \
-      if (phase==2)                            \
-        *p= (x);                               \
-    }
-#define PHI_DUMP(x) {                          \
-      Byte *p;                                 \
-      ALLOC(p,sizeof(x));                      \
       if (phase==2)                            \
         memcpy(p, &(x), sizeof(x));            \
     }
 
-    DO_PERSIST_HEADER_ITEMS(PHI_DUMP, PHI_SAVE, PHI_SAVE)
+    DO_PERSIST_HEADER_ITEMS(PHI_SAVE, PHI_SAVE, PHI_SAVE)
     
     if (phase==2)
       break;
@@ -282,7 +283,7 @@ static void alloc(void) {
        free(*trap);
        tra->pname= *trap= pname;
        tra->addr= -1;
-       tra->head= -1;
+       tra->foredetect= 0;
       }        
     }
 
@@ -291,6 +292,7 @@ static void alloc(void) {
       for (i=0, seg=segments, segi=info_segments;
           i<NUM_SEGMENTS;
           i++, seg++, segi++) {
+       seg->owner= 0;
        seg->movposcomb= -1;
        seg->i= segi;
       }
index cab5b1537c7e41299bdfdf23543a3517a31b69c4..1e8d14967f992b93203e48fbd7dec207a8d5c6fe 100644 (file)
@@ -14,7 +14,7 @@ void *record_allocate(int length);
 
 #define DO_PERSIST_HEADER_ITEMS(cnst,num,ptr)  \
   cnst("#! /dev/enoent/trains-image\n")                \
-  ptr(mapbase)                                 \
+  cnst(mapbase)                                        \
   num(datalen)                                 \
   ptr(trains)                                  \
   num(n_trains)                                        \