. add cpufeature detection of both . use it for both ipc and kernelcall traps, using a register for call number . SYSENTER/SYSCALL does not save any context, therefore userland has to save it . to accomodate multiple kernel entry/exit types, the entry type is recorded in the process struct. hitherto all types were interrupt (soft int, exception, hard int); now SYSENTER/SYSCALL is new, with the difference that context is not fully restored from proc struct when running the process again. this can't be done as some information is missing. . complication: cases in which the kernel has to fully change process context (i.e. sigreturn). in that case the exit type is changed from SYSENTER/SYSEXIT to soft-int (i.e. iret) and context is fully restored from the proc struct. this does mean the PC and SP must change, as the sysenter/sysexit userland code will otherwise try to restore its own context. this is true in the sigreturn case. . override all usage by setting libc_ipc=1
52 lines
1.1 KiB
C
52 lines
1.1 KiB
C
|
|
#ifndef _I386_TYPES_H
|
|
#define _I386_TYPES_H
|
|
|
|
#include <minix/sys_config.h>
|
|
#include <machine/stackframe.h>
|
|
#include <machine/fpu.h>
|
|
#include <sys/cdefs.h>
|
|
|
|
struct segdesc_s { /* segment descriptor for protected mode */
|
|
u16_t limit_low;
|
|
u16_t base_low;
|
|
u8_t base_middle;
|
|
u8_t access; /* |P|DL|1|X|E|R|A| */
|
|
u8_t granularity; /* |G|X|0|A|LIMT| */
|
|
u8_t base_high;
|
|
} __attribute__((packed));
|
|
|
|
struct gatedesc_s {
|
|
u16_t offset_low;
|
|
u16_t selector;
|
|
u8_t pad; /* |000|XXXXX| ig & trpg, |XXXXXXXX| task g */
|
|
u8_t p_dpl_type; /* |P|DL|0|TYPE| */
|
|
u16_t offset_high;
|
|
} __attribute__((packed));
|
|
|
|
struct desctableptr_s {
|
|
u16_t limit;
|
|
u32_t base;
|
|
} __attribute__((packed));
|
|
|
|
typedef struct segframe {
|
|
reg_t p_cr3; /* page table root */
|
|
u32_t *p_cr3_v;
|
|
char *fpu_state;
|
|
int p_kern_trap_style;
|
|
} segframe_t;
|
|
|
|
struct cpu_info {
|
|
u8_t vendor;
|
|
u8_t family;
|
|
u8_t model;
|
|
u8_t stepping;
|
|
u32_t freq; /* in MHz */
|
|
u32_t flags[2];
|
|
};
|
|
|
|
typedef u32_t atomic_t; /* access to an aligned 32bit value is atomic on i386 */
|
|
|
|
#endif /* #ifndef _I386_TYPES_H */
|
|
|