summaryrefslogtreecommitdiff
path: root/sys/arch/amd64/include/cacheinfo.h
diff options
context:
space:
mode:
authorMichael Shalayeff <mickey@cvs.openbsd.org>2004-01-28 01:39:41 +0000
committerMichael Shalayeff <mickey@cvs.openbsd.org>2004-01-28 01:39:41 +0000
commiteb2015b73fc7e8f74be0338c16e873a01653fe03 (patch)
treea0a1beaa9bc6601b949ea8937d79f939833b3cd3 /sys/arch/amd64/include/cacheinfo.h
parentfc744b6d0908de21ef8f71c7e15dd3b113e9aad8 (diff)
an amd64 arch support.
hacked by art@ from netbsd sources and then later debugged by me into the shape where it can host itself. no bootloader yet as needs redoing from the recent advanced i386 sources (anyone? ;)
Diffstat (limited to 'sys/arch/amd64/include/cacheinfo.h')
-rw-r--r--sys/arch/amd64/include/cacheinfo.h111
1 files changed, 111 insertions, 0 deletions
diff --git a/sys/arch/amd64/include/cacheinfo.h b/sys/arch/amd64/include/cacheinfo.h
new file mode 100644
index 00000000000..ea0d7837029
--- /dev/null
+++ b/sys/arch/amd64/include/cacheinfo.h
@@ -0,0 +1,111 @@
+/* $OpenBSD: cacheinfo.h,v 1.1 2004/01/28 01:39:39 mickey Exp $ */
+/* $NetBSD: cacheinfo.h,v 1.1 2003/04/25 21:54:30 fvdl Exp $ */
+
+#ifndef _X86_CACHEINFO_H
+#define _X86_CACHEINFO_H
+
+struct x86_cache_info {
+ uint8_t cai_index;
+ uint8_t cai_desc;
+ uint8_t cai_associativity;
+ u_int cai_totalsize; /* #entries for TLB, bytes for cache */
+ u_int cai_linesize; /* or page size for TLB */
+ const char *cai_string;
+};
+
+#define CAI_ITLB 0 /* Instruction TLB (4K pages) */
+#define CAI_ITLB2 1 /* Instruction TLB (2/4M pages) */
+#define CAI_DTLB 2 /* Data TLB (4K pages) */
+#define CAI_DTLB2 3 /* Data TLB (2/4M pages) */
+#define CAI_ICACHE 4 /* Instruction cache */
+#define CAI_DCACHE 5 /* Data cache */
+#define CAI_L2CACHE 6 /* Level 2 cache */
+
+#define CAI_COUNT 7
+
+struct cpu_info;
+
+const struct x86_cache_info *cache_info_lookup(const struct x86_cache_info *,
+ u_int8_t);
+void amd_cpu_cacheinfo(struct cpu_info *);
+void x86_print_cacheinfo(struct cpu_info *);
+
+/*
+ * AMD Cache Info:
+ *
+ * Athlon, Duron:
+ *
+ * Function 8000.0005 L1 TLB/Cache Information
+ * EAX -- L1 TLB 2/4MB pages
+ * EBX -- L1 TLB 4K pages
+ * ECX -- L1 D-cache
+ * EDX -- L1 I-cache
+ *
+ * Function 8000.0006 L2 TLB/Cache Information
+ * EAX -- L2 TLB 2/4MB pages
+ * EBX -- L2 TLB 4K pages
+ * ECX -- L2 Unified cache
+ * EDX -- reserved
+ *
+ * K5, K6:
+ *
+ * Function 8000.0005 L1 TLB/Cache Information
+ * EAX -- reserved
+ * EBX -- TLB 4K pages
+ * ECX -- L1 D-cache
+ * EDX -- L1 I-cache
+ *
+ * K6-III:
+ *
+ * Function 8000.0006 L2 Cache Information
+ * EAX -- reserved
+ * EBX -- reserved
+ * ECX -- L2 Unified cache
+ * EDX -- reserved
+ */
+
+/* L1 TLB 2/4MB pages */
+#define AMD_L1_EAX_DTLB_ASSOC(x) (((x) >> 24) & 0xff)
+#define AMD_L1_EAX_DTLB_ENTRIES(x) (((x) >> 16) & 0xff)
+#define AMD_L1_EAX_ITLB_ASSOC(x) (((x) >> 8) & 0xff)
+#define AMD_L1_EAX_ITLB_ENTRIES(x) ( (x) & 0xff)
+
+/* L1 TLB 4K pages */
+#define AMD_L1_EBX_DTLB_ASSOC(x) (((x) >> 24) & 0xff)
+#define AMD_L1_EBX_DTLB_ENTRIES(x) (((x) >> 16) & 0xff)
+#define AMD_L1_EBX_ITLB_ASSOC(x) (((x) >> 8) & 0xff)
+#define AMD_L1_EBX_ITLB_ENTRIES(x) ( (x) & 0xff)
+
+/* L1 Data Cache */
+#define AMD_L1_ECX_DC_SIZE(x) ((((x) >> 24) & 0xff) * 1024)
+#define AMD_L1_ECX_DC_ASSOC(x) (((x) >> 16) & 0xff)
+#define AMD_L1_ECX_DC_LPT(x) (((x) >> 8) & 0xff)
+#define AMD_L1_ECX_DC_LS(x) ( (x) & 0xff)
+
+/* L1 Instruction Cache */
+#define AMD_L1_EDX_IC_SIZE(x) ((((x) >> 24) & 0xff) * 1024)
+#define AMD_L1_EDX_IC_ASSOC(x) (((x) >> 16) & 0xff)
+#define AMD_L1_EDX_IC_LPT(x) (((x) >> 8) & 0xff)
+#define AMD_L1_EDX_IC_LS(x) ( (x) & 0xff)
+
+/* Note for L2 TLB -- if the upper 16 bits are 0, it is a unified TLB */
+
+/* L2 TLB 2/4MB pages */
+#define AMD_L2_EAX_DTLB_ASSOC(x) (((x) >> 28) & 0xf)
+#define AMD_L2_EAX_DTLB_ENTRIES(x) (((x) >> 16) & 0xfff)
+#define AMD_L2_EAX_IUTLB_ASSOC(x) (((x) >> 12) & 0xf)
+#define AMD_L2_EAX_IUTLB_ENTRIES(x) ( (x) & 0xfff)
+
+/* L2 TLB 4K pages */
+#define AMD_L2_EBX_DTLB_ASSOC(x) (((x) >> 28) & 0xf)
+#define AMD_L2_EBX_DTLB_ENTRIES(x) (((x) >> 16) & 0xfff)
+#define AMD_L2_EBX_IUTLB_ASSOC(x) (((x) >> 12) & 0xf)
+#define AMD_L2_EBX_IUTLB_ENTRIES(x) ( (x) & 0xfff)
+
+/* L2 Cache */
+#define AMD_L2_ECX_C_SIZE(x) ((((x) >> 16) & 0xffff) * 1024)
+#define AMD_L2_ECX_C_ASSOC(x) (((x) >> 12) & 0xf)
+#define AMD_L2_ECX_C_LPT(x) (((x) >> 8) & 0xf)
+#define AMD_L2_ECX_C_LS(x) ( (x) & 0xff)
+
+#endif /* _X86_CACHEINFO_H */