1*cad5caa8Srin /* $NetBSD: netbsd32_machdep.h,v 1.25 2019/11/27 09:16:58 rin Exp $ */ 281918bf8Sfvdl 381918bf8Sfvdl #ifndef _MACHINE_NETBSD32_H_ 481918bf8Sfvdl #define _MACHINE_NETBSD32_H_ 581918bf8Sfvdl 60deb20a3Sfvdl #include <sys/ucontext.h> 743070602Schs #include <compat/sys/ucontext.h> 894be8205Schs #include <compat/sys/siginfo.h> 90deb20a3Sfvdl 10*cad5caa8Srin #include <x86/fpu.h> 11*cad5caa8Srin 1201cfb8b6Smgorny /* 1301cfb8b6Smgorny * i386 ptrace constants 1401cfb8b6Smgorny * Please keep in sync with sys/arch/i386/include/ptrace.h. 1501cfb8b6Smgorny */ 1601cfb8b6Smgorny #define PT32_STEP (PT_FIRSTMACH + 0) 1701cfb8b6Smgorny #define PT32_GETREGS (PT_FIRSTMACH + 1) 1801cfb8b6Smgorny #define PT32_SETREGS (PT_FIRSTMACH + 2) 1901cfb8b6Smgorny #define PT32_GETFPREGS (PT_FIRSTMACH + 3) 2001cfb8b6Smgorny #define PT32_SETFPREGS (PT_FIRSTMACH + 4) 2101cfb8b6Smgorny #define PT32_GETXMMREGS (PT_FIRSTMACH + 5) 2201cfb8b6Smgorny #define PT32_SETXMMREGS (PT_FIRSTMACH + 6) 2301cfb8b6Smgorny #define PT32_GETDBREGS (PT_FIRSTMACH + 7) 2401cfb8b6Smgorny #define PT32_SETDBREGS (PT_FIRSTMACH + 8) 2501cfb8b6Smgorny #define PT32_SETSTEP (PT_FIRSTMACH + 9) 2601cfb8b6Smgorny #define PT32_CLEARSTEP (PT_FIRSTMACH + 10) 27c2ad96ffSmgorny #define PT32_GETXSTATE (PT_FIRSTMACH + 11) 28c2ad96ffSmgorny #define PT32_SETXSTATE (PT_FIRSTMACH + 12) 2901cfb8b6Smgorny 30803fec88Sdsl #define NETBSD32_POINTER_TYPE uint32_t 31803fec88Sdsl typedef struct { NETBSD32_POINTER_TYPE i32; } netbsd32_pointer_t; 3281918bf8Sfvdl 3306b0a1bdSdsl /* i386 has 32bit aligned 64bit integers */ 3406b0a1bdSdsl #define NETBSD32_INT64_ALIGN __attribute__((__aligned__(4))) 3506b0a1bdSdsl 3681918bf8Sfvdl typedef netbsd32_pointer_t netbsd32_sigcontextp_t; 3781918bf8Sfvdl 3881918bf8Sfvdl struct netbsd32_sigcontext13 { 390deb20a3Sfvdl uint32_t sc_gs; 400deb20a3Sfvdl uint32_t sc_fs; 410deb20a3Sfvdl uint32_t sc_es; 420deb20a3Sfvdl uint32_t sc_ds; 430deb20a3Sfvdl uint32_t sc_edi; 440deb20a3Sfvdl uint32_t sc_esi; 450deb20a3Sfvdl uint32_t sc_ebp; 460deb20a3Sfvdl uint32_t sc_ebx; 470deb20a3Sfvdl uint32_t sc_edx; 480deb20a3Sfvdl uint32_t sc_ecx; 490deb20a3Sfvdl uint32_t sc_eax; 5081918bf8Sfvdl /* XXX */ 510deb20a3Sfvdl uint32_t sc_eip; 520deb20a3Sfvdl uint32_t sc_cs; 530deb20a3Sfvdl uint32_t sc_eflags; 540deb20a3Sfvdl uint32_t sc_esp; 550deb20a3Sfvdl uint32_t sc_ss; 5681918bf8Sfvdl 570deb20a3Sfvdl uint32_t sc_onstack; /* sigstack state to restore */ 580deb20a3Sfvdl uint32_t sc_mask; /* signal mask to restore (old style) */ 5981918bf8Sfvdl 600deb20a3Sfvdl uint32_t sc_trapno; /* XXX should be above */ 610deb20a3Sfvdl uint32_t sc_err; 6281918bf8Sfvdl }; 6381918bf8Sfvdl 6481918bf8Sfvdl struct netbsd32_sigcontext { 650deb20a3Sfvdl uint32_t sc_gs; 660deb20a3Sfvdl uint32_t sc_fs; 670deb20a3Sfvdl uint32_t sc_es; 680deb20a3Sfvdl uint32_t sc_ds; 690deb20a3Sfvdl uint32_t sc_edi; 700deb20a3Sfvdl uint32_t sc_esi; 710deb20a3Sfvdl uint32_t sc_ebp; 720deb20a3Sfvdl uint32_t sc_ebx; 730deb20a3Sfvdl uint32_t sc_edx; 740deb20a3Sfvdl uint32_t sc_ecx; 750deb20a3Sfvdl uint32_t sc_eax; 7681918bf8Sfvdl /* XXX */ 770deb20a3Sfvdl uint32_t sc_eip; 780deb20a3Sfvdl uint32_t sc_cs; 790deb20a3Sfvdl uint32_t sc_eflags; 800deb20a3Sfvdl uint32_t sc_esp; 810deb20a3Sfvdl uint32_t sc_ss; 8281918bf8Sfvdl 830deb20a3Sfvdl uint32_t sc_onstack; /* sigstack state to restore */ 840deb20a3Sfvdl uint32_t __sc_mask13; /* signal mask to restore (old style) */ 8581918bf8Sfvdl 860deb20a3Sfvdl uint32_t sc_trapno; /* XXX should be above */ 870deb20a3Sfvdl uint32_t sc_err; 8881918bf8Sfvdl 8981918bf8Sfvdl sigset_t sc_mask; /* signal mask to restore (new style) */ 9081918bf8Sfvdl }; 9181918bf8Sfvdl 9281918bf8Sfvdl #define sc_sp sc_esp 9381918bf8Sfvdl #define sc_fp sc_ebp 9481918bf8Sfvdl #define sc_pc sc_eip 9581918bf8Sfvdl #define sc_ps sc_eflags 9681918bf8Sfvdl 970deb20a3Sfvdl struct netbsd32_sigframe_sigcontext { 9881918bf8Sfvdl uint32_t sf_ra; 990deb20a3Sfvdl int32_t sf_signum; 1000deb20a3Sfvdl int32_t sf_code; 10181918bf8Sfvdl uint32_t sf_scp; 10281918bf8Sfvdl struct netbsd32_sigcontext sf_sc; 10381918bf8Sfvdl }; 10481918bf8Sfvdl 1050deb20a3Sfvdl struct netbsd32_sigframe_siginfo { 1060deb20a3Sfvdl uint32_t sf_ra; 1070deb20a3Sfvdl int32_t sf_signum; 1080deb20a3Sfvdl uint32_t sf_sip; 1090deb20a3Sfvdl uint32_t sf_ucp; 1100deb20a3Sfvdl siginfo32_t sf_si; 1110deb20a3Sfvdl ucontext32_t sf_uc; 1120deb20a3Sfvdl }; 1130deb20a3Sfvdl 11481918bf8Sfvdl struct reg32 { 11581918bf8Sfvdl int r_eax; 11681918bf8Sfvdl int r_ecx; 11781918bf8Sfvdl int r_edx; 11881918bf8Sfvdl int r_ebx; 11981918bf8Sfvdl int r_esp; 12081918bf8Sfvdl int r_ebp; 12181918bf8Sfvdl int r_esi; 12281918bf8Sfvdl int r_edi; 12381918bf8Sfvdl int r_eip; 12481918bf8Sfvdl int r_eflags; 12581918bf8Sfvdl int r_cs; 12681918bf8Sfvdl int r_ss; 12781918bf8Sfvdl int r_ds; 12881918bf8Sfvdl int r_es; 12981918bf8Sfvdl int r_fs; 13081918bf8Sfvdl int r_gs; 13181918bf8Sfvdl }; 13281918bf8Sfvdl 13381918bf8Sfvdl struct fpreg32 { 13481918bf8Sfvdl char __data[108]; 13581918bf8Sfvdl }; 13681918bf8Sfvdl 137988eb7edSkamil struct dbreg32 { 138988eb7edSkamil int dr[8]; 139988eb7edSkamil }; 140988eb7edSkamil 141*cad5caa8Srin struct xmmregs32 { 142*cad5caa8Srin struct fxsave fxstate; 143*cad5caa8Srin }; 144*cad5caa8Srin __CTASSERT(sizeof(struct xmmregs32) == 512); 145*cad5caa8Srin 14654f03c77Smaxv struct x86_get_ldt_args32 { 14754f03c77Smaxv int32_t start; 14854f03c77Smaxv uint32_t desc; 14954f03c77Smaxv int32_t num; 15054f03c77Smaxv }; 15154f03c77Smaxv 15254f03c77Smaxv struct x86_set_ldt_args32 { 15354f03c77Smaxv int32_t start; 15454f03c77Smaxv uint32_t desc; 15554f03c77Smaxv int32_t num; 15654f03c77Smaxv }; 15754f03c77Smaxv 15881918bf8Sfvdl struct mtrr32 { 15981918bf8Sfvdl uint64_t base; 16081918bf8Sfvdl uint64_t len; 16181918bf8Sfvdl uint8_t type; 16281918bf8Sfvdl uint8_t __pad0[3]; 16381918bf8Sfvdl int flags; 16481918bf8Sfvdl uint32_t owner; 165b6a2ef75Sperry } __packed; 16681918bf8Sfvdl 16781918bf8Sfvdl struct x86_64_get_mtrr_args32 { 16881918bf8Sfvdl uint32_t mtrrp; 16981918bf8Sfvdl uint32_t n; 17081918bf8Sfvdl }; 17181918bf8Sfvdl 17281918bf8Sfvdl struct x86_64_set_mtrr_args32 { 17381918bf8Sfvdl uint32_t mtrrp; 17481918bf8Sfvdl uint32_t n; 17581918bf8Sfvdl }; 17681918bf8Sfvdl 177289fa680Sdrochner #define NETBSD32_MID_MACHINE MID_I386 178289fa680Sdrochner 17901cfb8b6Smgorny /* Translate ptrace() PT_* request from 32-bit userland to kernel. */ 18001cfb8b6Smgorny int netbsd32_ptrace_translate_request(int); 18101cfb8b6Smgorny 182209be910Scube int netbsd32_process_read_regs(struct lwp *, struct reg32 *); 18395739e63Sdsl int netbsd32_process_read_fpregs(struct lwp *, struct fpreg32 *, size_t *); 184988eb7edSkamil int netbsd32_process_read_dbregs(struct lwp *, struct dbreg32 *, size_t *); 185209be910Scube 186f2ef31cbSskrll int netbsd32_process_write_regs(struct lwp *, const struct reg32 *); 187f2ef31cbSskrll int netbsd32_process_write_fpregs(struct lwp *, const struct fpreg32 *, size_t); 188988eb7edSkamil int netbsd32_process_write_dbregs(struct lwp *, const struct dbreg32 *, size_t); 189f2ef31cbSskrll 19081918bf8Sfvdl #endif /* _MACHINE_NETBSD32_H_ */ 191