plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

amd64 (7064B)


      1 // 386 support
      2 
      3 defn acidinit()			// Called after all the init modules are loaded
      4 {
      5 	bplist = {};
      6 	bpfmt = 'b';
      7 
      8 	srcpath = {
      9 		"./",
     10 		"/sys/src/libc/port/",
     11 		"/sys/src/libc/9sys/",
     12 		"/sys/src/libc/amd64/"
     13 	};
     14 
     15 	srcfiles = {};			// list of loaded files
     16 	srctext = {};			// the text of the files
     17 }
     18 
     19 defn linkreg(addr)
     20 {
     21 	return {};
     22 }
     23 
     24 defn stk()				// trace
     25 {
     26 	_stk({"PC", *PC, "SP", *SP}, 0);
     27 }
     28 
     29 defn lstk()				// trace with locals
     30 {
     31 	_stk({"PC", *PC, "SP", *SP}, 1);
     32 }
     33 
     34 defn gpr()		// print general(hah hah!) purpose registers
     35 {
     36 	print("AX\t", *AX, " BX\t", *BX, " CX\t", *CX, " DX\t", *DX, "\n");
     37 	print("DI\t", *DI, " SI\t", *SI, " BP\t", *BP, "\n");
     38 	print("R8\t", *R8, " R9\t", *R9, " R10\t", *R10, " R11\t", *R11, "\n");
     39 	print("R12\t", *R12, " R13\t", *R13, " R14\t", *R14, " R15\t", *R15, "\n");
     40 }
     41 
     42 defn spr()				// print special processor registers
     43 {
     44 	local pc;
     45 	local cause;
     46 
     47 	pc = *PC;
     48 	print("PC\t", pc, " ", fmt(pc, 'a'), "  ");
     49 	pfl(pc);
     50 	print("SP\t", *SP, " FLAGS ", *FLAGS, "\n");
     51 	print("CS\t", *CS, " DS\t ", *DS, " SS\t", *SS, "\n");
     52 	print("GS\t", *GS, " FS\t ", *FS, " ES\t", *ES, "\n");
     53 	
     54 	cause = *TRAP;
     55 	print("TRAP\t", cause, " ", reason(cause), "\n");
     56 }
     57 
     58 defn regs()				// print all registers
     59 {
     60 	spr();
     61 	gpr();
     62 }
     63 
     64 defn mmregs()
     65 {
     66 	print("MM0\t", *MM0, " MM1\t", *MM1, "\n");
     67 	print("MM2\t", *MM2, " MM3\t", *MM3, "\n");
     68 	print("MM4\t", *MM4, " MM5\t", *MM5, "\n");
     69 	print("MM6\t", *MM6, " MM7\t", *MM7, "\n");
     70 }
     71 
     72 defn pfixstop(pid)
     73 {
     74 	if *fmt(*PC-1, 'b') == 0xCC then {
     75 		// Linux stops us after the breakpoint, not at it
     76 		*PC = *PC-1;
     77 	}
     78 }
     79 
     80 
     81 defn pstop(pid)
     82 {
     83 	local l;
     84 	local pc;
     85 	local why;
     86 
     87 	pc = *PC;
     88 
     89 	// FIgure out why we stopped.
     90 	if *fmt(pc, 'b') == 0xCC then {
     91 		why = "breakpoint";
     92 		
     93 		// fix up instruction for print; will put back later
     94 		*pc = @pc;
     95 	} else if *(pc-2\x) == 0x80CD then {
     96 		pc = pc-2;
     97 		why = "system call";
     98 	} else
     99 		why = "stopped";
    100 
    101 	if printstopped then {
    102 		print(pid,": ", why, "\t");
    103 		print(fmt(pc, 'a'), "\t", *fmt(pc, 'i'), "\n");
    104 	}
    105 	
    106 	if why == "breakpoint" then
    107 		*fmt(pc, bpfmt) = bpinst;
    108 	
    109 	if printstopped && notes then {
    110 		if notes[0] != "sys: breakpoint" then {
    111 			print("Notes pending:\n");
    112 			l = notes;
    113 			while l do {
    114 				print("\t", head l, "\n");
    115 				l = tail l;
    116 			}
    117 		}
    118 	}
    119 }
    120 
    121 aggr Ureg
    122 {
    123 	'Y' 0 ax;
    124 	'Y' 8 bx;
    125 	'Y' 16 cx;
    126 	'Y' 24 dx;
    127 	'Y' 32 si;
    128 	'Y' 40 di;
    129 	'Y' 48 bp;
    130 	'Y' 56 r8;
    131 	'Y' 64 r9;
    132 	'Y' 72 r10;
    133 	'Y' 80 r11;
    134 	'Y' 88 r12;
    135 	'Y' 96 r13;
    136 	'Y' 104 r14;
    137 	'Y' 112 r15;
    138 
    139 	'u' 120 ds;
    140 	'u' 122 es;
    141 	'u' 124 fs;
    142 	'u' 126 gs;
    143 	
    144 	'Y' 128 type;
    145 	'Y' 136 error;
    146 	'Y' 144 pc;
    147 	'Y' 152 cs;
    148 	'Y' 160 flags;
    149 	'Y' 168 sp;
    150 	'Y' 176 ss;
    151 };
    152 
    153 defn
    154 Ureg(addr) {
    155 	complex Ureg addr;
    156 	print("	ax	", addr.ax, "\n");
    157 	print("	bx	", addr.bx, "\n");
    158 	print("	cx	", addr.cx, "\n");
    159 	print("	dx	", addr.dx, "\n");
    160 	print("	si	", addr.si, "\n");
    161 	print("	di	", addr.di, "\n");
    162 	print("	bp	", addr.bp, "\n");
    163 	print("	r8	", addr.r8, "\n");
    164 	print("	r9	", addr.r9, "\n");
    165 	print("	r10	", addr.r10, "\n");
    166 	print("	r11	", addr.r11, "\n");
    167 	print("	r12	", addr.r12, "\n");
    168 	print("	r13	", addr.r13, "\n");
    169 	print("	r14	", addr.r14, "\n");
    170 	print("	r15	", addr.r15, "\n");
    171 	print("	ds	", addr.ds, "\n");
    172 	print("	es	", addr.es, "\n");
    173 	print("	fs	", addr.fs, "\n");
    174 	print("	gs	", addr.gs, "\n");
    175 	print("	type	", addr.type, "\n");
    176 	print("	error	", addr.error, "\n");
    177 	print("	pc	", addr.pc, "\n");
    178 	print("	cs	", addr.cs, "\n");
    179 	print("	flags	", addr.flags, "\n");
    180 	print("	sp	", addr.sp, "\n");
    181 	print("	ss	", addr.ss, "\n");
    182 };
    183 sizeofUreg = 184;
    184 
    185 aggr freebsd_amd64_siginfo
    186 {
    187 	'X' 0 signo;
    188 	'X' 4 errno;
    189 	'X' 8 code;
    190 	'X' 12 pid;
    191 	'X' 16 uid;
    192 	'X' 20 status;
    193 	'Y' 24 addr;
    194 	'Y' 32 sigval;
    195 	's' 40 reason;
    196 };
    197 
    198 defn
    199 freebsd_amd64_siginfo(addr) {
    200 	complex freebsd_amd64_siginfo addr;
    201 	print("	signo	", addr.signo, "\n");
    202 	print("	errno	", addr.errno, "\n");
    203 	print("	code	", addr.code, "\n");
    204 	print("	pid	", addr.pid, "\n");
    205 	print("	uid	", addr.uid, "\n");
    206 	print("	status	", addr.status, "\n");
    207 	print("	addr	", addr.addr, "\n");
    208 	print("	sigval	", addr.sigval, "\n");
    209 };
    210 
    211 aggr freebsd_amd64_ucontext
    212 {
    213 	'X' 0 sigmask0;
    214 	'X' 4 sigmask1;
    215 	'X' 8 sigmask2;
    216 	'X' 12 sigmask3;
    217 	'Y' 16 onstack;
    218 	'Y' 24 rdi;
    219 	'Y' 32 rsi;
    220 	'Y' 40 rdx;
    221 	'Y' 48 rcx;
    222 	'Y' 56 r8;
    223 	'Y' 64 r9;
    224 	'Y' 72 rax;
    225 	'Y' 80 rbx;
    226 	'Y' 88 rbp;
    227 	'Y' 96 r10;
    228 	'Y' 104 r11;
    229 	'Y' 112 r12;
    230 	'Y' 120 r13;
    231 	'Y' 128 r14;
    232 	'Y' 136 r15;
    233 	'X' 144 trapno;
    234 	'x' 148 fs;
    235 	'x' 150 gs;
    236 	'Y' 152 addr;
    237 	'X' 160 flags;
    238 	'x' 164 es;
    239 	'x' 166 ds;
    240 	'Y' 168 err;
    241 	'Y' 176 rip;
    242 	'Y' 184 cs;
    243 	'Y' 192 rflags;
    244 	'Y' 200 rsp;
    245 	'Y' 208 ss;
    246 	'Y' 216 len;
    247 	'Y' 224 fpformat;
    248 	'Y' 232 ownedfp;
    249 	'Y' 240 fpstate0;
    250 	'Y' 752 fsbase;
    251 	'Y' 760 gsbase;
    252 };
    253 
    254 defn
    255 freebsd_amd64_ucontext(addr) {
    256 	complex freebsd_amd64_ucontext addr;
    257 	print("	sigmask0	", addr.sigmask0, "\n");
    258 	print("	sigmask1	", addr.sigmask1, "\n");
    259 	print("	sigmask2	", addr.sigmask2, "\n");
    260 	print("	sigmask3	", addr.sigmask3, "\n");
    261 	print("	onstack	", addr.onstack, "\n");
    262 	print("	rdi	", addr.rdi, "\n");
    263 	print("	rsi	", addr.rsi, "\n");
    264 	print("	rdx	", addr.rdx, "\n");
    265 	print("	rcx	", addr.rcx, "\n");
    266 	print("	r8	", addr.r8, "\n");
    267 	print("	r9	", addr.r9, "\n");
    268 	print("	rax	", addr.rax, "\n");
    269 	print("	rbx	", addr.rbx, "\n");
    270 	print("	rbp	", addr.rbp, "\n");
    271 	print("	r10	", addr.r10, "\n");
    272 	print("	r11	", addr.r11, "\n");
    273 	print("	r12	", addr.r12, "\n");
    274 	print("	r13	", addr.r13, "\n");
    275 	print("	r14	", addr.r14, "\n");
    276 	print("	r15	", addr.r15, "\n");
    277 	print("	trapno	", addr.trapno, "\n");
    278 	print("	fs	", addr.fs, "\n");
    279 	print("	gs	", addr.gs, "\n");
    280 	print("	addr	", addr.addr, "\n");
    281 	print("	flags	", addr.flags, "\n");
    282 	print("	es	", addr.es, "\n");
    283 	print("	ds	", addr.ds, "\n");
    284 	print("	err	", addr.err, "\n");
    285 	print("	rip	", addr.rip, "\n");
    286 	print("	cs	", addr.cs, "\n");
    287 	print("	rflags	", addr.rflags, "\n");
    288 	print("	rsp	", addr.rsp, "\n");
    289 	print("	ss	", addr.ss, "\n");
    290 	print("	len	", addr.len, "\n");
    291 	print("	fpformat	", addr.fpformat, "\n");
    292 	print("	ownedfp	", addr.ownedfp, "\n");
    293 	print("	fpstate0	", addr.fpstate0, "\n");
    294 	print("	fsbase	", addr.fsbase, "\n");
    295 	print("	gsbase	", addr.gsbase, "\n");
    296 }
    297 
    298 // aggr Linkdebug
    299 // {
    300 // 	'X' 0 version;
    301 // 	'X' 4 map;
    302 // };
    303 // 
    304 // aggr Linkmap
    305 // {
    306 // 	'X' 0 addr;
    307 // 	'X' 4 name;
    308 // 	'X' 8 dynsect;
    309 // 	'X' 12 next;
    310 // 	'X' 16 prev;
    311 // };
    312 // 
    313 // defn
    314 // linkdebug()
    315 // {
    316 // 	local a;
    317 // 
    318 // 	if !havesymbol("_DYNAMIC") then
    319 // 		return 0;
    320 // 	
    321 // 	a = _DYNAMIC;
    322 // 	while *a != 0 do {
    323 // 		if *a == 21 then // 21 == DT_DEBUG
    324 // 			return *(a+4);
    325 // 		a = a+8;
    326 // 	}
    327 // 	return 0;
    328 // }
    329 // 
    330 // defn
    331 // dynamicmap()
    332 // {
    333 // 	if systype == "linux"  || systype == "freebsd" then {
    334 // 		local r, m, n;
    335 // 	
    336 // 		r = linkdebug();
    337 // 		if r then {
    338 // 			complex Linkdebug r;
    339 // 			m = r.map;
    340 // 			n = 0;
    341 // 			while m != 0 && n < 100 do {
    342 // 				complex Linkmap m;
    343 // 				if m.name && *(m.name\b) && access(*(m.name\s)) then
    344 // 					print("textfile({\"", *(m.name\s), "\", ", m.addr\X, "});\n");
    345 // 				m = m.next;
    346 // 				n = n+1;
    347 // 			}
    348 // 		}
    349 // 	}
    350 // }
    351 // */
    352 
    353 defn
    354 acidmap()
    355 {
    356 //	dynamicmap();
    357 	acidtypes();
    358 }
    359 
    360 print(acidfile);