void init(std::string path, size_t length) { this->path = path; this->length = length; if (!file_exists(path)) { FILE * fout = fopen(path.c_str(), "wb"); fclose(fout); } if (file_size(path) != sizeof(T) * length) { long file_length = sizeof(T) * length; assert(truncate(path.c_str(), file_length)!=-1); int fout = open(path.c_str(), O_WRONLY); void * buffer = memalign(PAGESIZE, PAGESIZE); for (long offset=0;offset<file_length;) { if (file_length - offset > PAGESIZE) { assert(write(fout, buffer, PAGESIZE)==PAGESIZE); offset += PAGESIZE; } else { assert(write(fout, buffer, file_length - offset)==file_length - offset); offset += file_length - offset; } } close(fout); } fd = open(path.c_str(), O_RDWR | O_DIRECT); assert(fd!=-1); open_mmap(); }
/* ARGSUSED */ void * map_phys_mem(unsigned long base, unsigned long size) { DIOParPkt par; ULONG plen; DIODtaPkt dta; ULONG dlen; static BOOL ErrRedir = FALSE; APIRET rc; par.addr = (ULONG)base; par.size = (ULONG)size; plen = sizeof(par); dlen = sizeof(dta); open_mmap(); if (mapdev == -1) { perror("libdha: device xf86sup.sys is not installed"); exit(1); } if ((rc=DosDevIOCtl(mapdev, (ULONG)0x76, (ULONG)0x44, (PVOID)&par, (ULONG)plen, (PULONG)&plen, (PVOID)&dta, (ULONG)dlen, (PULONG)&dlen)) == 0) { if (dlen==sizeof(dta)) { callcount++; return (void *)dta.addr; } /*else fail*/ } return (void *)-1; }
int main(int argc, char *argv[]) { int i, r = 1; struct ffile file_old = { .fd = -1, .addr = MAP_FAILED, }; struct ffile file_new = { .fd = -1, .addr = MAP_FAILED, }; if (argc < 3) { printf("Use: differ old_file new_file change_list.\n"); goto bad; } file_old.name = argv[1]; if (!open_mmap(&file_old)) goto bad; file_new.name = argv[2]; if (!open_mmap(&file_new)) goto bad; for (i = 3; i < argc; i++) if (check(argv[i], file_old.addr, file_new.addr) == FAIL) { printf ("FAILED for %s\n", argv[i]); r = 1; goto bad; } r = 0; bad: close_mmap(&file_new); close_mmap(&file_old); return r; }
void save() { long end_offset = end_i * sizeof(T); long offset = begin_i * sizeof(T); long bytes; while (offset < end_offset) { bytes = pwrite(fd, data_in_memory + (offset / sizeof(T) - begin_i), (end_offset - offset + PAGESIZE - 1) / PAGESIZE * PAGESIZE, offset); if (bytes==-1) { printf("%ld %ld\n", offset, end_offset); printf("%s\n", strerror(errno)); getchar(); exit(-1); } offset += bytes; } int ret = munmap(data_in_memory, (end_i - begin_i) * sizeof(T) + PAGESIZE); assert(ret==0); in_memory = false; begin_i = 0; end_i = 0; open_mmap(); }