128 lines
3.0 KiB
C
128 lines
3.0 KiB
C
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <fcntl.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include "swapfmt.h"
|
|
|
|
struct swap_header header;
|
|
struct swap_areainfo *meminfo, *lckinfo;
|
|
|
|
void
|
|
show(unsigned *data, int cnt)
|
|
{
|
|
printf("\t");
|
|
while (--cnt) {
|
|
printf("%08lx ", *data++);
|
|
}
|
|
printf("\n");
|
|
}
|
|
|
|
unsigned long
|
|
convhex(char *cp)
|
|
{
|
|
unsigned long val = 0;
|
|
|
|
while (*cp != '\n' && *cp != 0) {
|
|
if (isdigit(*cp)) {
|
|
val = (val<<4) + *cp - '0';
|
|
} else if (isupper(*cp) && isxdigit(*cp)) {
|
|
val = (val<<4) + *cp - 'A' + 10;
|
|
} else if (isxdigit(*cp)) {
|
|
val = (val<<4) + *cp - 'a' + 10;
|
|
} else {
|
|
break;
|
|
}
|
|
cp++;
|
|
}
|
|
return val;
|
|
}
|
|
|
|
ssize_t
|
|
findpos(unsigned long addr)
|
|
{
|
|
int i;
|
|
ssize_t pos = 0;
|
|
for (i = 0; i < header.count_sarea; i++) {
|
|
if (addr >= meminfo[i].start && addr < meminfo[i].end) {
|
|
pos = meminfo[i].pos;
|
|
pos += addr - meminfo[i].start;
|
|
}
|
|
}
|
|
return pos;
|
|
}
|
|
|
|
int
|
|
main(int argc, char **argv)
|
|
{
|
|
FILE *fp;
|
|
char *fname, *cp;
|
|
int interractive = 0;
|
|
int i;
|
|
|
|
if (argc >= 2) {
|
|
fname = argv[1];
|
|
if (argc >= 3) interractive = 1;
|
|
} else {
|
|
fname = "/tmp/pages";
|
|
}
|
|
if ((fp = fopen(fname, "r")) == 0) {
|
|
fprintf(stderr, "Cannot open file: %s\n", fname);
|
|
exit(-1);
|
|
}
|
|
fread(&header, sizeof(header), 1, fp);
|
|
printf("magic : %s\n", header.magic);
|
|
printf("version : %d\n", header.version);
|
|
printf("swap area count : %d\n", header.count_sarea);
|
|
printf("mlock area count: %d\n", header.count_marea);
|
|
printf("SWAP:\n");
|
|
printf("\t start end : file position (flags)\n");
|
|
meminfo = malloc(sizeof(struct swap_areainfo)* header.count_sarea);
|
|
lckinfo = malloc(sizeof(struct swap_areainfo)* header.count_marea);
|
|
fread(meminfo, sizeof(struct swap_areainfo), header.count_sarea, fp);
|
|
fread(lckinfo, sizeof(struct swap_areainfo), header.count_marea, fp);
|
|
|
|
for (i = 0; i < header.count_sarea; i++) {
|
|
printf("\t%016lx -- %016lx : %010lx (%lx)\n",
|
|
meminfo[i].start, meminfo[i].end, meminfo[i].pos, meminfo[i].flag);
|
|
}
|
|
printf("MLOCK:\n");
|
|
printf("\t start end : physical address (flags)\n");
|
|
for (i = 0; i < header.count_marea; i++) {
|
|
printf("\t%016lx -- %016lx : %010lx (%lx)\n",
|
|
lckinfo[i].start, lckinfo[i].end, lckinfo[i].pos, lckinfo[i].flag);
|
|
}
|
|
|
|
if (!interractive) goto ending;
|
|
do {
|
|
char buf1[128], buf2[128], data[8*8 + 1];
|
|
char cmd;;
|
|
ssize_t sz;
|
|
int cc;
|
|
unsigned long addr;
|
|
ssize_t fpos;
|
|
|
|
fprintf(stdout, "> "); fflush(stdout);
|
|
cp = fgets(buf1, 128, stdin);
|
|
if (cp == NULL) break;
|
|
cc = sscanf(buf1, "%c %s", &cmd, buf2);
|
|
if (cc != 2) continue;
|
|
addr = convhex(buf2);
|
|
fpos = findpos(addr);
|
|
if (fpos == 0) continue;
|
|
printf("%lx (fpos(%lx)):\n", addr, fpos);
|
|
fseek(fp, fpos, SEEK_SET);
|
|
if ((sz = fread(&data, 8*8, 1, fp)) != 1) goto err;
|
|
if (cmd == 's') {
|
|
data[8*8] = 0;
|
|
printf("\t%s", data);
|
|
} else {
|
|
show((unsigned*) data, 8);
|
|
}
|
|
} while (cp != NULL);
|
|
err:
|
|
ending:
|
|
fclose(fp);
|
|
return 0;
|
|
}
|