Messages in this thread |  | | Date | Fri, 24 Jul 2020 22:12:38 -0700 (PDT) | Subject | Re: [PATCH 1/4] RISC-V: Setup exception vector early | From | Palmer Dabbelt <> |
| |
On Wed, 15 Jul 2020 16:30:06 PDT (-0700), Atish Patra wrote: > The trap vector is set only in trap_init which may be too late in some > cases. Early ioremap/efi spits many warning messages which may be useful. > > Setup the trap vector early so that any warning/bug can be handled before > generic code invokes trap_init. > > Signed-off-by: Atish Patra <atish.patra@wdc.com> > --- > arch/riscv/kernel/head.S | 10 ++++++++-- > arch/riscv/kernel/smpboot.c | 1 - > arch/riscv/kernel/traps.c | 8 +------- > 3 files changed, 9 insertions(+), 10 deletions(-) > > diff --git a/arch/riscv/kernel/head.S b/arch/riscv/kernel/head.S > index 7ed1b22950fd..d0c5c316e9bb 100644 > --- a/arch/riscv/kernel/head.S > +++ b/arch/riscv/kernel/head.S > @@ -77,10 +77,16 @@ relocate: > csrw CSR_SATP, a0 > .align 2 > 1: > - /* Set trap vector to spin forever to help debug */ > - la a0, .Lsecondary_park > + /* Set trap vector to exception handler */ > + la a0, handle_exception > csrw CSR_TVEC, a0 > > + /* > + * Set sup0 scratch register to 0, indicating to exception vector that > + * we are presently executing in kernel. > + */ > + csrw CSR_SCRATCH, zero > + > /* Reload the global pointer */ > .option push > .option norelax > diff --git a/arch/riscv/kernel/smpboot.c b/arch/riscv/kernel/smpboot.c > index 4e9922790f6e..5a9c127a380e 100644 > --- a/arch/riscv/kernel/smpboot.c > +++ b/arch/riscv/kernel/smpboot.c > @@ -154,7 +154,6 @@ asmlinkage __visible void smp_callin(void) > mmgrab(mm); > current->active_mm = mm; > > - trap_init(); > notify_cpu_starting(smp_processor_id()); > update_siblings_masks(smp_processor_id()); > set_cpu_online(smp_processor_id(), 1); > diff --git a/arch/riscv/kernel/traps.c b/arch/riscv/kernel/traps.c > index 7d95cce5e47c..ad14f4466d92 100644 > --- a/arch/riscv/kernel/traps.c > +++ b/arch/riscv/kernel/traps.c > @@ -174,13 +174,7 @@ int is_valid_bugaddr(unsigned long pc) > } > #endif /* CONFIG_GENERIC_BUG */ > > +/* stvec & scratch is already set from head.S */ > void trap_init(void) > { > - /* > - * Set sup0 scratch register to 0, indicating to exception vector > - * that we are presently executing in the kernel > - */ > - csr_write(CSR_SCRATCH, 0); > - /* Set the exception vector address */ > - csr_write(CSR_TVEC, &handle_exception); > }
While I think these are all actual fixes, it's pretty late in the cycle here so I'm going to a bit on the careful side and only take the patches that actually manifest as bugs in the current port. Assuming this doesn't manifest until early_ioremap is enabled (and we don't do that yet), I've put it on for-next.
LMK if I'm wrong about this, or the following ones.
Thanks!
|  |