Gabe Black has submitted this change. (
https://gem5-review.googlesource.com/c/public/gem5/+/45205 )
Change subject: arch-x86: Fix x86 build.
......................................................................
arch-x86: Fix x86 build.
Variation of fix by Maximilian Stein:
https://gem5-review.googlesource.com/c/public/gem5/+/45185
Placate gcc, which thinks we're doing something wrong when using
strncpy. Also ensure that fixed size buffers for strings are filled
completely, rather than just filling in the part which holds the string
we want.
Change-Id: I59f51f6a56a3a3e2632eb89ecb6db709fbbd165d
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/45205
Maintainer: Gabe Black <gabe.bl...@gmail.com>
Maintainer: Jason Lowe-Power <power...@gmail.com>
Reviewed-by: Jason Lowe-Power <power...@gmail.com>
Tested-by: kokoro <noreply+kok...@google.com>
---
M src/arch/x86/bios/acpi.cc
1 file changed, 25 insertions(+), 5 deletions(-)
Approvals:
Jason Lowe-Power: Looks good to me, approved; Looks good to me, approved
Gabe Black: Looks good to me, approved
kokoro: Regressions pass
diff --git a/src/arch/x86/bios/acpi.cc b/src/arch/x86/bios/acpi.cc
index 53b6e4d..9a5d32e 100644
--- a/src/arch/x86/bios/acpi.cc
+++ b/src/arch/x86/bios/acpi.cc
@@ -37,6 +37,7 @@
#include "arch/x86/bios/acpi.hh"
+#include <algorithm>
#include <cassert>
#include <cstring>
@@ -52,6 +53,26 @@
namespace ACPI
{
+static void
+fillCopy(void *dest, size_t dest_size, const void *src, size_t src_size)
+{
+ src_size = std::min(src_size, dest_size);
+ const size_t zero_size = dest_size - src_size;
+
+ uint8_t *pos = (uint8_t *)dest;
+
+ std::memcpy(pos, src, src_size);
+ pos += src_size;
+
+ std::memset(pos, 0, zero_size);
+}
+
+static void
+fillCopy(void *dest, size_t dest_size, const std::string &src)
+{
+ fillCopy(dest, dest_size, src.c_str(), src.length());
+}
+
const char RSDP::signature[] = "RSD PTR ";
static uint8_t
@@ -93,7 +114,7 @@
static_assert(sizeof(signature) - 1 == sizeof(data->signature),
"signature length mismatch");
std::memcpy(data->signature, signature, sizeof(data->signature));
- std::strncpy(data->oemID, params().oem_id.c_str(),
sizeof(data->oemID));
+ fillCopy(data->oemID, sizeof(data->oemID), params().oem_id);
data->revision = params().revision;
data->length = mem.size();
@@ -133,12 +154,11 @@
// Fill in the header.
auto& p = params();
Mem* header = (Mem*)mem.data();
- std::strncpy(header->signature, signature, sizeof(header->signature));
+ fillCopy(header->signature, sizeof(header->signature), signature);
header->length = mem.size();
header->revision = revision;
- std::strncpy(header->oemID, p.oem_id.c_str(), sizeof(header->oemID));
- std::strncpy(header->oemTableID, p.oem_table_id.c_str(),
- sizeof(header->oemTableID));
+ fillCopy(header->oemID, sizeof(header->oemID), p.oem_id);
+ fillCopy(header->oemTableID, sizeof(header->oemTableID),
p.oem_table_id);
header->oemRevision = p.oem_revision;
header->creatorID = p.creator_id;
header->creatorRevision = p.creator_revision;
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/45205
To unsubscribe, or for help writing mail filters, visit
https://gem5-review.googlesource.com/settings
Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: I59f51f6a56a3a3e2632eb89ecb6db709fbbd165d
Gerrit-Change-Number: 45205
Gerrit-PatchSet: 2
Gerrit-Owner: Gabe Black <gabe.bl...@gmail.com>
Gerrit-Reviewer: Gabe Black <gabe.bl...@gmail.com>
Gerrit-Reviewer: Jason Lowe-Power <ja...@lowepower.com>
Gerrit-Reviewer: Jason Lowe-Power <power...@gmail.com>
Gerrit-Reviewer: Maximilian Stein <m...@steiny.biz>
Gerrit-Reviewer: kokoro <noreply+kok...@google.com>
Gerrit-MessageType: merged
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s