lkml.org 
[lkml]   [2022]   [Mar]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v9 03/18] KVM: s390: pv: handle secure storage exceptions for normal guests
    Date
    With upcoming patches, normal guests might touch secure pages.

    This patch extends the existing exception handler to convert the pages
    to non secure also when the exception is triggered by a normal guest.

    This can happen for example when a secure guest reboots; the first
    stage of a secure guest is non secure, and in general a secure guest
    can reboot into non-secure mode.

    If the secure memory of the previous boot has not been cleared up
    completely yet (which will be allowed to happen in an upcoming patch),
    a non-secure guest might touch secure memory, which will need to be
    handled properly.

    Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
    Reviewed-by: Janosch Frank <frankja@linux.ibm.com>
    ---
    arch/s390/mm/fault.c | 13 ++++++++++++-
    1 file changed, 12 insertions(+), 1 deletion(-)

    diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c
    index 47b52e5384f8..54571a88a641 100644
    --- a/arch/s390/mm/fault.c
    +++ b/arch/s390/mm/fault.c
    @@ -770,6 +770,7 @@ void do_secure_storage_access(struct pt_regs *regs)
    struct vm_area_struct *vma;
    struct mm_struct *mm;
    struct page *page;
    + struct gmap *gmap;
    int rc;

    /*
    @@ -799,6 +800,17 @@ void do_secure_storage_access(struct pt_regs *regs)
    }

    switch (get_fault_type(regs)) {
    + case GMAP_FAULT:
    + mm = current->mm;
    + gmap = (struct gmap *)S390_lowcore.gmap;
    + mmap_read_lock(mm);
    + addr = __gmap_translate(gmap, addr);
    + mmap_read_unlock(mm);
    + if (IS_ERR_VALUE(addr)) {
    + do_fault_error(regs, VM_ACCESS_FLAGS, VM_FAULT_BADMAP);
    + break;
    + }
    + fallthrough;
    case USER_FAULT:
    mm = current->mm;
    mmap_read_lock(mm);
    @@ -827,7 +839,6 @@ void do_secure_storage_access(struct pt_regs *regs)
    if (rc)
    BUG();
    break;
    - case GMAP_FAULT:
    default:
    do_fault_error(regs, VM_READ | VM_WRITE, VM_FAULT_BADMAP);
    WARN_ON_ONCE(1);
    --
    2.34.1
    \
     
     \ /
      Last update: 2022-03-30 14:38    [W:4.643 / U:0.068 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site