summaryrefslogtreecommitdiff
path: root/sys/dev/ic
diff options
context:
space:
mode:
authorAlexander Bluhm <bluhm@cvs.openbsd.org>2024-11-09 11:47:48 +0000
committerAlexander Bluhm <bluhm@cvs.openbsd.org>2024-11-09 11:47:48 +0000
commit2574aebfeebdb74dfcd7051aea850273a063acbc (patch)
treeb4940c47c6a686e44fdf4fb50dac0ca6d1e6f47f /sys/dev/ic
parent64348c9e922c9290d29a3b86dac10c475c9e3520 (diff)
Simplify uvm wire and unwire in psp(4) for lauch update data.
Instead of wiring page by page, wire the whole range. After the PSP lauch update data command finished, unwire the memory again. from hshoexer@; OK mlarkin@
Diffstat (limited to 'sys/dev/ic')
-rw-r--r--sys/dev/ic/psp.c32
1 files changed, 22 insertions, 10 deletions
diff --git a/sys/dev/ic/psp.c b/sys/dev/ic/psp.c
index cce250d111b..0eba7ad4d28 100644
--- a/sys/dev/ic/psp.c
+++ b/sys/dev/ic/psp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: psp.c,v 1.12 2024/11/08 17:34:22 bluhm Exp $ */
+/* $OpenBSD: psp.c,v 1.13 2024/11/09 11:47:47 bluhm Exp $ */
/*
* Copyright (c) 2023, 2024 Hans-Joerg Hoexer <hshoexer@genua.de>
@@ -479,7 +479,7 @@ psp_launch_update_data(struct psp_softc *sc,
{
struct psp_launch_update_data *ludata;
pmap_t pmap;
- vaddr_t v, next, end;
+ vaddr_t v, next, start, end;
size_t size, len, off;
int ret;
@@ -504,31 +504,43 @@ psp_launch_update_data(struct psp_softc *sc,
* to system physical address.
*/
pmap = vm_map_pmap(&p->p_vmspace->vm_map);
+ start = ulud->paddr;
size = ulud->length;
- end = ulud->paddr + ulud->length;
+ end = start + size;
+
+ ret = EINVAL;
+
+ /* Wire mapping. */
+ if (uvm_map_pageable(&p->p_vmspace->vm_map, start, end, FALSE, 0))
+ goto out;
+
for (v = ulud->paddr; v < end; v = next) {
off = v & PAGE_MASK;
len = MIN(PAGE_SIZE - off, size);
- /* Wire mapping. */
- if (uvm_map_pageable(&p->p_vmspace->vm_map, v, v+len, FALSE, 0))
- return (EINVAL);
if (!pmap_extract(pmap, v, (paddr_t *)&ludata->paddr))
- return (EINVAL);
+ goto out;
ludata->length = len;
ret = ccp_docmd(sc, PSP_CMD_LAUNCH_UPDATE_DATA,
sc->sc_cmd_map->dm_segs[0].ds_addr);
- if (ret != 0)
- return (EIO);
+ if (ret != 0) {
+ ret = EIO;
+ goto out;
+ }
size -= len;
next = v + len;
}
- return (0);
+out:
+ /* Unwire again. */
+ if (uvm_map_pageable(&p->p_vmspace->vm_map, start, end, TRUE, 0))
+ return (EINVAL);
+
+ return (ret);
}
int