Message ID | 20240709012606.748596-1-cyrevolt@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | riscv/purgatory: align riscv_kernel_entry | expand |
Hi Daniel, On 09/07/2024 03:26, Daniel Maslowski wrote: > When alignment handling is delegated to the kernel, everything must be > word-aligned in purgatory, since the trap handler is then set to the > kexec one. Without the alignment, hitting the exception would > ultimately crash. On other occasions, the kernel's handler would take > care of exceptions. > This has been tested with oreboot and its SBI delegating unaligned > access exceptions and the kernel configured to handle them. > > Signed-off-by: Daniel Maslowski <cyrevolt@gmail.com> > --- > arch/riscv/purgatory/entry.S | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/arch/riscv/purgatory/entry.S b/arch/riscv/purgatory/entry.S > index 5bcf3af903da..29121650a941 100644 > --- a/arch/riscv/purgatory/entry.S > +++ b/arch/riscv/purgatory/entry.S > @@ -34,6 +34,7 @@ SYM_CODE_END(purgatory_start) > > .data > > +.align 4 IIRC, .align on riscv takes a power of two as argument, which means you align riscv_kernel_entry symbol to 16B here, any reason for this alignment? I guess you want 4B on rv32 and 8B on rv64 right? In that case, the best here would be to use LGREG https://elixir.bootlin.com/linux/latest/source/arch/riscv/include/asm/asm.h#L29 Thanks, Alex > SYM_DATA(riscv_kernel_entry, .quad 0) > > .end
On 15/07/2024 13:46, Alexandre Ghiti wrote: > Hi Daniel, > > On 09/07/2024 03:26, Daniel Maslowski wrote: >> When alignment handling is delegated to the kernel, everything must be >> word-aligned in purgatory, since the trap handler is then set to the >> kexec one. Without the alignment, hitting the exception would >> ultimately crash. On other occasions, the kernel's handler would take >> care of exceptions. >> This has been tested with oreboot and its SBI delegating unaligned >> access exceptions and the kernel configured to handle them. >> >> Signed-off-by: Daniel Maslowski <cyrevolt@gmail.com> >> --- >> arch/riscv/purgatory/entry.S | 1 + >> 1 file changed, 1 insertion(+) >> >> diff --git a/arch/riscv/purgatory/entry.S b/arch/riscv/purgatory/entry.S >> index 5bcf3af903da..29121650a941 100644 >> --- a/arch/riscv/purgatory/entry.S >> +++ b/arch/riscv/purgatory/entry.S >> @@ -34,6 +34,7 @@ SYM_CODE_END(purgatory_start) >> .data >> +.align 4 > > > IIRC, .align on riscv takes a power of two as argument, which means > you align riscv_kernel_entry symbol to 16B here, any reason for this > alignment? I guess you want 4B on rv32 and 8B on rv64 right? In that > case, the best here would be to use LGREG > https://elixir.bootlin.com/linux/latest/source/arch/riscv/include/asm/asm.h#L29 > > Thanks, > > Alex > > >> SYM_DATA(riscv_kernel_entry, .quad 0) >> .end > > _______________________________________________ > linux-riscv mailing list > linux-riscv@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-riscv And since this is a fix, can you add a Fixes tag please? Thanks, Alex
diff --git a/arch/riscv/purgatory/entry.S b/arch/riscv/purgatory/entry.S index 5bcf3af903da..29121650a941 100644 --- a/arch/riscv/purgatory/entry.S +++ b/arch/riscv/purgatory/entry.S @@ -34,6 +34,7 @@ SYM_CODE_END(purgatory_start) .data +.align 4 SYM_DATA(riscv_kernel_entry, .quad 0) .end
When alignment handling is delegated to the kernel, everything must be word-aligned in purgatory, since the trap handler is then set to the kexec one. Without the alignment, hitting the exception would ultimately crash. On other occasions, the kernel's handler would take care of exceptions. This has been tested with oreboot and its SBI delegating unaligned access exceptions and the kernel configured to handle them. Signed-off-by: Daniel Maslowski <cyrevolt@gmail.com> --- arch/riscv/purgatory/entry.S | 1 + 1 file changed, 1 insertion(+)