Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 18 Jan 2024 17:00:19 GMT
From:      Mitchell Horne <mhorne@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 2e297cbb4fc0 - main - arm64: fix db_read_bytes() for size == 8
Message-ID:  <202401181700.40IH0JP5039383@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by mhorne:

URL: https://cgit.FreeBSD.org/src/commit/?id=2e297cbb4fc057e1872114ef8a37a41a6669dd5b

commit 2e297cbb4fc057e1872114ef8a37a41a6669dd5b
Author:     Mitchell Horne <mhorne@FreeBSD.org>
AuthorDate: 2024-01-17 16:45:41 +0000
Commit:     Mitchell Horne <mhorne@FreeBSD.org>
CommitDate: 2024-01-18 17:00:07 +0000

    arm64: fix db_read_bytes() for size == 8
    
    There is a mistake in the cast, resulting in a truncated read to tmp64.
    Switch from int to uint64_t, and adjust the other casts for clarity.
    
    Add a comment explaining why we do this at all.
    
    Reported by:    dfr
    Reviewed by:    dfr, mmel, emaste, jhb (all a previous version)
    PR:             276406
    MFC after:      3 days
    Fixes:          a67687fcd8f5 ("Use native-sized accesses when accessing memory from kdb")
---
 sys/arm64/arm64/db_interface.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/sys/arm64/arm64/db_interface.c b/sys/arm64/arm64/db_interface.c
index 8d97ab46a837..0b1c58ca88a0 100644
--- a/sys/arm64/arm64/db_interface.c
+++ b/sys/arm64/arm64/db_interface.c
@@ -124,14 +124,20 @@ db_read_bytes(vm_offset_t addr, size_t size, char *data)
 
 	if (ret == 0) {
 		src = (const char *)addr;
+
+		/*
+		 * Perform a native-sized memory access, if possible. This
+		 * enables reading from MMIO devices that don't support single
+		 * byte access.
+		 */
 		if (size == 8 && (addr & 7) == 0) {
-			tmp64 = *((const int *)src);
+			tmp64 = *((const uint64_t *)src);
 			src = (const char *)&tmp64;
 		} else if (size == 4 && (addr & 3) == 0) {
-			tmp32 = *((const int *)src);
+			tmp32 = *((const uint32_t *)src);
 			src = (const char *)&tmp32;
 		} else if (size == 2 && (addr & 1) == 0) {
-			tmp16 = *((const short *)src);
+			tmp16 = *((const uint16_t *)src);
 			src = (const char *)&tmp16;
 		}
 		while (size-- > 0)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202401181700.40IH0JP5039383>