diff options
author | peter <peter@FreeBSD.org> | 2003-05-01 01:05:25 +0000 |
---|---|---|
committer | peter <peter@FreeBSD.org> | 2003-05-01 01:05:25 +0000 |
commit | 45949ccde13fb04ed597a5aef80b678ba16bcab7 (patch) | |
tree | dd665cefeba0e426ad2b212b76851de96f1ad18b /sys/amd64/include/ucontext.h | |
parent | 1fd7bc609e9a5249f7b7b558405e1c39aca79796 (diff) | |
download | FreeBSD-src-45949ccde13fb04ed597a5aef80b678ba16bcab7.zip FreeBSD-src-45949ccde13fb04ed597a5aef80b678ba16bcab7.tar.gz |
Commit MD parts of a loosely functional AMD64 port. This is based on
a heavily stripped down FreeBSD/i386 (brutally stripped down actually) to
attempt to get a stable base to start from. There is a lot missing still.
Worth noting:
- The kernel runs at 1GB in order to cheat with the pmap code. pmap uses
a variation of the PAE code in order to avoid having to worry about 4
levels of page tables yet.
- It boots in 64 bit "long mode" with a tiny trampoline embedded in the
i386 loader. This simplifies locore.s greatly.
- There are still quite a few fragments of i386-specific code that have
not been translated yet, and some that I cheated and wrote dumb C
versions of (bcopy etc).
- It has both int 0x80 for syscalls (but using registers for argument
passing, as is native on the amd64 ABI), and the 'syscall' instruction
for syscalls. int 0x80 preserves all registers, 'syscall' does not.
- I have tried to minimize looking at the NetBSD code, except in a couple
of places (eg: to find which register they use to replace the trashed
%rcx register in the syscall instruction). As a result, there is not a
lot of similarity. I did look at NetBSD a few times while debugging to
get some ideas about what I might have done wrong in my first attempt.
Diffstat (limited to 'sys/amd64/include/ucontext.h')
-rw-r--r-- | sys/amd64/include/ucontext.h | 83 |
1 files changed, 29 insertions, 54 deletions
diff --git a/sys/amd64/include/ucontext.h b/sys/amd64/include/ucontext.h index ec3e0ee..1938707 100644 --- a/sys/amd64/include/ucontext.h +++ b/sys/amd64/include/ucontext.h @@ -37,69 +37,44 @@ typedef struct __mcontext { * sigcontext. So that we can support sigcontext * and ucontext_t at the same time. */ - int mc_onstack; /* XXX - sigcontext compat. */ - int mc_gs; /* machine state (struct trapframe) */ - int mc_fs; - int mc_es; - int mc_ds; - int mc_edi; - int mc_esi; - int mc_ebp; - int mc_isp; - int mc_ebx; - int mc_edx; - int mc_ecx; - int mc_eax; - int mc_trapno; - int mc_err; - int mc_eip; - int mc_cs; - int mc_eflags; - int mc_esp; - int mc_ss; + register_t mc_onstack; /* XXX - sigcontext compat. */ + register_t mc_r15; /* machine state (struct trapframe) */ + register_t mc_r14; + register_t mc_r13; + register_t mc_r12; + register_t mc_r11; + register_t mc_r10; + register_t mc_r9; + register_t mc_r8; + register_t mc_rdi; + register_t mc_rsi; + register_t mc_rbp; + register_t mc_rbx; + register_t mc_rdx; + register_t mc_rcx; + register_t mc_rax; + register_t mc_trapno; + register_t mc_err; + register_t mc_rip; + register_t mc_cs; + register_t mc_rflags; + register_t mc_rsp; + register_t mc_ss; - int mc_len; /* sizeof(mcontext_t) */ + long mc_len; /* sizeof(mcontext_t) */ #define _MC_FPFMT_NODEV 0x10000 /* device not present or configured */ -#define _MC_FPFMT_387 0x10001 #define _MC_FPFMT_XMM 0x10002 - int mc_fpformat; + long mc_fpformat; #define _MC_FPOWNED_NONE 0x20000 /* FP state not used */ #define _MC_FPOWNED_FPU 0x20001 /* FP state came from FPU */ #define _MC_FPOWNED_PCB 0x20002 /* FP state came from PCB */ - int mc_ownedfp; - int mc_spare1[1]; /* align next field to 16 bytes */ + long mc_ownedfp; + long mc_spare1[1]; /* align next field to 16 bytes */ /* * See <machine/npx.h> for the internals of mc_fpstate[]. */ - int mc_fpstate[128] __aligned(16); - int mc_spare2[8]; + long mc_fpstate[128] __aligned(16); + long mc_spare2[8]; } mcontext_t; -#if defined(_KERNEL) && defined(COMPAT_FREEBSD4) -struct mcontext4 { - int mc_onstack; /* XXX - sigcontext compat. */ - int mc_gs; /* machine state (struct trapframe) */ - int mc_fs; - int mc_es; - int mc_ds; - int mc_edi; - int mc_esi; - int mc_ebp; - int mc_isp; - int mc_ebx; - int mc_edx; - int mc_ecx; - int mc_eax; - int mc_trapno; - int mc_err; - int mc_eip; - int mc_cs; - int mc_eflags; - int mc_esp; /* machine state */ - int mc_ss; - int mc_fpregs[28]; /* env87 + fpacc87 + u_long */ - int __spare__[17]; -}; -#endif - #endif /* !_MACHINE_UCONTEXT_H_ */ |