> Date: Fri, 25 Sep 2020 15:18:40 +0200
> From: Peter Hessler <phess...@theapt.org>
> 
> On 2020 Sep 25 (Fri) at 14:51:01 +0200 (+0200), Mark Kettenis wrote:
> :> Date: Fri, 25 Sep 2020 14:38:23 +0200
> :> From: Peter Hessler <phess...@theapt.org>
> :> 
> :> After Mark noticed that arm64 didn't have it, I checked armv7 and it
> :> also doesn't have it.
> :> 
> :> Successfully tested on a Tinker-RK3288
> :> 
> :> OK?
> :> 
> :> 
> :> Index: sys/arch/arm/arm/fault.c
> :> ===================================================================
> :> RCS file: /home/cvs/openbsd/src/sys/arch/arm/arm/fault.c,v
> :> retrieving revision 1.41
> :> diff -u -p -u -p -r1.41 fault.c
> :> --- sys/arch/arm/arm/fault.c       14 Sep 2020 18:23:32 -0000      1.41
> :> +++ sys/arch/arm/arm/fault.c       25 Sep 2020 06:21:48 -0000
> :> @@ -331,6 +331,8 @@ data_abort_handler(trapframe_t *tf)
> :>    pcb->pcb_onfault = NULL;
> :>    KERNEL_LOCK();
> :>    error = uvm_fault(map, va, 0, ftype);
> :> +  if (error == 0)
> :
> :You need a map != kernel_map check here as this trap can be called for
> :both kernel faults and userland faults.
> :
> :> +          uvm_grow(p, va);
> :>    KERNEL_UNLOCK();
> :>    pcb->pcb_onfault = onfault;
> :>  
> :> @@ -588,6 +590,8 @@ prefetch_abort_handler(trapframe_t *tf)
> :>  
> :>    KERNEL_LOCK();
> :>    error = uvm_fault(map, va, 0, PROT_READ | PROT_EXEC);
> :> +  if (error == 0)
> :
> :But not here since this one always has map != kernel_map.
> :
> :> +          uvm_grow(p, va);
> :>    KERNEL_UNLOCK();
> :>    if (__predict_true(error == 0))
> :>            goto out;
> :> 
> 
> Thanks, fixed.

ok kettenis@

> Index: sys/arch/arm/arm/fault.c
> ===================================================================
> RCS file: /home/cvs/openbsd/src/sys/arch/arm/arm/fault.c,v
> retrieving revision 1.41
> diff -u -p -u -p -r1.41 fault.c
> --- sys/arch/arm/arm/fault.c  14 Sep 2020 18:23:32 -0000      1.41
> +++ sys/arch/arm/arm/fault.c  25 Sep 2020 13:16:55 -0000
> @@ -331,6 +331,8 @@ data_abort_handler(trapframe_t *tf)
>       pcb->pcb_onfault = NULL;
>       KERNEL_LOCK();
>       error = uvm_fault(map, va, 0, ftype);
> +     if (error == 0 && map != kernel_map)
> +             uvm_grow(p, va);
>       KERNEL_UNLOCK();
>       pcb->pcb_onfault = onfault;
>  
> @@ -588,6 +590,8 @@ prefetch_abort_handler(trapframe_t *tf)
>  
>       KERNEL_LOCK();
>       error = uvm_fault(map, va, 0, PROT_READ | PROT_EXEC);
> +     if (error == 0)
> +             uvm_grow(p, va);
>       KERNEL_UNLOCK();
>       if (__predict_true(error == 0))
>               goto out;
> 
> 
> 
> 
> :> 
> :> 
> :> On 2020 Sep 24 (Thu) at 23:16:08 +0200 (+0200), Mark Kettenis wrote:
> :> :The call is missing from the trap handler, probably because I was
> :> :looking at arm64 where it is missing as well.  The result is that the
> :> :stack size accounting will be wrong.
> :> :
> :> :In the diff below I only added the call to the "data" trap.  That
> :> :means that an "instruction" trap will not run the accounting code.  Is
> :> :that correct?  The uvm_fault() call should never return success in
> :> :that case unless the stack has been mapped executable...
> :> :
> 
> -- 
> Millihelen, adj:
>       The amount of beauty required to launch one ship.
> 

Reply via email to