Module Name: src
Committed By: rin
Date: Fri Dec 15 09:44:00 UTC 2023
Modified Files:
src/sys/arch/powerpc/include: pmap.h
src/sys/arch/powerpc/powerpc: bus_dma.c vm_machdep.c
Log Message:
powerpc: Make sure direct-mapped buffer fits within correct range
For OEA and OEA64_BRIDGE, only first 3GiB memory is direct-mapped.
Part of PR kern/57621
To generate a diff of this commit:
cvs rdiff -u -r1.42 -r1.43 src/sys/arch/powerpc/include/pmap.h
cvs rdiff -u -r1.55 -r1.56 src/sys/arch/powerpc/powerpc/bus_dma.c
cvs rdiff -u -r1.105 -r1.106 src/sys/arch/powerpc/powerpc/vm_machdep.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/powerpc/include/pmap.h
diff -u src/sys/arch/powerpc/include/pmap.h:1.42 src/sys/arch/powerpc/include/pmap.h:1.43
--- src/sys/arch/powerpc/include/pmap.h:1.42 Sat May 7 07:10:46 2022
+++ src/sys/arch/powerpc/include/pmap.h Fri Dec 15 09:43:59 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.h,v 1.42 2022/05/07 07:10:46 rin Exp $ */
+/* $NetBSD: pmap.h,v 1.43 2023/12/15 09:43:59 rin Exp $ */
#ifndef _POWERPC_PMAP_H_
#define _POWERPC_PMAP_H_
@@ -20,6 +20,10 @@
#error unknown PPC variant
#endif
+#ifndef PMAP_DIRECT_MAPPED_LEN
+#define PMAP_DIRECT_MAPPED_LEN (~0UL)
+#endif
+
#endif /* !_MODULE */
#if !defined(_LOCORE) && (defined(MODULAR) || defined(_MODULE))
Index: src/sys/arch/powerpc/powerpc/bus_dma.c
diff -u src/sys/arch/powerpc/powerpc/bus_dma.c:1.55 src/sys/arch/powerpc/powerpc/bus_dma.c:1.56
--- src/sys/arch/powerpc/powerpc/bus_dma.c:1.55 Tue Jul 26 20:08:56 2022
+++ src/sys/arch/powerpc/powerpc/bus_dma.c Fri Dec 15 09:43:59 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: bus_dma.c,v 1.55 2022/07/26 20:08:56 andvar Exp $ */
+/* $NetBSD: bus_dma.c,v 1.56 2023/12/15 09:43:59 rin Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
@@ -33,7 +33,7 @@
#define _POWERPC_BUS_DMA_PRIVATE
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.55 2022/07/26 20:08:56 andvar Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.56 2023/12/15 09:43:59 rin Exp $");
#ifdef _KERNEL_OPT
#include "opt_ppcarch.h"
@@ -707,8 +707,10 @@ _bus_dmamem_map(bus_dma_tag_t t, bus_dma
if (nsegs == 1 && (flags & BUS_DMA_DONTCACHE) == 0) {
KASSERT(size == segs->ds_len);
addr = BUS_MEM_TO_PHYS(t, segs->ds_addr);
- *kvap = (void *)PMAP_MAP_POOLPAGE(addr);
- return 0;
+ if (__predict_true(addr + size < PMAP_DIRECT_MAPPED_LEN)) {
+ *kvap = (void *)PMAP_MAP_POOLPAGE(addr);
+ return 0;
+ }
}
#endif
Index: src/sys/arch/powerpc/powerpc/vm_machdep.c
diff -u src/sys/arch/powerpc/powerpc/vm_machdep.c:1.105 src/sys/arch/powerpc/powerpc/vm_machdep.c:1.106
--- src/sys/arch/powerpc/powerpc/vm_machdep.c:1.105 Mon Dec 5 16:01:03 2022
+++ src/sys/arch/powerpc/powerpc/vm_machdep.c Fri Dec 15 09:43:59 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: vm_machdep.c,v 1.105 2022/12/05 16:01:03 martin Exp $ */
+/* $NetBSD: vm_machdep.c,v 1.106 2023/12/15 09:43:59 rin Exp $ */
/*
* Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.105 2022/12/05 16:01:03 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.106 2023/12/15 09:43:59 rin Exp $");
#ifdef _KERNEL_OPT
#include "opt_altivec.h"
@@ -322,7 +322,8 @@ cpu_uarea_alloc(bool system)
* Allocate a new physically contiguous uarea which can be
* direct-mapped.
*/
- error = uvm_pglistalloc(USPACE, 0, ~0UL, 0, 0, &pglist, 1, 1);
+ error = uvm_pglistalloc(USPACE, 0, PMAP_DIRECT_MAPPED_LEN, 0, 0,
+ &pglist, 1, 1);
if (error) {
return NULL;
}