Module Name: src Committed By: oster Date: Sun Dec 11 18:02:40 UTC 2022
Modified Files: src/sys/arch/vax/include: cpu.h pcb.h src/sys/arch/vax/vax: pmap.c trap.c Log Message: Support save/restore of AST levels in the PCB for context switching. Code written by ragge@ , tested by oster@. To generate a diff of this commit: cvs rdiff -u -r1.105 -r1.106 src/sys/arch/vax/include/cpu.h cvs rdiff -u -r1.15 -r1.16 src/sys/arch/vax/include/pcb.h cvs rdiff -u -r1.194 -r1.195 src/sys/arch/vax/vax/pmap.c cvs rdiff -u -r1.136 -r1.137 src/sys/arch/vax/vax/trap.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/vax/include/cpu.h diff -u src/sys/arch/vax/include/cpu.h:1.105 src/sys/arch/vax/include/cpu.h:1.106 --- src/sys/arch/vax/include/cpu.h:1.105 Sat Aug 14 17:51:19 2021 +++ src/sys/arch/vax/include/cpu.h Sun Dec 11 18:02:40 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: cpu.h,v 1.105 2021/08/14 17:51:19 ryo Exp $ */ +/* $NetBSD: cpu.h,v 1.106 2022/12/11 18:02:40 oster Exp $ */ /* * Copyright (c) 1994 Ludd, University of Lule}, Sweden @@ -157,9 +157,11 @@ extern int cpu_printfataltraps; #define curlwp ((struct lwp *)mfpr(PR_SSP)) #define cpu_number() (curcpu()->ci_cpuid) #define cpu_need_resched(ci, l, flags) \ - do { \ - __USE(flags); \ - mtpr(AST_OK,PR_ASTLVL); \ + do { \ + struct pcb *pcb = lwp_getpcb(curlwp); \ + __USE(flags); \ + pcb->P0LR = (pcb->P0LR & ~AST_MASK) | AST_ON; \ + mtpr(AST_OK,PR_ASTLVL); \ } while (/*CONSTCOND*/ 0) #define cpu_proc_fork(x, y) do { } while (/*CONSCOND*/0) @@ -198,7 +200,12 @@ extern char vax_mp_tramp; * process as soon as possible. */ -#define cpu_signotify(l) mtpr(AST_OK,PR_ASTLVL) +#define cpu_signotify(l) \ + do { \ + struct pcb *pcb = lwp_getpcb(l); \ + pcb->P0LR = (pcb->P0LR & ~AST_MASK) | AST_ON; \ + mtpr(AST_OK,PR_ASTLVL); \ + } while (/*CONSTCOND*/ 0) /* @@ -206,7 +213,13 @@ extern char vax_mp_tramp; * buffer pages are invalid. On the hp300, request an ast to send us * through trap, marking the proc as needing a profiling tick. */ -#define cpu_need_proftick(l) do { (l)->l_pflag |= LP_OWEUPC; mtpr(AST_OK,PR_ASTLVL); } while (/*CONSTCOND*/ 0) +#define cpu_need_proftick(l) \ + do { \ + struct pcb *pcb = lwp_getpcb(l); \ + (l)->l_pflag |= LP_OWEUPC; \ + pcb->P0LR = (pcb->P0LR & ~AST_MASK) | AST_ON; \ + mtpr(AST_OK,PR_ASTLVL); \ + } while (/*CONSTCOND*/ 0) /* * This defines the I/O device register space size in pages. Index: src/sys/arch/vax/include/pcb.h diff -u src/sys/arch/vax/include/pcb.h:1.15 src/sys/arch/vax/include/pcb.h:1.16 --- src/sys/arch/vax/include/pcb.h:1.15 Mon May 22 17:12:11 2017 +++ src/sys/arch/vax/include/pcb.h Sun Dec 11 18:02:40 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: pcb.h,v 1.15 2017/05/22 17:12:11 ragge Exp $ */ +/* $NetBSD: pcb.h,v 1.16 2022/12/11 18:02:40 oster Exp $ */ /* * Copyright (c) 1994 Ludd, University of Lule}, Sweden. @@ -49,6 +49,7 @@ struct pcb { long P0LR; /* Page 0 Length Register */ struct pte *P1BR; /* Page 1 Base Register */ long P1LR; /* Page 1 Length Register */ + long ASN; /* Address space number */ /* Software registers, only used by kernel software */ void *pcb_onfault; /* Tells whether fault copy */ @@ -58,7 +59,8 @@ struct pcb { }; #define AST_MASK 0x07000000 -#define AST_PCB 0x04000000 +#define AST_PCB 0x04000000 /* disable AST */ +#define AST_ON 0x03000000 /* request AST */ /* machine-specific core dump; save trapframe */ struct md_coredump { Index: src/sys/arch/vax/vax/pmap.c diff -u src/sys/arch/vax/vax/pmap.c:1.194 src/sys/arch/vax/vax/pmap.c:1.195 --- src/sys/arch/vax/vax/pmap.c:1.194 Fri Feb 11 17:26:55 2022 +++ src/sys/arch/vax/vax/pmap.c Sun Dec 11 18:02:40 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.c,v 1.194 2022/02/11 17:26:55 riastradh Exp $ */ +/* $NetBSD: pmap.c,v 1.195 2022/12/11 18:02:40 oster Exp $ */ /* * Copyright (c) 1994, 1998, 1999, 2003 Ludd, University of Lule}, Sweden. * All rights reserved. @@ -25,7 +25,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.194 2022/02/11 17:26:55 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.195 2022/12/11 18:02:40 oster Exp $"); #include "opt_ddb.h" #include "opt_cputype.h" @@ -552,7 +552,7 @@ update_pcbs(struct pmap *pm) for (pcb = pm->pm_pcbs; pcb != NULL; pcb = pcb->pcb_pmnext) { KASSERT(pcb->pcb_pm == pm); pcb->P0BR = pm->pm_p0br; - pcb->P0LR = pm->pm_p0lr|AST_PCB; + pcb->P0LR = pm->pm_p0lr | (pcb->P0LR & AST_MASK); pcb->P1BR = pm->pm_p1br; pcb->P1LR = pm->pm_p1lr; @@ -561,7 +561,7 @@ update_pcbs(struct pmap *pm) /* If curlwp uses this pmap update the regs too */ if (pm == curproc->p_vmspace->vm_map.pmap) { mtpr((uintptr_t)pm->pm_p0br, PR_P0BR); - mtpr(pm->pm_p0lr|AST_PCB, PR_P0LR); + mtpr(pm->pm_p0lr, PR_P0LR); mtpr((uintptr_t)pm->pm_p1br, PR_P1BR); mtpr(pm->pm_p1lr, PR_P1LR); } Index: src/sys/arch/vax/vax/trap.c diff -u src/sys/arch/vax/vax/trap.c:1.136 src/sys/arch/vax/vax/trap.c:1.137 --- src/sys/arch/vax/vax/trap.c:1.136 Thu Nov 21 19:24:02 2019 +++ src/sys/arch/vax/vax/trap.c Sun Dec 11 18:02:40 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: trap.c,v 1.136 2019/11/21 19:24:02 ad Exp $ */ +/* $NetBSD: trap.c,v 1.137 2022/12/11 18:02:40 oster Exp $ */ /* * Copyright (c) 1994 Ludd, University of Lule}, Sweden. @@ -28,7 +28,7 @@ /* All bugs are subject to removal without further notice */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.136 2019/11/21 19:24:02 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.137 2022/12/11 18:02:40 oster Exp $"); #include "opt_ddb.h" #include "opt_multiprocessor.h" @@ -315,6 +315,7 @@ if(faultdebug)printf("trap accflt type % break; case T_ASTFLT|T_USER: + pcb->P0LR = (pcb->P0LR & ~AST_MASK) | AST_PCB; mtpr(AST_NO,PR_ASTLVL); trapsig = false; break;