|
|
1.1 root 1: /* x_snap.c - x_snap */
2:
3: #include <conf.h>
4: #include <kernel.h>
5: #include <shell.h>
6: #include <coreX.h>
7:
8: extern int maxaddr;
9: LOCAL int snapreg;
10: #define SNAPSIZ 512
11:
12: /*------------------------------------------------------------------------
13: * x_snap - (command snap) write snapshot of memory to a core file
14: *------------------------------------------------------------------------
15: */
16: COMMAND x_snap(stdin, stdout, stderr, nargs, args)
17: int stdin, stdout, stderr, nargs;
18: char *args[];
19: {
20: int dev, iPkt, len;
21: struct coreX hdr;
22: char *p;
23:
24: if (nargs > 2) {
25: fprintf(stderr,"usage: snap [core-file]\n");
26: return(SYSERR);
27: }
28: p = nargs==1 ? "coreX" : args[1];
29: if ((dev=open(NAMESPACE, p, "w")) == SYSERR) {
30: fprintf(stderr,"snap: cannot open %s for writing\n", p);
31: return(SYSERR);
32: }
33:
34: /* make up a core image using coreX structure heading format */
35:
36: hdr.c_magic = COREMAGIC;
37: hdr.c_size = hdr.c_zero1 = hdr.c_zero2 = hdr.c_zero3 =
38: hdr.c_zero4 = hdr.c_zero5 = 0;
39: /* Capture machine registers */
40:
41: asm("mfpr $0x0, _snapreg"); hdr.c_regs[KSP] = snapreg;
42: asm("mfpr $0x1, _snapreg"); hdr.c_regs[ESP] = snapreg;
43: asm("mfpr $0x2, _snapreg"); hdr.c_regs[SSP] = snapreg;
44: asm("mfpr $0x3, _snapreg"); hdr.c_regs[SSP] = snapreg;
45: asm("movl r0,_snapreg"); hdr.c_regs[R0] = snapreg;
46: asm("movl r1,_snapreg"); hdr.c_regs[R1] = snapreg;
47: asm("movl r2,_snapreg"); hdr.c_regs[R2] = snapreg;
48: asm("movl r3,_snapreg"); hdr.c_regs[R3] = snapreg;
49: asm("movl r4,_snapreg"); hdr.c_regs[R4] = snapreg;
50: asm("movl r5,_snapreg"); hdr.c_regs[R5] = snapreg;
51: asm("movl r6,_snapreg"); hdr.c_regs[R6] = snapreg;
52: asm("movl r7,_snapreg"); hdr.c_regs[R7] = snapreg;
53: asm("movl r8,_snapreg"); hdr.c_regs[R8] = snapreg;
54: asm("movl r9,_snapreg"); hdr.c_regs[R9] = snapreg;
55: asm("movl r10,_snapreg"); hdr.c_regs[R10] = snapreg;
56: asm("movl r11,_snapreg"); hdr.c_regs[R11] = snapreg;
57: asm("movl ap,_snapreg"); hdr.c_regs[AP] = snapreg;
58: asm("movl fp,_snapreg"); hdr.c_regs[FP] = snapreg;
59: asm("sneakpc: moval sneakpc, _snapreg"); hdr.c_regs[PC] = snapreg;
60: asm("movpsl _snapreg"); hdr.c_psw = hdr.c_regs[PSL] = snapreg;
61: asm("mfpr $0x8, _snapreg"); hdr.c_regs[P0BR] = snapreg;
62: asm("mfpr $0x9, _snapreg"); hdr.c_regs[P0LR] = snapreg;
63: asm("mfpr $0xa, _snapreg"); hdr.c_regs[P1BR] = snapreg;
64: asm("mfpr $0xb, _snapreg"); hdr.c_regs[P1LR] = snapreg;
65: fprintf(stderr, "Writing core image");
66: if ( write(dev, &hdr, sizeof(struct coreX)) == SYSERR ) {
67: fprintf(stderr,"snap: can't write core header, quitting\n");
68: close(dev);
69: return(SYSERR);
70: }
71:
72: /* Add contents of real memory to core image */
73:
74: iPkt = 0;
75: for (p= (char *)0 ; p < (char *)(maxaddr+sizeof(int)) ; p += len) {
76: if (++iPkt == 25) {
77: iPkt = 0;
78: putc(stderr, '.');
79: }
80: len = (int) maxaddr - (int) p + sizeof(int);
81: if (len > (unsigned) SNAPSIZ)
82: len = SNAPSIZ;
83: if (write(dev, p, SNAPSIZ) == SYSERR) {
84: fprintf(stderr,
85: "\nsnap: write error, quitting\n");
86: close(dev);
87: return(SYSERR);
88: }
89: }
90: putc(stderr, '\n');
91: close(dev);
92: return(OK);
93: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.