On Tue, 19 Jan 2021 05:04:02 -0500 Janosch Frank <frankja@xxxxxxxxxxxxx> wrote: > Turns out that the bit 61 in the TEID is not always 1 and if that's > the case the address space ID and the address are > unpredictable. Without an address and it's address space ID we can't *its Reviewed-by: Claudio Imbrenda <imbrenda@xxxxxxxxxxxxx> > export memory and hence we can only send a SIGSEGV to the process or > panic the kernel depending on who caused the exception. > > Signed-off-by: Janosch Frank <frankja@xxxxxxxxxxxxx> > Fixes: 084ea4d611a3d ("s390/mm: add (non)secure page access > exceptions handlers") Cc: stable@xxxxxxxxxxxxxxx > --- > arch/s390/mm/fault.c | 14 ++++++++++++++ > 1 file changed, 14 insertions(+) > > diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c > index e30c7c781172..5442937e5b4b 100644 > --- a/arch/s390/mm/fault.c > +++ b/arch/s390/mm/fault.c > @@ -791,6 +791,20 @@ void do_secure_storage_access(struct pt_regs > *regs) struct page *page; > int rc; > > + /* There are cases where we don't have a TEID. */ > + if (!(regs->int_parm_long & 0x4)) { > + /* > + * Userspace could for example try to execute secure > + * storage and trigger this. We should tell it that > it > + * shouldn't do that. > + */ > + if (user_mode(regs)) { > + send_sig(SIGSEGV, current, 0); > + return; > + } else > + panic("Unexpected PGM 0x3d with TEID bit > 61=0"); > + } > + > switch (get_fault_type(regs)) { > case USER_FAULT: > mm = current->mm;