summaryrefslogtreecommitdiffstats
path: root/sys/amd64/include/pcb.h
diff options
context:
space:
mode:
authorjkim <jkim@FreeBSD.org>2010-08-02 17:35:00 +0000
committerjkim <jkim@FreeBSD.org>2010-08-02 17:35:00 +0000
commit79a57d111a564cdef116d6cf2c34b1842377129d (patch)
treeac5b6c35aff67637e32c04209fa5f534aa1806b7 /sys/amd64/include/pcb.h
parent0a86131c629fc0f57598850ae76df2002f261b3e (diff)
downloadFreeBSD-src-79a57d111a564cdef116d6cf2c34b1842377129d.zip
FreeBSD-src-79a57d111a564cdef116d6cf2c34b1842377129d.tar.gz
- Merge savectx2() with savectx() and struct xpcb with struct pcb. [1]
savectx() is only used for panic dump (dumppcb) and kdb (stoppcbs). Thus, saving additional information does not hurt and it may be even beneficial. Unfortunately, struct pcb has grown larger to accommodate more data. Move 512-byte long pcb_user_save to the end of struct pcb while I am here. - savectx() now saves FPU state unconditionally and copy it to the PCB of FPU thread if necessary. This gives panic dump and kdb a chance to take a look at the current FPU state even if the FPU is "supposedly" not used. - Resuming CPU now unconditionally reinitializes FPU. If the saved FPU state was irrelevant, it could be in an unknown state. Suggested by: bde [1]
Diffstat (limited to 'sys/amd64/include/pcb.h')
-rw-r--r--sys/amd64/include/pcb.h41
1 files changed, 19 insertions, 22 deletions
diff --git a/sys/amd64/include/pcb.h b/sys/amd64/include/pcb.h
index aead8b7..4cc0240 100644
--- a/sys/amd64/include/pcb.h
+++ b/sys/amd64/include/pcb.h
@@ -44,7 +44,6 @@
#include <machine/segments.h>
struct pcb {
- register_t pcb_cr3;
register_t pcb_r15;
register_t pcb_r14;
register_t pcb_r13;
@@ -55,6 +54,7 @@ struct pcb {
register_t pcb_rip;
register_t pcb_fsbase;
register_t pcb_gsbase;
+ register_t pcb_kgsbase;
u_long pcb_flags;
#define PCB_DBREGS 0x02 /* process using debug registers */
#define PCB_KERNFPU 0x04 /* kernel uses fpu */
@@ -64,44 +64,41 @@ struct pcb {
#define PCB_32BIT 0x40 /* process has 32 bit context (segs etc) */
#define PCB_FULLCTX 0x80 /* full context restore on sysret */
- 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;
+ register_t pcb_cr0;
+ register_t pcb_cr2;
+ register_t pcb_cr3;
+ register_t pcb_cr4;
+ register_t pcb_dr0;
+ register_t pcb_dr1;
+ register_t pcb_dr2;
+ register_t pcb_dr3;
+ register_t pcb_dr6;
+ register_t pcb_dr7;
- struct savefpu pcb_user_save;
uint16_t pcb_initial_fpucw;
caddr_t pcb_onfault; /* copyin/out fault recovery */
/* 32-bit segment descriptor */
- struct user_segment_descriptor pcb_gs32sd;
+ struct user_segment_descriptor pcb_gs32sd;
/* local tss, with i/o bitmap; NULL for common */
struct amd64tss *pcb_tssp;
struct savefpu *pcb_save;
char pcb_full_iret;
-};
-struct xpcb {
- struct pcb xpcb_pcb;
- register_t xpcb_cr0;
- register_t xpcb_cr2;
- register_t xpcb_cr4;
- register_t xpcb_kgsbase;
- struct region_descriptor xpcb_gdt;
- struct region_descriptor xpcb_idt;
- struct region_descriptor xpcb_ldt;
- uint16_t xpcb_tr;
+ struct region_descriptor pcb_gdt;
+ struct region_descriptor pcb_idt;
+ struct region_descriptor pcb_ldt;
+ uint16_t pcb_tr;
+
+ struct savefpu pcb_user_save;
};
#ifdef _KERNEL
struct trapframe;
void makectx(struct trapframe *, struct pcb *);
-void savectx(struct pcb *);
-int savectx2(struct xpcb *);
+int savectx(struct pcb *);
#endif
#endif /* _AMD64_PCB_H_ */
OpenPOWER on IntegriCloud