summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Kinney <michael.d.kinney@intel.com>2016-10-04 20:03:24 -0700
committerMichael Kinney <michael.d.kinney@intel.com>2016-10-07 14:56:29 -0700
commit29f169d17a0f09cd1e05c984da5965e08f2b696e (patch)
tree3986f5c721c7cf1a7e70b88b7560aa5f2bcaf87f
parentf9c3b1b5343f53705f1ab72c55c1db440b01f36f (diff)
downloadedk2-platforms-29f169d17a0f09cd1e05c984da5965e08f2b696e.tar.xz
QuarkSocPkg/QncSmmDispatcher: Fix context passed to SMI handlers
https://bugzilla.tianocore.org/show_bug.cgi?id=136 1) Add CallbackContext field to the DATABASE_RECORD structure that is set to the RegisterContent value passed to QNCSmmCoreRegister(). This is the content that must be passed to the SMI handler when its source is triggered. 2) Update usage of ChildContext field in the DATABASE_RECOD to use CopyMem() instead of structure assignments to avoid compiler use of memcpy() intrinsics This issue was reproduced using the unit test at: https://github.com/mdkinney/edk2/tree/Bug51/Reproduce An ASSERT() is generated the first time the periodic SMI handler is triggered. After applying this patch, the DEBUG() messages from the periodic SMI handler in this unit test are generated. Cc: Kelly Steele <kelly.steele@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Michael Kinney <michael.d.kinney@intel.com> Reviewed-by: Kelly Steele <kelly.steele@intel.com>
-rw-r--r--QuarkSocPkg/QuarkNorthCluster/Smm/DxeSmm/QncSmmDispatcher/QNC/QNCSmmPeriodicTimer.c4
-rw-r--r--QuarkSocPkg/QuarkNorthCluster/Smm/DxeSmm/QncSmmDispatcher/QNCSmm.h7
-rw-r--r--QuarkSocPkg/QuarkNorthCluster/Smm/DxeSmm/QncSmmDispatcher/QNCSmmCore.c10
3 files changed, 11 insertions, 10 deletions
diff --git a/QuarkSocPkg/QuarkNorthCluster/Smm/DxeSmm/QncSmmDispatcher/QNC/QNCSmmPeriodicTimer.c b/QuarkSocPkg/QuarkNorthCluster/Smm/DxeSmm/QncSmmDispatcher/QNC/QNCSmmPeriodicTimer.c
index 1d1030c0ae..670ca91c5c 100644
--- a/QuarkSocPkg/QuarkNorthCluster/Smm/DxeSmm/QncSmmDispatcher/QNC/QNCSmmPeriodicTimer.c
+++ b/QuarkSocPkg/QuarkNorthCluster/Smm/DxeSmm/QncSmmDispatcher/QNC/QNCSmmPeriodicTimer.c
@@ -1,7 +1,7 @@
/** @file
File to contain all the hardware specific stuff for the Periodical Timer dispatch protocol.
-Copyright (c) 2013-2015 Intel Corporation.
+Copyright (c) 2013-2016 Intel Corporation.
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
@@ -177,7 +177,7 @@ PeriodicTimerGetContext (
// Update the elapsed time w/ the data from our tables
//
Record->CommBuffer.PeriodicTimer.ElapsedTime += TimerInterval->Interval;
- *HwContext = Record->ChildContext;
+ CopyMem (HwContext, &Record->ChildContext, sizeof (QNC_SMM_CONTEXT));
}
}
diff --git a/QuarkSocPkg/QuarkNorthCluster/Smm/DxeSmm/QncSmmDispatcher/QNCSmm.h b/QuarkSocPkg/QuarkNorthCluster/Smm/DxeSmm/QncSmmDispatcher/QNCSmm.h
index 892294fa71..797be16f79 100644
--- a/QuarkSocPkg/QuarkNorthCluster/Smm/DxeSmm/QncSmmDispatcher/QNCSmm.h
+++ b/QuarkSocPkg/QuarkNorthCluster/Smm/DxeSmm/QncSmmDispatcher/QNCSmm.h
@@ -1,7 +1,7 @@
/** @file
Prototypes and defines for the QNC SMM Dispatcher.
-Copyright (c) 2013-2015 Intel Corporation.
+Copyright (c) 2013-2016 Intel Corporation.
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
@@ -396,8 +396,9 @@ struct _DATABASE_RECORD {
// Callback function
//
EFI_SMM_HANDLER_ENTRY_POINT2 Callback;
- QNC_SMM_CONTEXT ChildContext;
- QNC_SMM_BUFFER CommBuffer;
+ QNC_SMM_CONTEXT ChildContext;
+ VOID *CallbackContext;
+ QNC_SMM_BUFFER CommBuffer;
UINTN BufferSize;
//
diff --git a/QuarkSocPkg/QuarkNorthCluster/Smm/DxeSmm/QncSmmDispatcher/QNCSmmCore.c b/QuarkSocPkg/QuarkNorthCluster/Smm/DxeSmm/QncSmmDispatcher/QNCSmmCore.c
index ba8c721773..47834064ff 100644
--- a/QuarkSocPkg/QuarkNorthCluster/Smm/DxeSmm/QncSmmDispatcher/QNCSmmCore.c
+++ b/QuarkSocPkg/QuarkNorthCluster/Smm/DxeSmm/QncSmmDispatcher/QNCSmmCore.c
@@ -2,7 +2,7 @@
This driver is responsible for the registration of child drivers
and the abstraction of the QNC SMI sources.
-Copyright (c) 2013-2015 Intel Corporation.
+Copyright (c) 2013-2016 Intel Corporation.
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
@@ -351,7 +351,8 @@ Returns:
// Gather information about the registration request
//
Record->Callback = DispatchFunction;
- Record->ChildContext = *RegisterContext;
+ Record->CallbackContext = RegisterContext;
+ CopyMem (&Record->ChildContext, RegisterContext, sizeof (QNC_SMM_CONTEXT));
Qualified = QUALIFIED_PROTOCOL_FROM_GENERIC (This);
@@ -407,7 +408,7 @@ Returns:
//
// Update ChildContext again as SwSmiInputValue has been changed
//
- Record->ChildContext = *RegisterContext;
+ CopyMem (&Record->ChildContext, RegisterContext, sizeof (QNC_SMM_CONTEXT));
}
//
@@ -688,7 +689,6 @@ QNCSmmCoreDispatcher (
// it supplied in registration. Simply pass back what it gave us.
//
ASSERT (RecordToExhaust->Callback != NULL);
- Context = RecordToExhaust->ChildContext;
ContextsMatch = TRUE;
}
@@ -710,7 +710,7 @@ QNCSmmCoreDispatcher (
RecordToExhaust->Callback (
(EFI_HANDLE) & RecordToExhaust->Link,
- &Context,
+ RecordToExhaust->CallbackContext,
CommunicationBuffer,
&BufferSize
);