So far this patch has worked fine on my test system.
On Tue, Feb 22, 2022 at 06:41:31PM +0000, Visa Hankala wrote:
> Index: arch/riscv64/include/frame.h
> ===================================================================
> RCS file: src/sys/arch/riscv64/include/frame.h,v
> retrieving revision 1.2
> diff -u -p -r1.2 frame.h
> --- arch/riscv64/include/frame.h 12 May 2021 01:20:52 -0000 1.2
> +++ arch/riscv64/include/frame.h 22 Feb 2022 18:20:46 -0000
> @@ -64,6 +64,7 @@ typedef struct trapframe {
> register_t tf_sstatus;
> register_t tf_stval;
> register_t tf_scause;
> + register_t tf_pad;
> } trapframe_t;
>
> /*
> @@ -85,6 +86,7 @@ struct sigframe {
> struct switchframe {
> register_t sf_s[12];
> register_t sf_ra;
> + register_t sf_pad;
> };
>
> struct callframe {
> Index: arch/riscv64/riscv64/vm_machdep.c
> ===================================================================
> RCS file: src/sys/arch/riscv64/riscv64/vm_machdep.c,v
> retrieving revision 1.8
> diff -u -p -r1.8 vm_machdep.c
> --- arch/riscv64/riscv64/vm_machdep.c 22 Feb 2022 07:47:46 -0000 1.8
> +++ arch/riscv64/riscv64/vm_machdep.c 22 Feb 2022 18:20:46 -0000
> @@ -62,6 +62,10 @@ cpu_fork(struct proc *p1, struct proc *p
> struct trapframe *tf;
> struct switchframe *sf;
>
> + /* Ensure proper stack alignment. */
> + CTASSERT((sizeof(struct trapframe) & STACKALIGNBYTES) == 0);
> + CTASSERT((sizeof(struct switchframe) & STACKALIGNBYTES) == 0);
> +
> /* Save FPU state to PCB if necessary. */
> if (pcb1->pcb_flags & PCB_FPU)
> fpu_save(p1, pcb1->pcb_tf);
> @@ -74,6 +78,7 @@ cpu_fork(struct proc *p1, struct proc *p
> tf = (struct trapframe *)((u_long)p2->p_addr
> + USPACE
> - sizeof(struct trapframe)
> + - sizeof(register_t) /* for holding curcpu */
> - 0x10);
>
> tf = (struct trapframe *)STACKALIGN(tf);
>