From 7fae3eb960891550daeaff96152efe59acbc287a Mon Sep 17 00:00:00 2001 From: ian Date: Tue, 12 Feb 2008 23:41:25 +0000 Subject: [PATCH] better memory mapping, wip debugging record now? --- hostside/persist.c | 63 ++++++++++------------------------------------ hostside/record.c | 22 ++++++++-------- hostside/record.h | 2 +- 3 files changed, 26 insertions(+), 61 deletions(-) diff --git a/hostside/persist.c b/hostside/persist.c index e95aca1..fcf0be2 100644 --- a/hostside/persist.c +++ b/hostside/persist.c @@ -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; tranpname); - 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; segnowner); if (seg->i != segi || !segi->pname || !seg->owner || !seg->owner->pname) diff --git a/hostside/record.c b/hostside/record.c index 67d34a1..0a20418 100644 --- a/hostside/record.c +++ b/hostside/record.c @@ -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; iowner= 0; seg->movposcomb= -1; seg->i= segi; } diff --git a/hostside/record.h b/hostside/record.h index cab5b15..1e8d149 100644 --- a/hostside/record.h +++ b/hostside/record.h @@ -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) \ -- 2.30.2