From: "Michael D Kinney" <michael.d.kinney@intel.com>
To: "Jayaprakash, N" <n.jayaprakash@intel.com>,
"devel@edk2.groups.io" <devel@edk2.groups.io>
Cc: Rebecca Cran <rebecca@bsdio.com>,
"Kinney, Michael D" <michael.d.kinney@intel.com>
Subject: Re: [edk2-devel] [edk2-libc Patch 1/1] edk2-libc:add rdmsr_ex & wrmsr_ex functions to read/write cpu specific msrs
Date: Thu, 2 May 2024 17:13:00 +0000 [thread overview]
Message-ID: <CO1PR11MB4929A14A9E459598B0A7BB41D2182@CO1PR11MB4929.namprd11.prod.outlook.com> (raw)
In-Reply-To: <PH7PR11MB5943FB11EC1831EDDE3BB712EE102@PH7PR11MB5943.namprd11.prod.outlook.com>
Reviewed-by: Michael D Kinney <michael.d.kinney@intel.com>
Mike
> -----Original Message-----
> From: Jayaprakash, N <n.jayaprakash@intel.com>
> Sent: Wednesday, April 24, 2024 11:14 AM
> To: devel@edk2.groups.io; Jayaprakash, N <n.jayaprakash@intel.com>;
> Kinney, Michael D <michael.d.kinney@intel.com>
> Cc: Rebecca Cran <rebecca@bsdio.com>
> Subject: RE: [edk2-devel] [edk2-libc Patch 1/1] edk2-libc:add rdmsr_ex &
> wrmsr_ex functions to read/write cpu specific msrs
>
> Hi Mike,
>
> I have sent an updated patch v2 for review which uses the MP Services
> protocol API StarupThisAP() to read / write MSRs specific to CPU cores.
> Please review and do the needful.
>
> Regards,
> JP
>
> -----Original Message-----
> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of
> Jayaprakash, N
> Sent: Thursday, April 18, 2024 11:49 AM
> To: Kinney, Michael D <michael.d.kinney@intel.com>; devel@edk2.groups.io
> Cc: Rebecca Cran <rebecca@bsdio.com>
> Subject: Re: [edk2-devel] [edk2-libc Patch 1/1] edk2-libc:add rdmsr_ex &
> wrmsr_ex functions to read/write cpu specific msrs
>
> Thanks Mike. I shall make necessary changes and submit the PR again for
> review.
>
> Regards,
> JP
>
> -----Original Message-----
> From: Kinney, Michael D <michael.d.kinney@intel.com>
> Sent: Thursday, April 18, 2024 10:46 AM
> To: Jayaprakash, N <n.jayaprakash@intel.com>; devel@edk2.groups.io
> Cc: Rebecca Cran <rebecca@bsdio.com>; Kinney, Michael D
> <michael.d.kinney@intel.com>
> Subject: RE: [edk2-devel] [edk2-libc Patch 1/1] edk2-libc:add rdmsr_ex &
> wrmsr_ex functions to read/write cpu specific msrs
>
> Please use MP Services Protocol APIs StartupAllAPs() or StarupThisAP()
> to read/write MSRs on other logical processors.
>
> There and many examples of this in the UefiCpuPkg to programming MSRs on
> all the logical processors.
>
> Mike
>
> > -----Original Message-----
> > From: Jayaprakash, N <n.jayaprakash@intel.com>
> > Sent: Wednesday, April 17, 2024 8:16 PM
> > To: Kinney, Michael D <michael.d.kinney@intel.com>;
> > devel@edk2.groups.io
> > Cc: Rebecca Cran <rebecca@bsdio.com>
> > Subject: RE: [edk2-devel] [edk2-libc Patch 1/1] edk2-libc:add rdmsr_ex
> > & wrmsr_ex functions to read/write cpu specific msrs
> >
> > In the validation and debug scenarios, engineers tend to read MSRs and
> > write to MSRs of different CPUs.
> > So we are providing a simple mechanism through these APIs to enable
> > them to do these operations.
> >
> > These APIs will be part of the edk2 module of the Python interpreter
> > and will be used during the validation and debug scenarios only.
> >
> > This is not for switching the BSP for OS boot. This is only used
> > during the validation and debug use cases.
> >
> > Regards,
> > JP
> > -----Original Message-----
> > From: Kinney, Michael D <michael.d.kinney@intel.com>
> > Sent: Thursday, April 18, 2024 12:08 AM
> > To: Jayaprakash, N <n.jayaprakash@intel.com>; devel@edk2.groups.io
> > Cc: Rebecca Cran <rebecca@bsdio.com>; Kinney, Michael D
> > <michael.d.kinney@intel.com>
> > Subject: RE: [edk2-devel] [edk2-libc Patch 1/1] edk2-libc:add rdmsr_ex
> > & wrmsr_ex functions to read/write cpu specific msrs
> >
> > Hi JP,
> >
> > Is there a reason switch BSP is being used. That is not a common
> > operation and is typically used if the current BSP is not stable or
> > there is a good reason to switch the BSP for OS boot.
> >
> > The MP Services can be used to execute a C function on APs to execute
> > MSR related instructions.
> >
> > Mike
> >
> > > -----Original Message-----
> > > From: Jayaprakash, N <n.jayaprakash@intel.com>
> > > Sent: Sunday, April 14, 2024 10:33 PM
> > > To: devel@edk2.groups.io; Jayaprakash, N <n.jayaprakash@intel.com>
> > > Cc: Rebecca Cran <rebecca@bsdio.com>; Kinney, Michael D
> > > <michael.d.kinney@intel.com>
> > > Subject: RE: [edk2-devel] [edk2-libc Patch 1/1] edk2-libc:add
> > rdmsr_ex
> > > & wrmsr_ex functions to read/write cpu specific msrs
> > >
> > > + Rebecca and Mike,
> > >
> > > Would you be able to review this PR?
> > >
> > > Regards,
> > > JP
> > >
> > > -----Original Message-----
> > > From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of
> > > Jayaprakash, N
> > > Sent: Wednesday, April 10, 2024 11:49 AM
> > > To: devel@edk2.groups.io
> > > Cc: Jayaprakash, N <n.jayaprakash@intel.com>; Rebecca Cran
> > > <rebecca@bsdio.com>; Kinney, Michael D <michael.d.kinney@intel.com>
> > > Subject: [edk2-devel] [edk2-libc Patch 1/1] edk2-libc:add rdmsr_ex &
> > > wrmsr_ex functions to read/write cpu specific msrs
> > >
> > > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=4746
> > >
> > > The rdmsr_ex and wrmsr_ex are extension APIs to the rdmsr and wrmsr
> > > APIs supported in edk2 module. These extension APIs makes it
> > possible
> > > to read / write MSRs from specific processors and fills an existing
> > > gap in this area.
> > >
> > > Cc: Rebecca Cran <rebecca@bsdio.com>
> > > Cc: Michael D Kinney <michael.d.kinney@intel.com>
> > > Cc: Jayaprakash N <n.jayaprakash@intel.com>
> > > Signed-off-by: Jayaprakash N <n.jayaprakash@intel.com>
> > > ---
> > > .../PyMod-3.6.8/Modules/edk2module.c | 159
> > > +++++++++++++++++-
> > > .../Python/Python-3.6.8/Python368.inf | 3 +
> > > 2 files changed, 158 insertions(+), 4 deletions(-)
> > >
> > > diff --git a/AppPkg/Applications/Python/Python-3.6.8/PyMod-
> > > 3.6.8/Modules/edk2module.c b/AppPkg/Applications/Python/Python-
> > > 3.6.8/PyMod-3.6.8/Modules/edk2module.c
> > > index d6af8da..f1b13a6 100644
> > > --- a/AppPkg/Applications/Python/Python-3.6.8/PyMod-
> > > 3.6.8/Modules/edk2module.c
> > > +++ b/AppPkg/Applications/Python/Python-3.6.8/PyMod-
> > > 3.6.8/Modules/edk2mo
> > > +++ dule.c
> > > @@ -3,7 +3,7 @@
> > > Derived from posixmodule.c in Python 2.7.2.
> > >
> > > Copyright (c) 2015, Daryl McDaniel. All rights reserved.<BR>
> > > - Copyright (c) 2011 - 2023, Intel Corporation. All rights
> > > reserved.<BR>
> > > + Copyright (c) 2011 - 2024, Intel Corporation. All rights
> > > + reserved.<BR>
> > > This program and the accompanying materials are licensed and
> > made
> > > available under
> > > the terms and conditions of the BSD License that accompanies
> > this
> > > distribution.
> > > The full text of the license may be found at @@ -22,16 +22,23
> > @@
> > > #include <wchar.h> #include <sys/syslimits.h> #include <Uefi.h>
> > > +#include <Pi/PiDxeCis.h> // Needed for the definition of
> > > EFI_AP_PROCEDURE
> > > #include <Library/UefiLib.h>
> > > #include <Library/PciLib.h>
> > > #include <Library/IoLib.h>
> > > #include <Library/UefiRuntimeServicesTableLib.h>
> > > +#include <Library/UefiBootServicesTableLib.h>
> > > +#include <Protocol/MpService.h>
> > >
> > > #ifdef __cplusplus
> > > extern "C" {
> > > #endif
> > >
> > > PyTypeObject EfiGuidType;
> > > +EFI_MP_SERVICES_PROTOCOL *gpMpService = NULL;
> > > +UINTN gBSPProcessorNumber = 0;
> > > +UINTN gNumberOfProcessors = 0;
> > > +UINTN gNumberOfEnabledProcessors = 0;
> > >
> > > extern void _swsmi( unsigned int smi_code_data, unsigned int
> > > rax_value, unsigned int rbx_value, unsigned int rcx_value, unsigned
> > > int rdx_value, unsigned int rsi_value, unsigned int rdi_value ); //
> > -
> > > - Support routines @@ -169,6 +176,35 @@ PyDoc_STRVAR(edk2__doc__,
> > > /* dummy version. _PyVerify_fd() is already defined in fileobject.h
> > > */ #define _PyVerify_fd_dup2(A, B) (1)
> > >
> > > +static EFI_STATUS
> > > +MpServicesWhoAmI (
> > > + IN EFI_MP_SERVICES_PROTOCOL *pMpService,
> > > + OUT UINTN *pProcessorNumber
> > > + )
> > > +{
> > > + return pMpService->WhoAmI (pMpService, pProcessorNumber); }
> > > +
> > > +static EFI_STATUS
> > > +MpServicesGetNumberOfProcessors (
> > > + IN EFI_MP_SERVICES_PROTOCOL *pMpService,
> > > + OUT UINTN *pNumberOfProcessors,
> > > + OUT UINTN *pNumberOfEnabledProcessors
> > > +
> > > + )
> > > +{
> > > + return pMpService->GetNumberOfProcessors (pMpService,
> > > +pNumberOfProcessors, pNumberOfEnabledProcessors); }
> > > +
> > > +static EFI_STATUS
> > > +MpServicesSwitchBSP (
> > > + IN EFI_MP_SERVICES_PROTOCOL *pMpService,
> > > + IN UINTN ProcessorNumber
> > > + )
> > > +{
> > > + return pMpService->SwitchBSP(pMpService, ProcessorNumber, TRUE);
> > }
> > > +
> > > #ifndef UEFI_C_SOURCE
> > > /* Return a dictionary corresponding to the POSIX environment table
> > > */ extern char **environ; @@ -3865,6 +3901,56 @@
> > edk2_rdmsr(PyObject
> > > *self, PyObject *args)
> > > return Py_BuildValue("(II)", (unsigned long)veax, (unsigned
> > > long)vedx); }
> > >
> > > +PyDoc_STRVAR(efi_rdmsr_ex__doc__,
> > > +"rdmsr_ex(cpu, msr) -> (lower_32bits, higher_32bits)\n\ \n\ Read
> > the
> > > +given msr by switching to cpu and return the data as tuple.\n\ \n\
> > > +Parameters:\n\
> > > + cpu - The cpu number in hex or int format\n\
> > > + msr - The msr in hex or int format\n\ \n\ Return Value:\n\
> > > + a tuple with lower and higher 32 bit values read from the
> > msr\n\
> > > +");
> > > +
> > > +static PyObject *
> > > +edk2_rdmsr_ex(PyObject *self, PyObject *args) {
> > > + unsigned int cpu, vecx, veax, vedx;
> > > + unsigned int bsp_switched = 0;
> > > + EFI_STATUS status = 0;
> > > + UINT64 data = 0;
> > > +
> > > + if (!PyArg_ParseTuple(args, "II", &cpu, &vecx))
> > > + return NULL;
> > > +
> > > + Py_BEGIN_ALLOW_THREADS
> > > + if (cpu != gBSPProcessorNumber && cpu < gNumberOfProcessors) {
> > > + //switch the BSP to the cpu
> > > + status = MpServicesSwitchBSP(gpMpService, cpu);
> > > + if (!EFI_ERROR(status))
> > > + {
> > > + bsp_switched = 1;
> > > + }
> > > + }
> > > +
> > > + data = AsmReadMsr64(vecx);
> > > +
> > > + if (bsp_switched)
> > > + {
> > > + // switch BSP to the saved BSP processor
> > > + MpServicesSwitchBSP(gpMpService, gBSPProcessorNumber);
> > > + // update the saved BSP processor
> > > + MpServicesWhoAmI(gpMpService, &gBSPProcessorNumber);
> > > + }
> > > + Py_END_ALLOW_THREADS
> > > + veax = (UINT32)data;
> > > + vedx = (UINT64)data >> 32;
> > > + return Py_BuildValue("(II)", (unsigned long)veax, (unsigned
> > > +long)vedx); }
> > > +
> > > PyDoc_STRVAR(efi_wrmsr__doc__,
> > > "wrmsr(msr, lower_32bits, higher_32bits) -> None\n\ \n\ @@ -3889,6
> > > +3975,58 @@ edk2_wrmsr(PyObject *self, PyObject *args)
> > > data = vedx << 32 | veax;
> > > Py_BEGIN_ALLOW_THREADS
> > > AsmWriteMsr64(vecx, data);
> > > + Py_END_ALLOW_THREADS
> > > + Py_INCREF(Py_None);
> > > + return Py_None;
> > > +}
> > > +
> > > +PyDoc_STRVAR(efi_wrmsr_ex__doc__,
> > > +"wrmsr_ex(cpu, msr, lower_32bits, higher_32bits) -> None\n\ \n\
> > > Writes
> > > +higher_32bits:lower_32bits to the given msr.\n\ \n\ Parameters:\n\
> > > + cpu - The cpu number in hex or int format\n\
> > > + msr - The msr in hex or int format\n\
> > > + lower_32bits - The lower 32 bit data for the msr\n\
> > > + higher_32bits - The higher 32 bit data for the msr\n\ \n\
> > Return
> > > +Value:\n\
> > > + None\n\
> > > +");
> > > +
> > > +static PyObject *
> > > +edk2_wrmsr_ex(PyObject *self, PyObject *args) {
> > > + unsigned int cpu, msr, veax, vedx;
> > > + unsigned int bsp_switched = 0;
> > > + EFI_STATUS status = 0;
> > > + UINT64 data = 0;
> > > +
> > > + if (!PyArg_ParseTuple(args, "IIII", &cpu, &msr, &veax, &vedx))
> > > + return NULL;
> > > + data = (((UINT64)vedx) << 32) | veax;
> > > +
> > > + Py_BEGIN_ALLOW_THREADS
> > > + if (cpu != gBSPProcessorNumber && cpu < gNumberOfProcessors) {
> > > + //switch the BSP to the cpu
> > > + status = MpServicesSwitchBSP(gpMpService, cpu);
> > > + if (!EFI_ERROR(status))
> > > + {
> > > + bsp_switched = 1;
> > > + }
> > > + }
> > > + // write to MSR
> > > + AsmWriteMsr64(msr, data);
> > > +
> > > + if (bsp_switched)
> > > + {
> > > + // switch BSP to the saved BSP processor
> > > + MpServicesSwitchBSP(gpMpService, gBSPProcessorNumber);
> > > + // update the saved BSP processor
> > > + MpServicesWhoAmI(gpMpService, &gBSPProcessorNumber); }
> > > Py_END_ALLOW_THREADS
> > > Py_INCREF(Py_None);
> > > return Py_None;
> > > @@ -4576,7 +4714,9 @@ static PyMethodDef edk2_methods[] = { #endif
> > > {"abort", edk2_abort, METH_NOARGS,
> > > edk2_abort__doc__},
> > > {"rdmsr", edk2_rdmsr,
> > METH_VARARGS,
> > > efi_rdmsr__doc__},
> > > + {"rdmsr_ex", edk2_rdmsr_ex,
> > METH_VARARGS,
> > > efi_rdmsr_ex__doc__},
> > > {"wrmsr", edk2_wrmsr,
> > METH_VARARGS,
> > > efi_wrmsr__doc__},
> > > + {"wrmsr_ex", edk2_wrmsr_ex,
> > METH_VARARGS,
> > > efi_wrmsr_ex__doc__},
> > > {"readpci", edk2_readpci,
> > METH_VARARGS,
> > > efi_readpci__doc__},
> > > {"writepci", edk2_writepci,
> > METH_VARARGS,
> > > efi_writepci__doc__},
> > > {"readmem", posix_readmem,
> > > METH_VARARGS, efi_readmem__doc__},
> > > @@ -4813,13 +4953,24 @@ static struct PyModuleDef edk2module = {
> > > PyMODINIT_FUNC
> > > PyEdk2__Init(void)
> > > {
> > > - PyObject *m;
> > > + PyObject *m;
> > > + EFI_STATUS Status = 0;
> > >
> > > #ifndef UEFI_C_SOURCE
> > > PyObject *v;
> > > #endif
> > > + Status = gBS->LocateProtocol(&gEfiMpServiceProtocolGuid, NULL,
> > > &gpMpService);
> > > + if (EFI_ERROR(Status))
> > > + {
> > > + printf("Unable to locate the Protocol MpServices protocol:
> > > %r\n", Status);
> > > + return NULL;
> > > + }
> > > + // Get the current BSP processor number
> > > + MpServicesWhoAmI(gpMpService, &gBSPProcessorNumber);
> > > + // Get the number of processors
> > > + MpServicesGetNumberOfProcessors(gpMpService,
> > > &gNumberOfProcessors,
> > > + &gNumberOfEnabledProcessors);
> > >
> > > - m = PyModule_Create(&edk2module);
> > > + m = PyModule_Create(&edk2module);
> > > if (m == NULL)
> > > return m;
> > >
> > > @@ -4870,7 +5021,7 @@ PyEdk2__Init(void)
> > > //PyModule_AddObject(m, "statvfs_result",
> > > // (PyObject*) &StatVFSResultType);
> > > initialized = 1;
> > > - return m;
> > > + return m;
> > >
> > > }
> > >
> > > diff --git a/AppPkg/Applications/Python/Python-3.6.8/Python368.inf
> > > b/AppPkg/Applications/Python/Python-3.6.8/Python368.inf
> > > index 8b7f677..eca98b5 100644
> > > --- a/AppPkg/Applications/Python/Python-3.6.8/Python368.inf
> > > +++ b/AppPkg/Applications/Python/Python-3.6.8/Python368.inf
> > > @@ -46,6 +46,9 @@
> > > #BsdSocketLib
> > > #EfiSocketLib
> > >
> > > +[Protocols]
> > > + gEfiMpServiceProtocolGuid ## CONSUMES
> > > +
> > > [FixedPcd]
> > > gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x0F
> > > gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000040
> > > --
> > > 2.40.0.windows.1
> > >
> > >
> > >
> > >
> > >
>
>
>
>
>
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#118536): https://edk2.groups.io/g/devel/message/118536
Mute This Topic: https://groups.io/mt/105530360/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-
prev parent reply other threads:[~2024-05-02 17:13 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-04-10 6:18 [edk2-devel] [edk2-libc Patch 0/1] add rdmsr_ex & wrmsr_ex functions to read/write msrs from specific cpu Jayaprakash, N
2024-04-10 6:18 ` [edk2-devel] [edk2-libc Patch 1/1] edk2-libc:add rdmsr_ex & wrmsr_ex functions to read/write cpu specific msrs Jayaprakash, N
[not found] ` <17C4D6CE42E68D40.16800@groups.io>
2024-04-15 5:32 ` Jayaprakash, N
2024-04-17 18:38 ` Michael D Kinney
2024-04-18 3:16 ` Jayaprakash, N
2024-04-18 5:16 ` Michael D Kinney
2024-04-18 6:18 ` Jayaprakash, N
[not found] ` <17C74B724102AC1D.15491@groups.io>
2024-04-24 18:13 ` Jayaprakash, N
2024-05-02 17:13 ` Michael D Kinney [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CO1PR11MB4929A14A9E459598B0A7BB41D2182@CO1PR11MB4929.namprd11.prod.outlook.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox