Add qlmpi and swap to mckernel (This is rebase commit for merging to development)
This commit is contained in:
committed by
Ken Sato
parent
74f15783d2
commit
236a072311
127
test/qlmpi/dump-pages.c
Normal file
127
test/qlmpi/dump-pages.c
Normal file
@ -0,0 +1,127 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user