tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: updating COMPAT_LINUX for linux 2.6.x support (take 2)



On Sun, Jun 13, 2010 at 10:59:45PM -0700, Chuck Silvers wrote:
> hi folks,
> 
> ok, more progress.  linux32 is working now and I fixed a few other bugs
> along the way.
> 
> the updated diff is in
> ftp://ftp.netbsd.org/pub/NetBSD/misc/chs/linux/diff.linux-nptl-take2.36

- mips pcb_tls. Can you use curlwp->l_private instead and add a 
  cpu_lwp_setprivate() ala i386 to handle this?  As it would be the same
  mechanism that we'd use for native TLS.  There is a __HAVE flag for
  this in machine/types.h as far as I remember, see sys_lwp.c.  I created
  patches for a bunch of other architectures to do this, mjf@ is sitting
  on them I think.

- In x86 sys_machdep.c, I'd feel better if wrmsr() and set of pcb_gs etc 
  were bracketed with kpreempt_disable()/kpreempt_enable().  Likewise
  memcpy() to pcb_gsd and friends in Linux compat code.

- For the Linux compat setting of %gs/%fs, I'd rather this was done via
  a function call into native x86 code because in the past we've ended
  up with stragglers in this code, where someone working on compat does
  the wrong thing or where someone working on x86 fails to update the
  compat code. Not a strong opinion just a preference.

- FYI I think I disabled Linux ptrace() because I was concerned about
  potential security issues and bitrot in the code. Dunno if that's
  still the case.

- Re: the Linux +ucas_int() hack, preemption implies MULTIPROCESSOR
  so the kpreempt toggles aren't needed.. Maybe worthwhile as a sort
  of documentation though.
  We may context switch during the copyout so I don't see how this
  can be atomic.  If copyin() is somehow wacky I guess we could switch
  there too.  Any reason not to say "implement user space CAS or your
  port loses Linux emulation"?

- The dup code for fork1() code makes me uncomfortable.  Maybe it's
  worthwhile changing our native code so that LIDs are always allocated
  from the PID table or something along those lines?  Tend to think these
  should be globally unique with the system and not just within a process.
  Could also be of potential help with things like inter-process pthread
  objects in shared memory.

- When resetting l_lid, for safety we should hold p_lock (allthough 
  during early fork we'd probably get away with it due to the process
  being SIDL).
  If we take an approach like the above then we wouldn't need to reset
  l_lid at all.

> there is one odd thing that I haven't been able to figure out:
> I don't think we should need to reload %gs in INTRFASTEXIT on amd64
> since swapgs will put back the user's gs.base value.
> but if I take out the reload of %gs and run the 32-bit pthread tests,
> within a few minutes the system will either reset or lock up.
> anyone have any idea why this would be?  I'd appreciate it if
> someone could look over the asm code changes in general.

No clear idea about the %gs issue, sorry.



Home | Main Index | Thread Index | Old Index