lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:	Thu, 7 Jul 2016 15:12:20 +0200
From:	Laurent Dufour <ldufour@...ux.vnet.ibm.com>
To:	Michael Ellerman <mpe@...erman.id.au>,
	Simon Guo <wei.guo.simon@...il.com>
Cc:	Kees Cook <keescook@...omium.org>,
	Rashmica Gupta <rashmicy@...il.com>,
	linux-kernel@...r.kernel.org, Paul Mackerras <paulus@...ba.org>,
	linuxppc-dev@...ts.ozlabs.org
Subject: Re: [v4] powerpc: Export thread_struct.used_vr/used_vsr to user space

On 07/07/2016 13:15, Michael Ellerman wrote:
> On Thu, 2016-07-07 at 07:49:36 UTC, Simon Guo wrote:
>> From: Simon Guo <wei.guo.simon@...il.com>
>>
>> These 2 fields track whether user process has used Altivec/VSX
>> registers or not. They are used by kernel to setup signal frame
>> on user stack correctly regarding vector part.
> 
> I still dislike this. It's just exporting internal kernel state, which I know is
> the point.
> 
> And I'd still like to know why we're the only arch that needs to do this.
> 
> I'm not saying I won't merge it, but I'd like to understand it better first.
> 
>> CRIU(Checkpoint and Restore In User space) builds signal frame
>> for restored process. It will need this export information to
>> setup signal frame correctly. And CRIU will need to restore these
>> 2 fields for the restored process.
> 
> I don't really know how CRIU works, but ..
> 
> Does the kernel write a sigframe for the process that's being checkpointed? If
> so can't you infer the state of the bits based on what was written?

Hi Michael,

Basically, CRIU checkpoints the process register's state through the
ptrace API, and it restores it through a signal frame at restart time.
This is quite odd but that the way it works on all the CRIU's supported
architectures.

Obviously everything is done from/in user space, so the sigframe
building too.
Since we can't know from user space if the thread has used or not the
Altivec/VSX registers, since we can't rely on the MSR bits, we always
dump these registers.

> Alternately, when restoring, can you setup the sigframe with the Altivec/VSX
> fields populated, and the kernel will then load them, regardless of whether
> they were actually used or not prior to the checkpoint?

In the case of Altivec/VSX fields, we currently force the kernel to
retrieve them from the signal frame by setting MSR_VEC/MSR_VSX so
restore_sigcontext() will copy them to the kernel thread's state.
However this doesn't touch to used_vsr and used_vr which may remain at 0.

Most of the time this is fine, but in the case a thread which has really
used those registers is catching a signal just after the restore and
before it has touched to these registers again (and so set used_vsr/vr),
these registers will not be pushed in the newly built signal frame since
setup_sigcontext() check for used_vsr/vr before pushing the registers on
the stack.
This may be an issue in the case the thread wants to changed those
registers (don't ask me why :)) in the stacked signal frame from the
signal handler since they will not be there...

Being able to get and set the used_vr and used_vsr thread's variables,
fixes this issue.

Cheers,
Laurent.

Powered by blists - more mailing lists