Index: kgdb/trgt_amd64.c =================================================================== --- kgdb/trgt_amd64.c (revision 205167) +++ kgdb/trgt_amd64.c (working copy) @@ -28,8 +28,10 @@ __FBSDID("$FreeBSD$"); #include +#ifndef CROSS_DEBUGGER #include #include +#endif #include #include #include @@ -44,6 +46,123 @@ #include "kgdb.h" +#ifdef CROSS_DEBUGGER +#define register_t uint64_t + +struct trapframe { + register_t tf_rdi; + register_t tf_rsi; + register_t tf_rdx; + register_t tf_rcx; + register_t tf_r8; + register_t tf_r9; + register_t tf_rax; + register_t tf_rbx; + register_t tf_rbp; + register_t tf_r10; + register_t tf_r11; + register_t tf_r12; + register_t tf_r13; + register_t tf_r14; + register_t tf_r15; + register_t tf_trapno; + register_t tf_addr; + register_t tf_flags; + /* below portion defined in hardware */ + register_t tf_err; + register_t tf_rip; + register_t tf_cs; + register_t tf_rflags; + register_t tf_rsp; + register_t tf_ss; +}; + +/* Contents of each x87 floating point accumulator */ +struct fpacc87 { + u_char fp_bytes[10]; +}; + +/* Contents of each SSE extended accumulator */ +struct xmmacc { + u_char xmm_bytes[16]; +}; + +struct envxmm { + u_int16_t en_cw; /* control word (16bits) */ + u_int16_t en_sw; /* status word (16bits) */ + u_int8_t en_tw; /* tag word (8bits) */ + u_int8_t en_zero; + u_int16_t en_opcode; /* opcode last executed (11 bits ) */ + u_int64_t en_rip; /* floating point instruction pointer */ + u_int64_t en_rdp; /* floating operand pointer */ + u_int32_t en_mxcsr; /* SSE sontorol/status register */ + u_int32_t en_mxcsr_mask; /* valid bits in mxcsr */ +}; + +struct savefpu { + struct envxmm sv_env; + struct { + struct fpacc87 fp_acc; + u_char fp_pad[6]; /* padding */ + } sv_fp[8]; + struct xmmacc sv_xmm[16]; + u_char sv_pad[96]; +} __aligned(16); + +struct user_segment_descriptor { + u_int64_t sd_lolimit:16; /* segment extent (lsb) */ + u_int64_t sd_lobase:24; /* segment base address (lsb) */ + u_int64_t sd_type:5; /* segment type */ + u_int64_t sd_dpl:2; /* segment descriptor priority level */ + u_int64_t sd_p:1; /* segment descriptor present */ + u_int64_t sd_hilimit:4; /* segment extent (msb) */ + u_int64_t sd_xx:1; /* unused */ + u_int64_t sd_long:1; /* long mode (cs only) */ + u_int64_t sd_def32:1; /* default 32 vs 16 bit size */ + u_int64_t sd_gran:1; /* limit granularity (byte/page units)*/ + u_int64_t sd_hibase:8; /* segment base address (msb) */ +} __packed; + +struct pcb { + register_t pcb_cr3; + register_t pcb_r15; + register_t pcb_r14; + register_t pcb_r13; + register_t pcb_r12; + register_t pcb_rbp; + register_t pcb_rsp; + register_t pcb_rbx; + register_t pcb_rip; + register_t pcb_fsbase; + register_t pcb_gsbase; + uint64_t pcb_flags; +#define PCB_DBREGS 0x02 /* process using debug registers */ +#define PCB_FPUINITDONE 0x08 /* fpu state is initialized */ +#define PCB_GS32BIT 0x20 /* linux gs switch */ +#define PCB_32BIT 0x40 /* process has 32 bit context (segs etc) */ +#define PCB_FULLCTX 0x80 /* full context restore on sysret */ + + u_int32_t pcb_ds; + u_int32_t pcb_es; + u_int32_t pcb_fs; + u_int32_t pcb_gs; + u_int64_t pcb_dr0; + u_int64_t pcb_dr1; + u_int64_t pcb_dr2; + u_int64_t pcb_dr3; + u_int64_t pcb_dr6; + u_int64_t pcb_dr7; + + struct savefpu pcb_save; + uint16_t pcb_initial_fpucw; + + caddr_t pcb_onfault; /* copyin/out fault recovery */ + + /* 32-bit segment descriptor */ + struct user_segment_descriptor pcb_gs32sd; +}; +#endif + void kgdb_trgt_fetch_registers(int regno __unused) {