diff options
author | Gabe Black <gabeblack@chromium.org> | 2013-03-02 21:00:03 -0800 |
---|---|---|
committer | ChromeBot <chrome-bot@google.com> | 2013-03-04 14:30:23 -0800 |
commit | 522da3e2c9c016a4bc2124cde69a688e790c9dc5 (patch) | |
tree | 4d9fde43f508765427ae0ab3f01577dabcbcbf06 | |
parent | 51d22d5f8d05b582423978894352e8f30fd164b6 (diff) | |
download | vboot-522da3e2c9c016a4bc2124cde69a688e790c9dc5.tar.gz |
Use Memcpy to avoid unaligned accesses when using RollbackKernelSpace.
This structure, like RollbackSpaceFirmware in my previous CL, contains members
that are inherently unaligned. This breaks when the machine running vboot
cares about alignment. Like before, I'm using Memcpy to avoid the direct
unaligned accesses.
BUG=chrome-os-partner:17340
TEST=Built and booted into depthcharge on Snow. Without this change, there's
an unaligned access in RollbackKernelRead. After this change, the unaligned
access goes away and vboot gets at the kernel version successfully.
BRANCH=None
Change-Id: Ifcdcee1ab4bbce74d05e563cb82bef73a1aa9a84
Signed-off-by: Gabe Black <gabeblack@google.com>
Reviewed-on: https://gerrit.chromium.org/gerrit/44503
Reviewed-by: Randall Spangler <rspangler@chromium.org>
Commit-Queue: Gabe Black <gabeblack@chromium.org>
Tested-by: Gabe Black <gabeblack@chromium.org>
-rw-r--r-- | firmware/lib/rollback_index.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/firmware/lib/rollback_index.c b/firmware/lib/rollback_index.c index 4047bc3b..11bc12d5 100644 --- a/firmware/lib/rollback_index.c +++ b/firmware/lib/rollback_index.c @@ -606,7 +606,7 @@ uint32_t RollbackFirmwareLock(void) uint32_t RollbackKernelRead(uint32_t* version) { RollbackSpaceKernel rsk; - uint32_t perms; + uint32_t perms, uid; /* * Read the kernel space and verify its permissions. If the kernel @@ -618,21 +618,24 @@ uint32_t RollbackKernelRead(uint32_t* version) */ RETURN_ON_FAILURE(ReadSpaceKernel(&rsk)); RETURN_ON_FAILURE(TlclGetPermissions(KERNEL_NV_INDEX, &perms)); - if (TPM_NV_PER_PPWRITE != perms || ROLLBACK_SPACE_KERNEL_UID != rsk.uid) + Memcpy(&uid, &rsk.uid, sizeof(uid)); + if (TPM_NV_PER_PPWRITE != perms || ROLLBACK_SPACE_KERNEL_UID != uid) return TPM_E_CORRUPTED_STATE; - *version = rsk.kernel_versions; - VBDEBUG(("TPM: RollbackKernelRead %x\n", (int)rsk.kernel_versions)); + Memcpy(version, &rsk.kernel_versions, sizeof(*version)); + VBDEBUG(("TPM: RollbackKernelRead %x\n", (int)*version)); return TPM_SUCCESS; } uint32_t RollbackKernelWrite(uint32_t version) { RollbackSpaceKernel rsk; + uint32_t old_version; RETURN_ON_FAILURE(ReadSpaceKernel(&rsk)); + Memcpy(&old_version, &rsk.kernel_versions, sizeof(old_version)); VBDEBUG(("TPM: RollbackKernelWrite %x --> %x\n", - (int)rsk.kernel_versions, (int)version)); - rsk.kernel_versions = version; + (int)old_version, (int)version)); + Memcpy(&rsk.kernel_versions, &version, sizeof(version)); return WriteSpaceKernel(&rsk); } |