Module Name: src Committed By: nonaka Date: Sat Dec 7 11:45:45 UTC 2019
Modified Files: src/sys/arch/x86/x86: cpu.c hyperv.c hypervvar.h src/sys/dev/hyperv: hyperv_common.c hypervvar.h vmbus.c vmbusvar.h Log Message: Get a Hyper-V virtual processor id in cpu_hatch(). Currently, it is got in config_interrupts context. However, since it is required when attaching a device, it is got earlier than now. To generate a diff of this commit: cvs rdiff -u -r1.177 -r1.178 src/sys/arch/x86/x86/cpu.c cvs rdiff -u -r1.5 -r1.6 src/sys/arch/x86/x86/hyperv.c cvs rdiff -u -r1.1 -r1.2 src/sys/arch/x86/x86/hypervvar.h cvs rdiff -u -r1.3 -r1.4 src/sys/dev/hyperv/hyperv_common.c cvs rdiff -u -r1.2 -r1.3 src/sys/dev/hyperv/hypervvar.h \ src/sys/dev/hyperv/vmbusvar.h cvs rdiff -u -r1.6 -r1.7 src/sys/dev/hyperv/vmbus.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/x86/x86/cpu.c diff -u src/sys/arch/x86/x86/cpu.c:1.177 src/sys/arch/x86/x86/cpu.c:1.178 --- src/sys/arch/x86/x86/cpu.c:1.177 Wed Nov 27 06:24:33 2019 +++ src/sys/arch/x86/x86/cpu.c Sat Dec 7 11:45:45 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: cpu.c,v 1.177 2019/11/27 06:24:33 maxv Exp $ */ +/* $NetBSD: cpu.c,v 1.178 2019/12/07 11:45:45 nonaka Exp $ */ /* * Copyright (c) 2000-2012 NetBSD Foundation, Inc. @@ -62,7 +62,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.177 2019/11/27 06:24:33 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.178 2019/12/07 11:45:45 nonaka Exp $"); #include "opt_ddb.h" #include "opt_mpbios.h" /* for MPDEBUG */ @@ -118,6 +118,13 @@ __KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.17 #include "tsc.h" +#ifndef XEN +#include "hyperv.h" +#if NHYPERV > 0 +#include <x86/x86/hypervvar.h> +#endif +#endif + static int cpu_match(device_t, cfdata_t, void *); static void cpu_attach(device_t, device_t, void *); static void cpu_defer(device_t); @@ -863,6 +870,9 @@ cpu_hatch(void *v) cpu_init_msrs(ci, true); cpu_probe(ci); cpu_speculation_init(ci); +#if NHYPERV > 0 + hyperv_init_cpu(ci); +#endif ci->ci_data.cpu_cc_freq = cpu_info_primary.ci_data.cpu_cc_freq; /* cpu_get_tsc_freq(ci); */ Index: src/sys/arch/x86/x86/hyperv.c diff -u src/sys/arch/x86/x86/hyperv.c:1.5 src/sys/arch/x86/x86/hyperv.c:1.6 --- src/sys/arch/x86/x86/hyperv.c:1.5 Sat Nov 30 05:28:28 2019 +++ src/sys/arch/x86/x86/hyperv.c Sat Dec 7 11:45:45 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: hyperv.c,v 1.5 2019/11/30 05:28:28 nonaka Exp $ */ +/* $NetBSD: hyperv.c,v 1.6 2019/12/07 11:45:45 nonaka Exp $ */ /*- * Copyright (c) 2009-2012,2016-2017 Microsoft Corp. @@ -33,7 +33,7 @@ */ #include <sys/cdefs.h> #ifdef __KERNEL_RCSID -__KERNEL_RCSID(0, "$NetBSD: hyperv.c,v 1.5 2019/11/30 05:28:28 nonaka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: hyperv.c,v 1.6 2019/12/07 11:45:45 nonaka Exp $"); #endif #ifdef __FBSDID __FBSDID("$FreeBSD: head/sys/dev/hyperv/vmbus/hyperv.c 331757 2018-03-30 02:25:12Z emaste $"); @@ -113,6 +113,8 @@ static char hyperv_features3_str[256]; static int hyperv_idtvec; +uint32_t hyperv_vcpuid[MAXCPUS]; + static struct timecounter hyperv_timecounter = { .tc_get_timecount = hyperv_get_timecount, .tc_counter_mask = 0xffffffff, @@ -495,12 +497,45 @@ hyperv_early_init(void) { u_int features, pm_features, features3; u_int maxleaf; + int i; if (!hyperv_probe(&maxleaf, &features, &pm_features, &features3)) return; if (features & CPUID_HV_MSR_TIME_REFCNT) x86_delay = delay_func = delay_msr; + + if (features & CPUID_HV_MSR_VP_INDEX) { + /* Save virtual processor id. */ + hyperv_vcpuid[0] = rdmsr(MSR_HV_VP_INDEX); + } else { + /* Set virtual processor id to 0 for compatibility. */ + hyperv_vcpuid[0] = 0; + } + for (i = 1; i < MAXCPUS; i++) + hyperv_vcpuid[i] = hyperv_vcpuid[0]; +} + +void +hyperv_init_cpu(struct cpu_info *ci) +{ + u_int features, pm_features, features3; + u_int maxleaf; + + if (!hyperv_probe(&maxleaf, &features, &pm_features, &features3)) + return; + + if (features & CPUID_HV_MSR_VP_INDEX) + hyperv_vcpuid[ci->ci_index] = rdmsr(MSR_HV_VP_INDEX); +} + +uint32_t +hyperv_get_vcpuid(cpuid_t cpu) +{ + + if (cpu < MAXCPUS) + return hyperv_vcpuid[cpu]; + return 0; } static bool @@ -798,14 +833,6 @@ vmbus_init_synic_md(struct vmbus_softc * pd = &sc->sc_percpu[cpu]; - if (hyperv_features & CPUID_HV_MSR_VP_INDEX) { - /* Save virtual processor id. */ - pd->vcpuid = rdmsr(MSR_HV_VP_INDEX); - } else { - /* Set virtual processor id to 0 for compatibility. */ - pd->vcpuid = 0; - } - /* * Setup the SynIC message. */ Index: src/sys/arch/x86/x86/hypervvar.h diff -u src/sys/arch/x86/x86/hypervvar.h:1.1 src/sys/arch/x86/x86/hypervvar.h:1.2 --- src/sys/arch/x86/x86/hypervvar.h:1.1 Fri May 24 14:28:48 2019 +++ src/sys/arch/x86/x86/hypervvar.h Sat Dec 7 11:45:45 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: hypervvar.h,v 1.1 2019/05/24 14:28:48 nonaka Exp $ */ +/* $NetBSD: hypervvar.h,v 1.2 2019/12/07 11:45:45 nonaka Exp $ */ /*- * Copyright (c) 2009-2012,2016 Microsoft Corp. @@ -32,6 +32,7 @@ #define _X86_HYPERVVAR_H_ void hyperv_early_init(void); +void hyperv_init_cpu(struct cpu_info *); device_t device_hyperv_register(device_t, void *); #endif /* _X86_HYPERVVAR_H_ */ Index: src/sys/dev/hyperv/hyperv_common.c diff -u src/sys/dev/hyperv/hyperv_common.c:1.3 src/sys/dev/hyperv/hyperv_common.c:1.4 --- src/sys/dev/hyperv/hyperv_common.c:1.3 Fri Dec 6 12:46:06 2019 +++ src/sys/dev/hyperv/hyperv_common.c Sat Dec 7 11:45:45 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: hyperv_common.c,v 1.3 2019/12/06 12:46:06 nonaka Exp $ */ +/* $NetBSD: hyperv_common.c,v 1.4 2019/12/07 11:45:45 nonaka Exp $ */ /*- * Copyright (c) 2009-2012,2016-2017 Microsoft Corp. @@ -29,7 +29,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: hyperv_common.c,v 1.3 2019/12/06 12:46:06 nonaka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: hyperv_common.c,v 1.4 2019/12/07 11:45:45 nonaka Exp $"); #include "hyperv.h" @@ -56,6 +56,7 @@ __weak_alias(hyperv_set_event_proc, hype __weak_alias(hyperv_set_message_proc, hyperv_voidop); __weak_alias(hyperv_send_eom, hyperv_voidop); __weak_alias(hyperv_intr, hyperv_voidop); +__weak_alias(hyperv_get_vcpuid, hyperv_nullop); __weak_alias(vmbus_init_interrupts_md, hyperv_voidop); __weak_alias(vmbus_deinit_interrupts_md, hyperv_voidop); __weak_alias(vmbus_init_synic_md, hyperv_voidop); Index: src/sys/dev/hyperv/hypervvar.h diff -u src/sys/dev/hyperv/hypervvar.h:1.2 src/sys/dev/hyperv/hypervvar.h:1.3 --- src/sys/dev/hyperv/hypervvar.h:1.2 Fri May 24 14:28:48 2019 +++ src/sys/dev/hyperv/hypervvar.h Sat Dec 7 11:45:45 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: hypervvar.h,v 1.2 2019/05/24 14:28:48 nonaka Exp $ */ +/* $NetBSD: hypervvar.h,v 1.3 2019/12/07 11:45:45 nonaka Exp $ */ /*- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD @@ -65,6 +65,7 @@ int hyperv_synic_supported(void); int hyperv_is_gen1(void); void hyperv_send_eom(void); void hyperv_intr(void); +uint32_t hyperv_get_vcpuid(cpuid_t); struct vmbus_softc; void vmbus_init_interrupts_md(struct vmbus_softc *); Index: src/sys/dev/hyperv/vmbusvar.h diff -u src/sys/dev/hyperv/vmbusvar.h:1.2 src/sys/dev/hyperv/vmbusvar.h:1.3 --- src/sys/dev/hyperv/vmbusvar.h:1.2 Fri May 24 14:28:48 2019 +++ src/sys/dev/hyperv/vmbusvar.h Sat Dec 7 11:45:45 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: vmbusvar.h,v 1.2 2019/05/24 14:28:48 nonaka Exp $ */ +/* $NetBSD: vmbusvar.h,v 1.3 2019/12/07 11:45:45 nonaka Exp $ */ /* $OpenBSD: hypervvar.h,v 1.13 2017/06/23 19:05:42 mikeb Exp $ */ /* @@ -146,7 +146,6 @@ SLIST_HEAD(vmbus_devices, vmbus_dev); struct vmbus_percpu_data { void *simp; /* Synthetic Interrupt Message Page */ void *siep; /* Synthetic Interrupt Event Flags Page */ - uint32_t vcpuid; /* Virtual cpuid */ /* Rarely used fields */ struct hyperv_dma simp_dma; Index: src/sys/dev/hyperv/vmbus.c diff -u src/sys/dev/hyperv/vmbus.c:1.6 src/sys/dev/hyperv/vmbus.c:1.7 --- src/sys/dev/hyperv/vmbus.c:1.6 Fri Dec 6 12:46:06 2019 +++ src/sys/dev/hyperv/vmbus.c Sat Dec 7 11:45:45 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: vmbus.c,v 1.6 2019/12/06 12:46:06 nonaka Exp $ */ +/* $NetBSD: vmbus.c,v 1.7 2019/12/07 11:45:45 nonaka Exp $ */ /* $OpenBSD: hyperv.c,v 1.43 2017/06/27 13:56:15 mikeb Exp $ */ /*- @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vmbus.c,v 1.6 2019/12/06 12:46:06 nonaka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vmbus.c,v 1.7 2019/12/07 11:45:45 nonaka Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -1093,7 +1093,7 @@ vmbus_channel_cpu_set(struct vmbus_chann } ch->ch_cpuid = cpu; - ch->ch_vcpu = sc->sc_percpu[cpu].vcpuid; + ch->ch_vcpu = hyperv_get_vcpuid(cpu); } void