summaryrefslogtreecommitdiff
path: root/usr/src/uts/intel/sys
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/intel/sys')
-rw-r--r--usr/src/uts/intel/sys/Makefile4
-rw-r--r--usr/src/uts/intel/sys/archsystm.h53
-rw-r--r--usr/src/uts/intel/sys/bootconf.h20
-rw-r--r--usr/src/uts/intel/sys/bootinfo.h99
-rw-r--r--usr/src/uts/intel/sys/controlregs.h58
-rw-r--r--usr/src/uts/intel/sys/fp.h23
-rw-r--r--usr/src/uts/intel/sys/immu.h55
-rw-r--r--usr/src/uts/intel/sys/kdi_machimpl.h103
-rw-r--r--usr/src/uts/intel/sys/kdi_regs.h135
-rw-r--r--usr/src/uts/intel/sys/mmu.h38
-rw-r--r--usr/src/uts/intel/sys/pmem.h84
-rw-r--r--usr/src/uts/intel/sys/segments.h98
-rw-r--r--usr/src/uts/intel/sys/x86_archext.h78
13 files changed, 626 insertions, 222 deletions
diff --git a/usr/src/uts/intel/sys/Makefile b/usr/src/uts/intel/sys/Makefile
index 491f4d3224..655ec9b54f 100644
--- a/usr/src/uts/intel/sys/Makefile
+++ b/usr/src/uts/intel/sys/Makefile
@@ -46,10 +46,10 @@ HDRS = \
fasttrap_isa.h \
fp.h \
frame.h \
- immu.h \
inline.h \
kd.h \
kdi_machimpl.h \
+ kdi_regs.h \
machelf.h \
machlock.h \
machsig.h \
@@ -61,11 +61,11 @@ HDRS = \
memtest.h \
mii.h \
miipriv.h \
- mmu.h \
mutex_impl.h \
obpdefs.h \
old_procfs.h \
pcb.h \
+ pmem.h \
privregs.h \
procfs_isa.h \
prom_emul.h \
diff --git a/usr/src/uts/intel/sys/archsystm.h b/usr/src/uts/intel/sys/archsystm.h
index 1eed79d0ae..f6665f6565 100644
--- a/usr/src/uts/intel/sys/archsystm.h
+++ b/usr/src/uts/intel/sys/archsystm.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -51,14 +51,22 @@ extern ulong_t getcr2(void);
#if defined(__i386)
extern uint16_t getgs(void);
extern void setgs(uint16_t);
+
+extern void patch_sse(void);
+extern void patch_sse2(void);
#endif
+extern void cli(void);
extern void sti(void);
extern void tenmicrosec(void);
-extern void restore_int_flag(int);
-extern int clear_int_flag(void);
+extern void restore_int_flag(ulong_t);
+extern void intr_restore(ulong_t);
+extern ulong_t clear_int_flag(void);
+extern ulong_t intr_clear(void);
+extern ulong_t getflags(void);
+extern int interrupts_enabled(void);
extern void int3(void);
extern void int18(void);
@@ -72,6 +80,7 @@ extern void sys_syscall_int();
extern void brand_sys_syscall();
extern void brand_sys_syscall32();
extern void brand_sys_syscall_int();
+extern int update_sregs();
#elif defined(__i386)
extern void sys_call();
extern void brand_sys_call();
@@ -85,10 +94,8 @@ extern void dosyscall(void);
extern void bind_hwcap(void);
-extern uint8_t inb(int port);
extern uint16_t inw(int port);
extern uint32_t inl(int port);
-extern void outb(int port, uint8_t value);
extern void outw(int port, uint16_t value);
extern void outl(int port, uint32_t value);
@@ -134,34 +141,52 @@ extern uint_t cpu_hwcap_flags;
extern uint_t cpu_freq;
extern uint64_t cpu_freq_hz;
+extern int use_sse_pagecopy;
+extern int use_sse_pagezero;
+extern int use_sse_copy;
+
extern caddr_t i86devmap(pfn_t, pgcnt_t, uint_t);
extern page_t *page_numtopp_alloc(pfn_t pfnum);
extern void hwblkclr(void *, size_t);
extern void hwblkpagecopy(const void *, void *);
+extern void page_copy_no_xmm(void *dst, void *src);
+extern void block_zero_no_xmm(void *dst, int len);
+#define BLOCKZEROALIGN (4 * sizeof (void *))
extern void (*kcpc_hw_enable_cpc_intr)(void);
-extern void setup_mca(void);
-extern void setup_mtrr(void);
extern void patch_tsc(void);
+extern void init_desctbls(void);
extern user_desc_t *cpu_get_gdt(void);
-/*
- * Warning: these routines do -not- use normal calling conventions!
- */
-extern void setup_121_andcall(void (*)(ulong_t), ulong_t);
-extern void enable_big_page_support(ulong_t);
-extern void enable_pae(ulong_t);
-
+extern void switch_sp_and_call(void *, void (*)(uint_t, uint_t), uint_t,
+ uint_t);
extern hrtime_t (*gethrtimef)(void);
extern hrtime_t (*gethrtimeunscaledf)(void);
extern void (*scalehrtimef)(hrtime_t *);
extern void (*gethrestimef)(timestruc_t *);
+extern void av_dispatch_softvect(uint_t);
+extern void av_dispatch_autovect(uint_t);
+extern uint_t atomic_btr32(uint32_t *, uint_t);
+extern uint_t bsrw_insn(uint16_t);
+extern int sys_rtt_common(struct regs *);
+extern void fakesoftint(void);
+
+
+extern void setup_mca(void);
+extern void setup_mtrr(void);
+#define cpr_dprintf prom_printf
+
#endif /* _KERNEL */
+#if defined(_KERNEL) || defined(_BOOT)
+extern uint8_t inb(int port);
+extern void outb(int port, uint8_t value);
+#endif
+
#ifdef __cplusplus
}
#endif
diff --git a/usr/src/uts/intel/sys/bootconf.h b/usr/src/uts/intel/sys/bootconf.h
index 2e1ccbf326..0cde010b88 100644
--- a/usr/src/uts/intel/sys/bootconf.h
+++ b/usr/src/uts/intel/sys/bootconf.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -219,11 +219,29 @@ extern int netboot;
extern int swaploaded;
extern int modrootloaded;
extern char kern_bootargs[];
+extern char *kobj_module_path;
extern char *default_path;
extern char *dhcack;
extern int dhcacklen;
extern char *netdev_path;
+extern void bop_no_more_mem(void);
+
+/*PRINTFLIKE2*/
+extern void bop_printf(struct bootops *, char *, ...)
+ __KPRINTFLIKE(2);
+/*PRINTFLIKE1*/
+extern void bop_panic(char *, ...)
+ __KPRINTFLIKE(1);
+extern void boot_prop_finish(void);
+
+/*
+ * Back door to fakebop.c to get physical memory allocated.
+ * 64 bit data types are fixed for 32 bit PAE use.
+ */
+extern paddr_t do_bop_phys_alloc(uint64_t, uint64_t);
+
+
#endif /* _KERNEL && !_BOOT */
#ifdef __cplusplus
diff --git a/usr/src/uts/intel/sys/bootinfo.h b/usr/src/uts/intel/sys/bootinfo.h
new file mode 100644
index 0000000000..6c25d8bcab
--- /dev/null
+++ b/usr/src/uts/intel/sys/bootinfo.h
@@ -0,0 +1,99 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_BOOTINFO_H
+#define _SYS_BOOTINFO_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * The 32-bit kernel loader code needs to build several structures that the
+ * kernel is expecting. They will contain native sized pointers for the
+ * target kernel.
+ */
+
+#if defined(_BOOT_TARGET_amd64)
+
+typedef uint64_t native_ptr_t;
+
+#elif defined(_BOOT_TARGET_i386)
+
+typedef uint32_t native_ptr_t;
+
+#elif defined(_KERNEL)
+
+typedef void *native_ptr_t;
+
+#endif
+
+struct boot_memlist {
+ uint64_t addr;
+ uint64_t size;
+ native_ptr_t next;
+ native_ptr_t prev;
+};
+
+/*
+ * The kernel needs to know how to find its modules.
+ */
+struct boot_modules {
+ native_ptr_t bm_addr;
+ uint32_t bm_size;
+ uint32_t bm_padding;
+};
+
+/*
+ *
+ */
+#pragma pack(1)
+struct xboot_info {
+ uint64_t bi_next_paddr; /* next physical address not used */
+ native_ptr_t bi_next_vaddr; /* next virtual address not used */
+ native_ptr_t bi_cmdline;
+ native_ptr_t bi_phys_install;
+ native_ptr_t bi_modules;
+ uint32_t bi_module_cnt;
+ uint32_t bi_use_largepage; /* MMU uses large pages */
+ uint32_t bi_use_pae; /* MMU uses PAE mode (8 byte PTES) */
+ uint32_t bi_use_nx; /* MMU uses NX bit in PTEs */
+ uint32_t bi_use_pge; /* MMU uses Page Global Enable */
+ native_ptr_t bi_pt_window;
+ native_ptr_t bi_pte_to_pt_window;
+ native_ptr_t bi_kseg_size; /* size used for kernel nucleus pages */
+ uint64_t bi_top_page_table;
+ native_ptr_t bi_mb_info;
+};
+#pragma pack()
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_BOOTINFO_H */
diff --git a/usr/src/uts/intel/sys/controlregs.h b/usr/src/uts/intel/sys/controlregs.h
index cea4e712d9..385a89fe07 100644
--- a/usr/src/uts/intel/sys/controlregs.h
+++ b/usr/src/uts/intel/sys/controlregs.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -66,6 +66,26 @@ extern "C" {
#define FMT_CR0 \
"\20\40pg\37cd\36nw\35am\21wp\6ne\5et\4ts\3em\2mp\1pe"
+/*
+ * Set the FPU-related control bits to explain to the processor that
+ * we're managing FPU state:
+ * - set monitor coprocessor (allow TS bit to control FPU)
+ * - set numeric exception (disable IGNNE# mechanism)
+ * - set task switch (#nm on first fp instruction)
+ * - clear emulate math bit (cause we're not emulating!)
+ */
+#define CR0_ENABLE_FPU_FLAGS(cr) \
+ (((cr) | CR0_MP | CR0_NE | CR0_TS) & (uint32_t)~CR0_EM)
+
+/*
+ * Set the FPU-related control bits to explain to the processor that
+ * we're -not- managing FPU state:
+ * - set emulate (all fp instructions cause #nm)
+ * - clear monitor coprocessor (so fwait/wait doesn't #nm)
+ */
+#define CR0_DISABLE_FPU_FLAGS(cr) \
+ (((cr) | CR0_EM) & (uint32_t)~CR0_MP)
+
/* CR3 Register */
#define CR3_PCD 0x00000010 /* cache disable */
@@ -86,9 +106,28 @@ extern "C" {
#define CR4_PCE 0x0100 /* perf-monitoring counter enable */
#define CR4_OSFXSR 0x0200 /* OS fxsave/fxrstor support */
#define CR4_OSXMMEXCPT 0x0400 /* OS unmasked exception support */
+ /* 0x0800 reserved */
+ /* 0x1000 reserved */
+#define CR4_VMXE 0x2000
+#define CR4_SMXE 0x4000
-#define FMT_CR4 \
- "\20\13xmme\12fxsr\11pce\10pge\7mce\6pae\5pse\4de\3tsd\2pvi\1vme"
+#define FMT_CR4 \
+ "\20\17smxe\16vmxe\13xmme\12fxsr\11pce\10pge" \
+ "\7mce\6pae\5pse\4de\3tsd\2pvi\1vme"
+
+/*
+ * Enable the SSE-related control bits to explain to the processor that
+ * we're managing XMM state and exceptions
+ */
+#define CR4_ENABLE_SSE_FLAGS(cr) \
+ ((cr) | CR4_OSFXSR | CR4_OSXMMEXCPT)
+
+/*
+ * Disable the SSE-related control bits to explain to the processor
+ * that we're NOT managing XMM state
+ */
+#define CR4_DISABLE_SSE_FLAGS(cr) \
+ ((cr) & ~(uint32_t)(CR4_OSFXSR | CR4_OSXMMEXCPT))
/* Intel's SYSENTER configuration registers */
@@ -100,13 +139,15 @@ extern "C" {
#define MSR_AMD_EFER 0xc0000080 /* extended feature enable MSR */
-#define AMD_EFER_NXE 0x800 /* no-execute enable */
-#define AMD_EFER_LMA 0x400 /* long mode active (read-only) */
-#define AMD_EFER_LME 0x100 /* long mode enable */
-#define AMD_EFER_SCE 0x001 /* system call extensions */
+#define AMD_EFER_FFXSR 0x4000 /* fast fxsave/fxrstor */
+#define AMD_EFER_SVME 0x1000 /* svm enable */
+#define AMD_EFER_NXE 0x0800 /* no-execute enable */
+#define AMD_EFER_LMA 0x0400 /* long mode active (read-only) */
+#define AMD_EFER_LME 0x0100 /* long mode enable */
+#define AMD_EFER_SCE 0x0001 /* system call extensions */
#define FMT_AMD_EFER \
- "\20\14nxe\13lma\11lme\1sce"
+ "\20\17ffxsr\15svme\14nxe\13lma\11lme\1sce"
/* AMD's SYSCFG register */
@@ -132,6 +173,7 @@ extern "C" {
#define MSR_AMD_FSBASE 0xc0000100 /* 64-bit base address for %fs */
#define MSR_AMD_GSBASE 0xc0000101 /* 64-bit base address for %gs */
#define MSR_AMD_KGSBASE 0xc0000102 /* swapgs swaps this with gsbase */
+#define MSR_AMD_TSCAUX 0xc0000103 /* %ecx value on rdtscp insn */
/* AMD's configuration MSRs, weakly documented in the revision guide */
diff --git a/usr/src/uts/intel/sys/fp.h b/usr/src/uts/intel/sys/fp.h
index 133499a3ae..02fb34fc65 100644
--- a/usr/src/uts/intel/sys/fp.h
+++ b/usr/src/uts/intel/sys/fp.h
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -20,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -97,7 +96,7 @@ extern "C" {
*/
#define FPS_IE 0x00000001 /* invalid operation */
#define FPS_DE 0x00000002 /* denormalized operand */
-#define FPS_ZE 0x00000004 /* zero devide */
+#define FPS_ZE 0x00000004 /* zero divide */
#define FPS_OE 0x00000008 /* overflow */
#define FPS_UE 0x00000010 /* underflow */
#define FPS_PE 0x00000020 /* precision */
@@ -164,14 +163,22 @@ extern int fpu_exists; /* FPU hw exists */
#ifdef _KERNEL
+extern int fpu_ignored;
+extern int fpu_pentium_fdivbug;
+
extern uint32_t sse_mxcsr_mask;
extern void fpu_probe(void);
+extern uint_t fpu_initial_probe(void);
+extern int fpu_probe_pentium_fdivbug(void);
-extern void fpnsave_begin(void *);
-extern void fpxsave_begin(void *);
-extern void (*fpsave_begin)(void *);
+extern void fpnsave_ctxt(void *);
+extern void fpxsave_ctxt(void *);
+extern void (*fpsave_ctxt)(void *);
+struct fnsave_state;
+struct fxsave_state;
+extern void fxsave_insn(struct fxsave_state *);
extern void fpsave(struct fnsave_state *);
extern void fprestore(struct fnsave_state *);
extern void fpxsave(struct fxsave_state *);
diff --git a/usr/src/uts/intel/sys/immu.h b/usr/src/uts/intel/sys/immu.h
deleted file mode 100644
index ac9af15bf6..0000000000
--- a/usr/src/uts/intel/sys/immu.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright (c) 1990-1997,1999 by Sun Microsystems, Inc.
- * All rights reserved.
- */
-
-#ifndef _SYS_IMMU_H
-#define _SYS_IMMU_H
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * XXX - following stuff from 3b2 immu.h. this really belongs elsewhere.
- */
-
-/*
- * The following variables describe the memory managed by
- * the kernel. This includes all memory above the kernel
- * itself.
- */
-
-extern pgcnt_t maxmem; /* Maximum available free memory. */
-extern pgcnt_t freemem; /* Current free memory. */
-extern pgcnt_t availrmem; /* Available resident (not */
- /* swapable) memory in pages. */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_IMMU_H */
diff --git a/usr/src/uts/intel/sys/kdi_machimpl.h b/usr/src/uts/intel/sys/kdi_machimpl.h
index f34501385d..5ded8b44c2 100644
--- a/usr/src/uts/intel/sys/kdi_machimpl.h
+++ b/usr/src/uts/intel/sys/kdi_machimpl.h
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -20,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -35,61 +34,89 @@
* and are to be used only when the system has been stopped.
*/
-/* The VA range reserved for the debugger. */
-
#include <sys/modctl.h>
#include <sys/types.h>
+#include <sys/cpuvar.h>
+#include <sys/kdi_regs.h>
#ifdef __cplusplus
extern "C" {
#endif
+typedef void (*kdi_main_t)(kdi_cpusave_t *);
+
+typedef struct kdi_memrange {
+ caddr_t mr_base;
+ caddr_t mr_lim;
+} kdi_memrange_t;
+
+#define KDI_MEMRANGES_MAX 2
+
typedef struct kdi_mach {
- int (*mkdi_get_cpuinfo)(uint_t *, uint_t *, uint_t *);
+ void (*mkdi_activate)(kdi_main_t, kdi_cpusave_t *, uint_t);
+ void (*mkdi_deactivate)(void);
+
+ void (*mkdi_idt_switch)(kdi_cpusave_t *);
- int (*mkdi_xc_initialized)(void);
- void (*mkdi_xc_others)(int, void (*)());
+ void (*mkdi_update_drreg)(kdi_drreg_t *);
+ void (*mkdi_set_debug_msrs)(kdi_msr_t *);
uintptr_t (*mkdi_get_userlimit)(void);
- void (*mkdi_idt_init_gate)(struct gate_desc *, void (*)(void), uint_t,
- int);
- void (*mkdi_idt_read)(struct gate_desc *, struct gate_desc *, uint_t);
- void (*mkdi_idt_write)(struct gate_desc *, struct gate_desc *, uint_t);
- struct gate_desc *(*mkdi_cpu2idt)(struct cpu *);
+ int (*mkdi_get_cpuinfo)(uint_t *, uint_t *, uint_t *);
+
+ void (*mkdi_stop_slaves)(int, int);
- void (**mkdi_shutdownp)(int, int);
+ void (*mkdi_start_slaves)(void);
-#if defined(__amd64)
- uintptr_t (*mkdi_gdt2gsbase)(uintptr_t);
-#endif
+ void (*mkdi_slave_wait)(void);
- /* for use only when the kernel is running */
- void (*mkdi_cpu_iter)(void (*)(struct cpu *, uint_t),
- uint_t);
+ void (*mkdi_memrange_add)(caddr_t, size_t);
+
+ void (*mkdi_reboot)(void);
} kdi_mach_t;
-#define mkdi_get_cpuinfo kdi_mach.mkdi_get_cpuinfo
-#define mkdi_xc_initialized kdi_mach.mkdi_xc_initialized
-#define mkdi_xc_others kdi_mach.mkdi_xc_others
+#define mkdi_activate kdi_mach.mkdi_activate
+#define mkdi_deactivate kdi_mach.mkdi_deactivate
+#define mkdi_idt_switch kdi_mach.mkdi_idt_switch
+#define mkdi_update_drreg kdi_mach.mkdi_update_drreg
+#define mkdi_set_debug_msrs kdi_mach.mkdi_set_debug_msrs
#define mkdi_get_userlimit kdi_mach.mkdi_get_userlimit
-#define mkdi_idt_init_gate kdi_mach.mkdi_idt_init_gate
-#define mkdi_idt_read kdi_mach.mkdi_idt_read
-#define mkdi_idt_write kdi_mach.mkdi_idt_write
-#define mkdi_cpu2idt kdi_mach.mkdi_cpu2idt
-#define mkdi_shutdownp kdi_mach.mkdi_shutdownp
-#if defined(__amd64)
-#define mkdi_gdt2gsbase kdi_mach.mkdi_gdt2gsbase
-#endif
-#define mkdi_cpu_iter kdi_mach.mkdi_cpu_iter
-
-extern int kdi_xc_initialized(void);
-extern void kdi_xc_others(int, void (*)());
+#define mkdi_get_cpuinfo kdi_mach.mkdi_get_cpuinfo
+#define mkdi_stop_slaves kdi_mach.mkdi_stop_slaves
+#define mkdi_start_slaves kdi_mach.mkdi_start_slaves
+#define mkdi_slave_wait kdi_mach.mkdi_slave_wait
+#define mkdi_memrange_add kdi_mach.mkdi_memrange_add
+#define mkdi_reboot kdi_mach.mkdi_reboot
extern void hat_kdi_init(void);
-extern void hat_kdi_fini(void);
-extern uintptr_t kdi_get_userlimit(void);
+extern ulong_t kdi_getdr0(void), kdi_getdr1(void), kdi_getdr2(void);
+extern ulong_t kdi_getdr3(void), kdi_getdr6(void), kdi_getdr7(void);
+extern void kdi_setdr0(ulong_t), kdi_setdr1(ulong_t), kdi_setdr2(ulong_t);
+extern void kdi_setdr3(ulong_t), kdi_setdr6(ulong_t), kdi_setdr7(ulong_t);
+extern ulong_t kdi_dreg_get(int);
+extern void kdi_dreg_set(int, ulong_t);
+extern void kdi_update_drreg(kdi_drreg_t *);
+extern void kdi_set_debug_msrs(kdi_msr_t *);
+extern void kdi_cpu_debug_init(kdi_cpusave_t *);
+
+extern void kdi_cpu_init(void);
+extern void kdi_xc_others(int, void (*)(void));
+extern void kdi_start_slaves(void);
+extern void kdi_slave_wait(void);
+
+extern void kdi_idtr_set(gate_desc_t *, size_t);
+extern void kdi_idt_write(struct gate_desc *, uint_t);
+extern void kdi_idt_sync(void);
+extern void kdi_idt_switch(kdi_cpusave_t *);
+#define kdi_idtr_write(idtr) wr_idtr(idtr)
+
+extern void kdi_activate(kdi_main_t, kdi_cpusave_t *, uint_t);
+extern void kdi_deactivate(void);
+extern void kdi_stop_slaves(int, int);
+extern void kdi_memrange_add(caddr_t, size_t);
+extern void kdi_reboot(void);
#ifdef __cplusplus
}
diff --git a/usr/src/uts/intel/sys/kdi_regs.h b/usr/src/uts/intel/sys/kdi_regs.h
new file mode 100644
index 0000000000..e896e29a64
--- /dev/null
+++ b/usr/src/uts/intel/sys/kdi_regs.h
@@ -0,0 +1,135 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_KDI_REGS_H
+#define _SYS_KDI_REGS_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#ifndef _ASM
+#include <sys/types.h>
+#include <sys/segments.h>
+#include <sys/regset.h>
+#include <sys/privregs.h>
+#endif
+
+#if defined(__amd64)
+#include <amd64/sys/kdi_regs.h>
+#elif defined(__i386)
+#include <ia32/sys/kdi_regs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define KDI_NCRUMBS 5
+
+#define KDI_RESUME 0
+#define KDI_RESUME_PASS_TO_KERNEL 1
+
+#define KDI_CPU_STATE_NONE 0
+#define KDI_CPU_STATE_MASTER 1
+#define KDI_CPU_STATE_SLAVE 2
+
+#define KDIREG_DRCTL_WPALLEN_MASK 0x000000ff
+#define KDIREG_DRSTAT_RESERVED 0xffff0ff0
+#define KDIREG_DRCTL_RESERVED 0x00000700
+
+#define KDI_MSR_READ 0x1 /* read during entry (unlimited) */
+#define KDI_MSR_WRITE 0x2 /* write during exit (unlimited) */
+#define KDI_MSR_WRITEDELAY 0x4 /* write after last branch (<= 1) */
+#define KDI_MSR_CLEARENTRY 0x3 /* clear before 1st branch (<= 1) */
+
+#ifndef _ASM
+
+/*
+ * We maintain a ring buffer of bread crumbs for debugging purposes. The
+ * current buffer pointer is advanced along the ring with each intercepted
+ * trap (debugger entry, invalid memory access, fault during step, etc).
+ */
+typedef struct kdi_crumb {
+ greg_t krm_cpu_state; /* This CPU's state at last entry */
+ greg_t krm_pc; /* Instruction pointer at trap */
+ greg_t krm_sp; /* Stack pointer at trap */
+ greg_t krm_trapno; /* The last trap number */
+ greg_t krm_flag; /* KAIF_CRUMB_F_* */
+} kdi_crumb_t;
+
+#define KDI_MAXWPIDX 3
+
+/*
+ * Storage for %dr0-3, %dr6, and %dr7.
+ */
+typedef struct kdi_drreg {
+ greg_t dr_ctl;
+ greg_t dr_stat;
+ greg_t dr_addr[KDI_MAXWPIDX + 1];
+} kdi_drreg_t;
+
+typedef struct kdi_msr {
+ uint_t msr_num;
+ uint_t msr_type;
+ union {
+ uint64_t *_msr_valp;
+ uint64_t _msr_val;
+ } _u;
+} kdi_msr_t;
+
+#define kdi_msr_val _u._msr_val
+#define kdi_msr_valp _u._msr_valp
+
+/*
+ * Data structure used to hold all of the state for a given CPU.
+ */
+typedef struct kdi_cpusave {
+ greg_t *krs_gregs; /* saved registers */
+
+ kdi_drreg_t krs_dr; /* saved debug registers */
+
+ user_desc_t *krs_gdt; /* GDT address */
+ gate_desc_t *krs_idt; /* IDT address */
+
+ greg_t krs_cr0; /* saved %cr0 */
+
+ kdi_msr_t *krs_msr; /* ptr to MSR save area */
+
+ uint_t krs_cpu_state; /* KDI_CPU_STATE_* mstr/slv */
+ uint_t krs_cpu_flushed; /* Have caches been flushed? */
+ uint_t krs_cpu_id; /* this CPU's ID */
+
+ /* Bread crumb ring buffer */
+ ulong_t krs_curcrumbidx; /* Current krs_crumbs idx */
+ kdi_crumb_t *krs_curcrumb; /* Pointer to current crumb */
+ kdi_crumb_t krs_crumbs[KDI_NCRUMBS]; /* Crumbs */
+} kdi_cpusave_t;
+
+#endif /* !_ASM */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_KDI_REGS_H */
diff --git a/usr/src/uts/intel/sys/mmu.h b/usr/src/uts/intel/sys/mmu.h
deleted file mode 100644
index 167a7ee895..0000000000
--- a/usr/src/uts/intel/sys/mmu.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#ifndef _SYS_MMU_H
-#define _SYS_MMU_H
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#if defined(__i386) || defined(__amd64)
-
-#include <ia32/sys/mmu.h> /* XX64 x86/sys/mmu.h */
-
-#endif
-
-#endif /* _SYS_MMU_H */
diff --git a/usr/src/uts/intel/sys/pmem.h b/usr/src/uts/intel/sys/pmem.h
new file mode 100644
index 0000000000..068ea349b2
--- /dev/null
+++ b/usr/src/uts/intel/sys/pmem.h
@@ -0,0 +1,84 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_PMEM_H
+#define _SYS_PMEM_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * PMEM - Direct mapping physical memory pages to userland process
+ *
+ * Provide consolidation private functions used for directly (w/o occupying
+ * kernel virtual address space) allocating and exporting physical memory pages
+ * to userland.
+ */
+
+/*
+ * Flags to pass to pmem_alloc
+ */
+#define PMEM_SLEEP 0x1
+#define PMEM_NOSLEEP 0x2
+
+/*
+ * Called by driver devmap routine to pass physical memory mapping info to
+ * seg_dev framework, used only for physical memory allocated from
+ * devmap_pmem_alloc().
+ */
+int devmap_pmem_setup(devmap_cookie_t, dev_info_t *dip,
+ struct devmap_callback_ctl *, devmap_pmem_cookie_t, offset_t,
+ size_t, uint_t, uint_t, ddi_device_acc_attr_t *);
+
+/*
+ * Replace existing mapping using a new cookie, mainly gets called when doing
+ * fork(). Should be called in pertinent devmap_dup(9E).
+ */
+int devmap_pmem_remap(devmap_cookie_t, dev_info_t *dip,
+ devmap_pmem_cookie_t, offset_t, size_t, uint_t, uint_t,
+ ddi_device_acc_attr_t *);
+
+/*
+ * Directly (i.e., without occupying kernel virtual address space) allocate
+ * 'npages' physical memory pages for exporting to user land. The allocated
+ * page_t pointer will be recorded in cookie.
+ */
+int devmap_pmem_alloc(size_t, uint_t, devmap_pmem_cookie_t *);
+
+void devmap_pmem_free(devmap_pmem_cookie_t);
+
+int devmap_pmem_getpfns(devmap_pmem_cookie_t, uint_t, pgcnt_t, pfn_t *);
+
+void pmem_init();
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_PMEM_H */
diff --git a/usr/src/uts/intel/sys/segments.h b/usr/src/uts/intel/sys/segments.h
index fe65db8575..b15131279f 100644
--- a/usr/src/uts/intel/sys/segments.h
+++ b/usr/src/uts/intel/sys/segments.h
@@ -1,5 +1,5 @@
/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -80,7 +80,7 @@ extern "C" {
#endif
#define SELTOIDX(s) ((s) >> 3) /* selector to index */
-#define SEL_KPL 0 /* kernel priority level */
+#define SEL_KPL 0 /* kernel privilege level */
#define SEL_UPL 3 /* user priority level */
#define SEL_TI_LDT 4 /* local descriptor table */
#define SEL_LDT(s) (IDXTOSEL(s) | SEL_TI_LDT | SEL_UPL) /* local sel */
@@ -126,10 +126,28 @@ extern void wr_gdtr(desctbr_t *);
extern void wr_ldtr(selector_t);
extern selector_t rd_ldtr(void);
extern void wr_tsr(selector_t);
+extern void kmdb_enter(void);
#if defined(__amd64)
extern void clr_ldt_sregs(void);
-#endif
+
+/*
+ * inlines for update_segregs
+ */
+extern void __set_ds(selector_t);
+extern void __set_es(selector_t);
+extern void __set_fs(selector_t);
+extern void __set_gs(selector_t);
+extern void __swapgs(void);
+#endif /* __amd64 */
+
+#if defined(__amd64)
+extern void load_segment_registers(selector_t, selector_t, selector_t,
+ selector_t); /* (alphabetical) */
+#elif defined(__i386)
+extern void load_segment_registers(selector_t, selector_t, selector_t,
+ selector_t, selector_t, selector_t); /* (alphabetical) */
+#endif /* __i386 */
#if !defined(__amd64)
@@ -329,20 +347,21 @@ typedef struct gate_desc {
extern void set_usegd(user_desc_t *, uint_t, void *, size_t, uint_t, uint_t,
uint_t, uint_t);
-extern void set_gatesegd(gate_desc_t *, void (*)(void), selector_t, uint_t,
- uint_t, uint_t);
#elif defined(__i386)
extern void set_usegd(user_desc_t *, void *, size_t, uint_t, uint_t,
uint_t, uint_t);
-extern void set_gatesegd(gate_desc_t *, void (*)(void), selector_t,
- uint_t, uint_t, uint_t);
#endif /* __i386 */
+extern void set_gatesegd(gate_desc_t *, void (*)(void), selector_t,
+ uint_t, uint_t);
+
void set_syssegd(system_desc_t *, void *, size_t, uint_t, uint_t);
+void init_boot_gdt(user_desc_t *);
+
#endif /* _ASM */
/*
@@ -433,26 +452,31 @@ void set_syssegd(system_desc_t *, void *, size_t, uint_t, uint_t);
* in long mode system segment decriptors expand to 128 bits.
*
* GDT_LWPFS and GDT_LWPGS must be the same for both 32 and 64-bit
- * kernels. See setup_context in libc.
+ * kernels. See setup_context in libc. 64-bit processes must set
+ * %fs or %gs to null selector to use 64-bit fsbase or gsbase
+ * respectively.
*/
+#define GDT_NULL 0 /* null */
+#define GDT_B32DATA 1 /* dboot 32 bit data descriptor */
+#define GDT_B32CODE 2 /* dboot 32 bit code descriptor */
+#define GDT_B16CODE 3 /* bios call 16 bit code descriptor */
+#define GDT_B16DATA 4 /* bios call 16 bit data descriptor */
+#define GDT_B64CODE 5 /* dboot 64 bit code descriptor */
+#define GDT_BGSTMP 7 /* kmdb descriptor only used early in boot */
+
#if defined(__amd64)
-#define GDT_NULL 0 /* null */
-#define GDT_B32DATA 1 /* copied from boot */
-#define GDT_B32CODE 2 /* copied from boot */
-#define GDT_B64DATA 3 /* copied from boot */
-#define GDT_B64CODE 4 /* copied from boot */
-#define GDT_KCODE 5 /* kernel code seg %cs */
-#define GDT_KDATA 6 /* kernel data seg %ds */
-#define GDT_U32CODE 7 /* 32-bit process on 64-bit kernel %cs */
-#define GDT_UDATA 8 /* user data seg %ds (32 and 64 bit) */
-#define GDT_UCODE 9 /* native user code seg %cs */
-#define GDT_LDT 10 /* LDT for current process */
-#define GDT_KTSS 12 /* kernel tss */
+#define GDT_KCODE 6 /* kernel code seg %cs */
+#define GDT_KDATA 7 /* kernel data seg %ds */
+#define GDT_U32CODE 8 /* 32-bit process on 64-bit kernel %cs */
+#define GDT_UDATA 9 /* user data seg %ds (32 and 64 bit) */
+#define GDT_UCODE 10 /* native user code seg %cs */
+#define GDT_LDT 12 /* LDT for current process */
+#define GDT_KTSS 14 /* kernel tss */
#define GDT_FS GDT_NULL /* kernel %fs segment selector */
#define GDT_GS GDT_NULL /* kernel %gs segment selector */
-#define GDT_LWPFS 55 /* lwp private %fs segment selector */
-#define GDT_LWPGS 56 /* lwp private %gs segment selector */
+#define GDT_LWPFS 55 /* lwp private %fs segment selector (32-bit) */
+#define GDT_LWPGS 56 /* lwp private %gs segment selector (32-bit) */
#define GDT_BRANDMIN 57 /* first entry in GDT for brand usage */
#define GDT_BRANDMAX 61 /* last entry in GDT for brand usage */
#define NGDT 62 /* number of entries in GDT */
@@ -465,11 +489,6 @@ void set_syssegd(system_desc_t *, void *, size_t, uint_t, uint_t);
#elif defined(__i386)
-#define GDT_NULL 0 /* null */
-#define GDT_BOOTFLAT 1 /* copied from boot */
-#define GDT_BOOTCODE 2 /* copied from boot */
-#define GDT_BOOTCODE16 3 /* copied from boot */
-#define GDT_BOOTDATA 4 /* copied from boot */
#define GDT_LDT 40 /* LDT for current process */
#define GDT_KTSS 42 /* kernel tss */
#define GDT_KCODE 43 /* kernel code seg %cs */
@@ -501,17 +520,32 @@ void set_syssegd(system_desc_t *, void *, size_t, uint_t, uint_t);
#define ULDT_SEL SEL_GDT(GDT_LDT, SEL_KPL)
#define KTSS_SEL SEL_GDT(GDT_KTSS, SEL_KPL)
#define DFTSS_SEL SEL_GDT(GDT_DBFLT, SEL_KPL)
-#define KFS_SEL SEL_GDT(GDT_NULL, SEL_KPL)
+#define KFS_SEL 0
#define KGS_SEL SEL_GDT(GDT_GS, SEL_KPL)
#define LWPFS_SEL SEL_GDT(GDT_LWPFS, SEL_UPL)
#define LWPGS_SEL SEL_GDT(GDT_LWPGS, SEL_UPL)
#define BRANDMIN_SEL SEL_GDT(GDT_BRANDMIN, SEL_UPL)
#define BRANDMAX_SEL SEL_GDT(GDT_BRANDMAX, SEL_UPL)
-#if defined(__amd64)
+
#define B64CODE_SEL SEL_GDT(GDT_B64CODE, SEL_KPL)
+#define B32CODE_SEL SEL_GDT(GDT_B32CODE, SEL_KPL)
+#define B32DATA_SEL SEL_GDT(GDT_B32DATA, SEL_KPL)
+#define B16CODE_SEL SEL_GDT(GDT_B16CODE, SEL_KPL)
+#define B16DATA_SEL SEL_GDT(GDT_B16DATA, SEL_KPL)
+
+/*
+ * Temporary %gs descriptor used by kmdb with -d option. Only lives
+ * in boot's GDT and is not copied into kernel's GDT from boot.
+ */
+#define KMDBGS_SEL SEL_GDT(GDT_BGSTMP, SEL_KPL)
+
+/*
+ * Selector used for kdi_idt when kmdb has taken over the IDT.
+ */
+#if defined(__amd64)
+#define KMDBCODE_SEL B64CODE_SEL
#else
-#define BOOTCODE_SEL SEL_GDT(GDT_BOOTCODE, SEL_KPL)
-#define BOOTFLAT_SEL SEL_GDT(GDT_BOOTFLAT, SEL_KPL)
+#define KMDBCODE_SEL B32CODE_SEL
#endif
/*
@@ -532,7 +566,7 @@ void set_syssegd(system_desc_t *, void *, size_t, uint_t, uint_t);
#pragma align 16(idt0)
extern gate_desc_t idt0[NIDT];
extern desctbr_t idt0_default_reg;
-extern user_desc_t gdt0[NGDT];
+extern user_desc_t *gdt0;
extern user_desc_t zero_udesc;
extern system_desc_t zero_sdesc;
diff --git a/usr/src/uts/intel/sys/x86_archext.h b/usr/src/uts/intel/sys/x86_archext.h
index af06a50a92..d637f9b284 100644
--- a/usr/src/uts/intel/sys/x86_archext.h
+++ b/usr/src/uts/intel/sys/x86_archext.h
@@ -73,14 +73,14 @@ extern "C" {
#define CPUID_INTC_EDX_SS 0x08000000 /* self-snoop */
#define CPUID_INTC_EDX_HTT 0x10000000 /* Hyper Thread Technology */
#define CPUID_INTC_EDX_TM 0x20000000 /* thermal monitoring */
- /* 0x40000000 - reserved */
+#define CPUID_INTC_EDX_IA64 0x40000000 /* Itanium emulating IA32 */
#define CPUID_INTC_EDX_PBE 0x80000000 /* Pending Break Enable */
-#define FMT_CPUID_INTC_EDX \
- "\20" \
- "\40pbe\36tm\35htt\34ss\33sse2\32sse\31fxsr" \
- "\30mmx\27acpi\26ds\24clfsh\23psn\22pse36\21pat"\
- "\20cmov\17mca\16pge\15mtrr\14sep\12apic\11cx8" \
+#define FMT_CPUID_INTC_EDX \
+ "\20" \
+ "\40pbe\37ia64\36tm\35htt\34ss\33sse2\32sse\31fxsr" \
+ "\30mmx\27acpi\26ds\24clfsh\23psn\22pse36\21pat" \
+ "\20cmov\17mca\16pge\15mtrr\14sep\12apic\11cx8" \
"\10mce\7pae\6msr\5tsc\4pse\3de\2vme\1fpu"
/*
@@ -92,22 +92,26 @@ extern "C" {
/* 0x00000004 - reserved */
#define CPUID_INTC_ECX_MON 0x00000008 /* MONITOR/MWAIT */
#define CPUID_INTC_ECX_DSCPL 0x00000010 /* CPL-qualified debug store */
- /* 0x00000020 - reserved */
- /* 0x00000040 - reserved */
+#define CPUID_INTC_ECX_VMX 0x00000020 /* Hardware VM extensions */
+#define CPUID_INTC_ECX_SMX 0x00000040 /* Secure mode extensions */
#define CPUID_INTC_ECX_EST 0x00000080 /* enhanced SpeedStep */
#define CPUID_INTC_ECX_TM2 0x00000100 /* thermal monitoring */
- /* 0x00000200 - reserved */
+#define CPUID_INTC_ECX_SSSE3 0x00000200 /* Supplemental SSE3 insns */
#define CPUID_INTC_ECX_CID 0x00000400 /* L1 context ID */
/* 0x00000800 - reserved */
/* 0x00001000 - reserved */
- /* 0x00002000 - reserved */
-#define CPUID_INTC_ECX_CX16 0x00002000 /* CMPXCHG16B */
-#define CPUID_INTC_ECX_XTPR 0x00004000 /* disable task pri messages */
-
-#define FMT_CPUID_INTC_ECX \
- "\20" \
- "\20\17xtpr\16cx16\13cid\11tm2" \
- "\10est\5dscpl\4monitor\1sse3"
+#define CPUID_INTC_ECX_CX16 0x00002000 /* cmpxchg16 */
+#define CPUID_INTC_ECX_ETPRD 0x00004000 /* extended task pri messages */
+ /* 0x00008000 - reserved */
+ /* 0x00010000 - reserved */
+ /* 0x00020000 - reserved */
+#define CPUID_INTC_ECX_DCA 0x00040000 /* direct cache access */
+
+#define FMT_CPUID_INTC_ECX \
+ "\20" \
+ "\30\23dca" \
+ "\20\17etprd\16cx16\13cid\12ssse3\11tm2" \
+ "\10est\7smx\6vmx\5dscpl\4mon\1sse3"
/*
* cpuid instruction feature flags in %edx (extended function 0x80000001)
@@ -129,7 +133,8 @@ extern "C" {
#define CPUID_AMD_EDX_PGE 0x00002000 /* page global enable */
#define CPUID_AMD_EDX_MCA 0x00004000 /* machine check arch */
#define CPUID_AMD_EDX_CMOV 0x00008000 /* conditional move insns */
-#define CPUID_AMD_EDX_PAT 0x00010000 /* page attribute table */
+#define CPUID_AMD_EDX_PAT 0x00010000 /* K7: page attribute table */
+#define CPUID_AMD_EDX_FCMOV 0x00010000 /* FCMOVcc etc. */
#define CPUID_AMD_EDX_PSE36 0x00020000 /* 36-bit pagesize extension */
/* 0x00040000 - reserved */
/* 0x00080000 - reserved */
@@ -138,9 +143,9 @@ extern "C" {
#define CPUID_AMD_EDX_MMXamd 0x00400000 /* AMD: MMX extensions */
#define CPUID_AMD_EDX_MMX 0x00800000 /* MMX instructions */
#define CPUID_AMD_EDX_FXSR 0x01000000 /* fxsave and fxrstor */
- /* 0x02000000 - reserved */
+#define CPUID_AMD_EDX_FFXSR 0x02000000 /* fast fxsave/fxrstor */
/* 0x04000000 - reserved */
- /* 0x08000000 - reserved */
+#define CPUID_AMD_EDX_TSCP 0x08000000 /* rdtscp instruction */
/* 0x10000000 - reserved */
#define CPUID_AMD_EDX_LM 0x20000000 /* AMD: long mode */
#define CPUID_AMD_EDX_3DNowx 0x40000000 /* AMD: extensions to 3DNow! */
@@ -148,16 +153,30 @@ extern "C" {
#define FMT_CPUID_AMD_EDX \
"\20" \
- "\40a3d\37a3d+\36lm\31fxsr" \
+ "\40a3d\37a3d+\36lm\34tscp\32ffxsr\31fxsr" \
"\30mmx\27mmxext\25nx\22pse\21pat" \
"\20cmov\17mca\16pge\15mtrr\14syscall\12apic\11cx8" \
"\10mce\7pae\6msr\5tsc\4pse\3de\2vme\1fpu"
-#define CPUID_AMD_ECX_CMP_LEGACY 0x00000002 /* AMD: multi-core chip */
+#define CPUID_AMD_ECX_AHF64 0x00000001 /* LAHF and SAHF in long mode */
+#define CPUID_AMD_ECX_CMP_LGCY 0x00000002 /* AMD: multicore chip */
+#define CPUID_AMD_ECX_SVM 0x00000004 /* AMD: secure VM */
+#define CPUID_AMD_ECX_EAS 0x00000008 /* extended apic space */
+#define CPUID_AMD_ECX_CR8D 0x00000010 /* AMD: 32-bit mov %cr8 */
#define FMT_CPUID_AMD_ECX \
"\20" \
- "\1htvalid"
+ "\5cr8d\3svm\2lcmplgcy\1ahf64"
+
+/*
+ * Intel now seems to have claimed part of the "extended" function
+ * space that we previously for non-Intel implementors to use.
+ * More excitingly still, they've claimed bit 20 to mean LAHF/SAHF
+ * is available in long mode i.e. what AMD indicate using bit 0.
+ * On the other hand, everything else is labelled as reserved.
+ */
+#define CPUID_INTC_ECX_AHF64 0x00100000 /* LAHF and SAHF in long mode */
+
#define P5_MCHADDR 0x0
#define P5_CESR 0x11
@@ -329,6 +348,7 @@ typedef struct mtrrvar {
#define X86_MSR 0x00000004
#define X86_MTRR 0x00000008
#define X86_PGE 0x00000010
+#define X86_DE 0x00000020
#define X86_CMOV 0x00000040
#define X86_MMX 0x00000080
#define X86_MCA 0x00000100
@@ -344,14 +364,15 @@ typedef struct mtrrvar {
#define X86_SSE3 0x00040000
#define X86_CX16 0x00080000
#define X86_CMP 0x00100000
+#define X86_TSCP 0x00200000
#define X86_CPUID 0x01000000
#define FMT_X86_FEATURE \
"\20" \
"\31cpuid" \
- "\25cmp\24cx16\23sse3\22nx\21asysc" \
+ "\26tscp\25cmp\24cx16\23sse3\22nx\21asysc" \
"\20htt\17sse2\16sse\15sep\14pat\13cx8\12pae\11mca" \
- "\10mmx\7cmov\5pge\4mtrr\3msr\2tsc\1lgpg"
+ "\10mmx\7cmov\6de\5pge\4mtrr\3msr\2tsc\1lgpg"
/*
* x86_type is a legacy concept; this is supplanted
@@ -482,7 +503,6 @@ extern uint_t x86_feature;
extern uint_t x86_type;
extern uint_t x86_vendor;
-extern ulong_t cr4_value;
extern uint_t pentiumpro_bug4046376;
extern uint_t pentiumpro_bug4064495;
@@ -509,9 +529,13 @@ extern uint64_t rdmsr(uint_t);
extern void wrmsr(uint_t, const uint64_t);
extern uint64_t xrdmsr(uint_t);
extern void xwrmsr(uint_t, const uint64_t);
+extern int checked_rdmsr(uint_t, uint64_t *);
+extern int checked_wrmsr(uint_t, uint64_t);
+
extern void invalidate_cache(void);
extern ulong_t getcr4(void);
extern void setcr4(ulong_t);
+
extern void mtrr_sync(void);
extern void cpu_fast_syscall_enable(void *);
@@ -547,6 +571,8 @@ extern int cpuid_opteron_erratum(struct cpu *, uint_t);
struct cpuid_info;
extern void setx86isalist(void);
+extern void cpuid_alloc_space(struct cpu *);
+extern void cpuid_free_space(struct cpu *);
extern uint_t cpuid_pass1(struct cpu *);
extern void cpuid_pass2(struct cpu *);
extern void cpuid_pass3(struct cpu *);