|
|
1.1 root 1: #include "process.pri"
2: #include "frame.pri"
3: #include "symtab.pri"
4: #include "symbol.h"
5: #include "hostcore.h"
6: /*#include <sys/reg.h>*/
7: #include "master.pri"
8: SRCFILE("kerncore.c")
9:
10: #define P0P1_PROG 0x00000000
11: #define P0P1_STCK 0x08000000
12: #define P0P1_SYST 0x0F000000
13: #define P0P1_MASK 0x0F000000
14: #define VPN_MASK 0x00FFE000
15: #define PAGE_MASK 0x00001FFF
16: #define PAGE_SHIFT 13
17: #define PFN_MASK 0x0007FFFF
18: #define FOD_MASK 0x00100000
19:
20: class Pte {
21: public:
22: long e;
23: long pfn() { return e&PFN_MASK; }
24: int fod() { return e&FOD_MASK; }
25: int valid() { return e<0 || (!fod() && pfn()); }
26: long pfntob() { return pfn()<<PAGE_SHIFT; }
27: };
28:
29: char *KernCore::specialop(char *s)
30: {
31: trace( "%d.specialop(%s)", this, s?s:"0" ); OK(0);
32: if( !strcmp(s, "pte") )
33: return "pcb = $";
34: return 0;
35: }
36:
37: char *KernCore::special(char *s, long addr)
38: {
39: trace("%d.special(%s,0x%X)", this, s?s:"0", loc); OK(0);
40: IF_LIVE(strcmp(s, "pte")) return 0;
41: char *error = getpcb(peek(addr)->lng);
42: if( !error )
43: _process->habeascorpus(PENDING, 0);
44: return error;
45: }
46:
47: char *KernCore::getpcb(long addr)
48: {
49: trace("%d.getpcb(0x%X)", this, addr); OK("KernCore::getpcb");
50: lseek(corefd, pcb_loc = (addr&PFN_MASK)<<PAGE_SHIFT, 0);
51: if( !ReadOK(corefd, (char*)&pcb_copy, sizeof pcb_copy) )
52: return "can't read pcb";
53: pcb_copy.pcb_p0lr &= ~AST_CLR;
54: return 0;
55: }
56:
57: char *KernCore::open()
58: {
59: trace("%d.open() %d", this, _process); OK("KernCore::open");
60: int mode = 2;
61: while( corefd<0 && mode>=0 )
62: corefd = ::open(procpath(), mode--);
63: if( corefstat() )
64: return SysErr("core image: " );
65: if( stabpath() ){
66: stabfd = ::open(stabpath(),0);
67: if( stabfd<0 ) return SysErr( "symbol tables: " );
68: }
69: _online = 0;
70: stabfstat();
71: if( stabfd >= 0 ) _symtab = 0; /* don't inherit /unix */
72: #ifdef V9
73: _symtab = new Ed8SymTab(this, stabfd, _symtab);
74: #else
75: _symtab = new BsdSymTab(this, stabfd, _symtab);
76: #endif
77: _symtab->read();
78: static char *id[3] = { "Sysmap", "Syssize", "intstack" };
79: static char *_id[3]= { "_Sysmap", "_Syssize", "_intstack" };
80: Symbol *glb[4];
81: SSet glbfun(U_GLB, U_FUNC);
82: for( int i = 0; i <= 2; ++i )
83: if( !(glb[i] = _symtab->idtosym(glbfun, id[i]))
84: && !(glb[i] = _symtab->idtosym(glbfun, _id[i])) )
85: return sf("not found: %s", id[i]);
86: sbr = glb[0]->range.lo;
87: slr = glb[1]->range.lo;
88: intstack = glb[2]->range.lo;
89: // char *error = getpcb(peek(glb[2]->range.lo&~P0P1_SYST)->lng);
90: // if( error ) return error;
91: return readcontrol();
92: }
93:
94: char *KernCore::readcontrol()
95: {
96: trace( "%d.readcontrol()", this ); OK("KernCore::readcontrol()");
97: if( corefstat() )
98: return "cannot fstat core image";
99: return 0;
100: }
101:
102: Behavs KernCore::behavs()
103: {
104: trace( "%d.behavs()", this ); OK(ERRORED);
105: char *error = readcontrol();
106: if( error ){
107: behavs_problem = sf( "readcontrol(): %s", error );
108: return ERRORED;
109: }
110: return PENDING;
111: }
112:
113: char *KernCore::eventname()
114: {
115: OK("eventname");
116: return
117: sf("sbr=0x%X slr=0x%X p0br=0x%X p0lr=0x%X p1br=0x%X p1lr=0x%X",
118: sbr, slr,
119: pcb_copy.pcb_p0br, pcb_copy.pcb_p0lr, pcb_copy.pcb_p1br, pcb_copy.pcb_p1lr
120: );
121: }
122:
123: int KernCore::event() { return 0; } /* ever called? */
124:
125: char *KernCore::seekto(int&, long &addr, int&)
126: {
127: trace("%d.seekto(%d,0x%X,%d)", this, addr); OK("seekto");
128: Pte p;
129: long page = (addr&VPN_MASK)>>PAGE_SHIFT, po = addr&PAGE_MASK;
130: switch( addr & P0P1_MASK ){
131: // case P0P1_STCK:
132: // if( page < pcb_copy.pcb_p1lr )
133: // return "page < p1lr";
134: // addr = (long)(pcb_copy.pcb_p1br+page);
135: // if( !(addr&P0P1_SYST) )
136: // return "user stack page table error";
137: // seekto(0, addr, 0);
138: // p.e = peek(addr)->lng;
139: // if( !p.valid() )
140: // return "invalid page table entry";
141: // addr = p.pfntob() + po;
142: // break;
143: case P0P1_SYST:
144: if( page > slr )
145: return "page > slr";
146: p.e = peek((sbr+page*4)&~P0P1_SYST)->lng;
147: if( !p.valid() )
148: return "invalid page table entry";
149: addr = p.pfntob() + po;
150: break;
151: }
152: return 0;
153: }
154:
155: long KernCore::regloc(int ,int)
156: {
157: // return pcb_loc + ((long)(&pcb_copy.pcb_r0) - (long)&pcb_copy) + 4*r;
158: return 0;
159: }
160:
161: long KernCore::pc()
162: {
163: // return pcb_copy.pcb_pc;
164: return 0;
165: }
166:
167: long KernCore::fp()
168: {
169: if (cs_fp)
170: return cs_fp;
171: return 0;
172: // Cslfd *cp = peek(intstack-4);
173: // return cp ? cp->lng : 0;
174: }
175:
176: int KernCore::instack(long curfp, long prevfp )
177: {
178: return curfp && (curfp>prevfp);
179: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.