Skip to content
Snippets Groups Projects
Select Git revision
  • 2f478b60118f48bf66eaddcca0d23e80f87a682d
  • vme-testing default
  • ci-test
  • master
  • remoteproc
  • am625-sk-ov5640
  • pcal6534-upstreaming
  • lps22df-upstreaming
  • msc-upstreaming
  • imx8mp
  • iio/noa1305
  • vme-next
  • vme-next-4.14-rc4
  • v4.14-rc4
  • v4.14-rc3
  • v4.14-rc2
  • v4.14-rc1
  • v4.13
  • vme-next-4.13-rc7
  • v4.13-rc7
  • v4.13-rc6
  • v4.13-rc5
  • v4.13-rc4
  • v4.13-rc3
  • v4.13-rc2
  • v4.13-rc1
  • v4.12
  • v4.12-rc7
  • v4.12-rc6
  • v4.12-rc5
  • v4.12-rc4
  • v4.12-rc3
32 results

process.c

  • Vincent Chen's avatar
    8ac71d7e
    riscv: Correct the initialized flow of FP register · 8ac71d7e
    Vincent Chen authored
    
      The following two reasons cause FP registers are sometimes not
    initialized before starting the user program.
    1. Currently, the FP context is initialized in flush_thread() function
       and we expect these initial values to be restored to FP register when
       doing FP context switch. However, the FP context switch only occurs in
       switch_to function. Hence, if this process does not be scheduled out
       and scheduled in before entering the user space, the FP registers
       have no chance to initialize.
    2. In flush_thread(), the state of reg->sstatus.FS inherits from the
       parent. Hence, the state of reg->sstatus.FS may be dirty. If this
       process is scheduled out during flush_thread() and initializing the
       FP register, the fstate_save() in switch_to will corrupt the FP context
       which has been initialized until flush_thread().
    
      To solve the 1st case, the initialization of the FP register will be
    completed in start_thread(). It makes sure all FP registers are initialized
    before starting the user program. For the 2nd case, the state of
    reg->sstatus.FS in start_thread will be set to SR_FS_OFF to prevent this
    process from corrupting FP context in doing context save. The FP state is
    set to SR_FS_INITIAL in start_trhead().
    
    Signed-off-by: default avatarVincent Chen <vincent.chen@sifive.com>
    Reviewed-by: default avatarAnup Patel <anup@brainfault.org>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Fixes: 7db91e57 ("RISC-V: Task implementation")
    Cc: stable@vger.kernel.org
    [paul.walmsley@sifive.com: fixed brace alignment issue reported by
     checkpatch]
    Signed-off-by: default avatarPaul Walmsley <paul.walmsley@sifive.com>
    8ac71d7e
    History
    riscv: Correct the initialized flow of FP register
    Vincent Chen authored
    
      The following two reasons cause FP registers are sometimes not
    initialized before starting the user program.
    1. Currently, the FP context is initialized in flush_thread() function
       and we expect these initial values to be restored to FP register when
       doing FP context switch. However, the FP context switch only occurs in
       switch_to function. Hence, if this process does not be scheduled out
       and scheduled in before entering the user space, the FP registers
       have no chance to initialize.
    2. In flush_thread(), the state of reg->sstatus.FS inherits from the
       parent. Hence, the state of reg->sstatus.FS may be dirty. If this
       process is scheduled out during flush_thread() and initializing the
       FP register, the fstate_save() in switch_to will corrupt the FP context
       which has been initialized until flush_thread().
    
      To solve the 1st case, the initialization of the FP register will be
    completed in start_thread(). It makes sure all FP registers are initialized
    before starting the user program. For the 2nd case, the state of
    reg->sstatus.FS in start_thread will be set to SR_FS_OFF to prevent this
    process from corrupting FP context in doing context save. The FP state is
    set to SR_FS_INITIAL in start_trhead().
    
    Signed-off-by: default avatarVincent Chen <vincent.chen@sifive.com>
    Reviewed-by: default avatarAnup Patel <anup@brainfault.org>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Fixes: 7db91e57 ("RISC-V: Task implementation")
    Cc: stable@vger.kernel.org
    [paul.walmsley@sifive.com: fixed brace alignment issue reported by
     checkpatch]
    Signed-off-by: default avatarPaul Walmsley <paul.walmsley@sifive.com>