On Tue, Jun 28, 2022 at 10:37:31PM +1000, Jonathan Gray wrote:
> On Sat, Jun 25, 2022 at 04:21:54AM -0700, Mike Larkin wrote:
> > On Fri, Jun 24, 2022 at 07:19:47PM +1000, Jonathan Gray wrote:
> > > +void
> > > +amd_cpu_cacheinfo(struct cpu_info *ci)
> > > +{
> > > + u_int eax, ebx, ecx, edx;
> > > +
> > > + /* used by vmm */
> > > +
> >
> > If this is the only user of these fields, we can just have vmm(4) issue
> > CPUID on
> > each guest CPUID for these features. I think I was just trying to save some
> > cycles.
> >
> > I'll send out a diff to remove these fields unless you want to tackle it.
>
> sounds good to me
Something like this? I don't have a vmm setup to test.
adds 0x8000001d for amd cache topology
Index: include/cpu.h
===================================================================
RCS file: /cvs/src/sys/arch/amd64/include/cpu.h,v
retrieving revision 1.144
diff -u -p -r1.144 cpu.h
--- include/cpu.h 28 Jun 2022 12:11:41 -0000 1.144
+++ include/cpu.h 29 Jun 2022 23:54:52 -0000
@@ -150,8 +150,6 @@ struct cpu_info {
u_int32_t ci_efeature_eax;
u_int32_t ci_efeature_ecx;
u_int32_t ci_brand[12];
- u_int32_t ci_amdcacheinfo[4];
- u_int32_t ci_extcacheinfo[4];
u_int32_t ci_signature;
u_int32_t ci_family;
u_int32_t ci_model;
@@ -387,7 +385,6 @@ extern u_int cpu_mwait_size;
extern u_int cpu_mwait_states;
/* cacheinfo.c */
-void amd_cpu_cacheinfo(struct cpu_info *);
void x86_print_cacheinfo(struct cpu_info *);
/* identcpu.c */
Index: amd64/cacheinfo.c
===================================================================
RCS file: /cvs/src/sys/arch/amd64/amd64/cacheinfo.c,v
retrieving revision 1.10
diff -u -p -r1.10 cacheinfo.c
--- amd64/cacheinfo.c 28 Jun 2022 12:11:41 -0000 1.10
+++ amd64/cacheinfo.c 30 Jun 2022 00:01:27 -0000
@@ -23,30 +23,6 @@
#include <machine/specialreg.h>
void
-amd_cpu_cacheinfo(struct cpu_info *ci)
-{
- u_int eax, ebx, ecx, edx;
-
- /* used by vmm */
-
- if (ci->ci_pnfeatset >= 0x80000005) {
- CPUID(0x80000005, eax, ebx, ecx, edx);
- ci->ci_amdcacheinfo[0] = eax;
- ci->ci_amdcacheinfo[1] = ebx;
- ci->ci_amdcacheinfo[2] = ecx;
- ci->ci_amdcacheinfo[3] = edx;
- }
-
- if (ci->ci_pnfeatset >= 0x80000006) {
- CPUID(0x80000006, eax, ebx, ecx, edx);
- ci->ci_extcacheinfo[0] = eax;
- ci->ci_extcacheinfo[1] = ebx;
- ci->ci_extcacheinfo[2] = ecx;
- ci->ci_extcacheinfo[3] = edx;
- }
-}
-
-void
amd64_print_l1_cacheinfo(struct cpu_info *ci)
{
u_int ways, linesize, totalsize;
Index: amd64/identcpu.c
===================================================================
RCS file: /cvs/src/sys/arch/amd64/amd64/identcpu.c,v
retrieving revision 1.124
diff -u -p -r1.124 identcpu.c
--- amd64/identcpu.c 26 Apr 2022 10:48:20 -0000 1.124
+++ amd64/identcpu.c 30 Jun 2022 00:04:11 -0000
@@ -605,8 +605,6 @@ identifycpu(struct cpu_info *ci)
freq = cpu_freq(ci);
- amd_cpu_cacheinfo(ci);
-
printf("%s: %s", ci->ci_dev->dv_xname, mycpu_model);
if (freq != 0)
Index: amd64/vmm.c
===================================================================
RCS file: /cvs/src/sys/arch/amd64/amd64/vmm.c,v
retrieving revision 1.315
diff -u -p -r1.315 vmm.c
--- amd64/vmm.c 27 Jun 2022 15:12:14 -0000 1.315
+++ amd64/vmm.c 30 Jun 2022 00:31:03 -0000
@@ -7134,16 +7134,16 @@ vmm_handle_cpuid(struct vcpu *vcpu)
*rdx = curcpu()->ci_brand[11];
break;
case 0x80000005: /* Reserved (Intel), cacheinfo (AMD) */
- *rax = curcpu()->ci_amdcacheinfo[0];
- *rbx = curcpu()->ci_amdcacheinfo[1];
- *rcx = curcpu()->ci_amdcacheinfo[2];
- *rdx = curcpu()->ci_amdcacheinfo[3];
+ *rax = eax;
+ *rbx = ebx;
+ *rcx = ecx;
+ *rdx = edx;
break;
case 0x80000006: /* ext. cache info */
- *rax = curcpu()->ci_extcacheinfo[0];
- *rbx = curcpu()->ci_extcacheinfo[1];
- *rcx = curcpu()->ci_extcacheinfo[2];
- *rdx = curcpu()->ci_extcacheinfo[3];
+ *rax = eax;
+ *rbx = ebx;
+ *rcx = ecx;
+ *rdx = edx;
break;
case 0x80000007: /* apmi */
*rax = eax;
@@ -7156,6 +7156,12 @@ vmm_handle_cpuid(struct vcpu *vcpu)
*rbx = ebx & VMM_AMDSPEC_EBX_MASK;
/* Reset %rcx (topology) */
*rcx = 0;
+ *rdx = edx;
+ break;
+ case 0x8000001d: /* cache topology (AMD) */
+ *rax = eax;
+ *rbx = ebx;
+ *rcx = ecx;
*rdx = edx;
break;
default: