Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 24 May 2003 15:53:10 -0700 (PDT)
From:      Marcel Moolenaar <marcel@FreeBSD.org>
To:        src-committers@FreeBSD.org, cvs-src@FreeBSD.org, cvs-all@FreeBSD.org
Subject:   cvs commit: src/sys/ia64/ia64 syscall.s
Message-ID:  <200305242253.h4OMrARp010169@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
marcel      2003/05/24 15:53:10 PDT

  FreeBSD src repository

  Modified files:
    sys/ia64/ia64        syscall.s 
  Log:
  Fix a source of instability specific to an EPC userland. We return
  to userland with interrupts disabled until we restore PSR. However,
  it has been observed that interrupts do actually happen before they
  are enabled again. This is a bit surprising and I don't know yet
  what's going on exactly. Nevertheless, the code was not crafted
  carefully enough to allow interrupts to happen and we could
  clobber the kernel stack of another thread when interrupts did
  happen.
  
  This is what happens: we restore the (memory) stack pointer (sp)
  and the register stack base prior to restoring ar.k6 and ar.k7.
  This is not a problem if interrupts don't happen between setting
  sp/ar.bspstore and ar.k6/ar.k7. Alas, interrupts can happen.
  Since sp/ar.bspstore already point to the userland stacks, we
  need to switch to the kernel stack in interrupt. However, ar.k6
  and ar.k7 have not been set, which means that we were switching
  to some unrelated kstack and happily clobbered the trapframe
  present there if the thread to which the kstack belonged was
  in kernel mode or otherwise we could have our trapframe clobbered
  if that other thread enters the kernel. Nasty either way.
  
  We now carefully restore ar.k6 prior to restoring ar.bspstore and
  likewise for ar.k7 and sp. All we need is the guarantee that an
  interrupt does not clobber ar.k6 or ar.k7 before we're back in
  userland. That has been achieved by restoring ar.k6/ar.k7
  unconditionally (see exception.s)
  
  While here, remove the disabling of interrupts on EPC entry. It
  was added as a way to "resolve" the crashes until it was understood
  what was going on. I think I achieved the latter, so we can remove
  the patch. Note that setting up a trapframe with interrupts
  enabled has it's own share of corner cases, but it's better to
  properly fixed those than to keep a mostly wrong patch around
  because we're afraid to remove it...
  
  Approved by: re@ (blanket)
  
  Revision  Changes    Path
  1.2       +4 -7      src/sys/ia64/ia64/syscall.s



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200305242253.h4OMrARp010169>