Linux MIPS Architecture development
 help / color / mirror / Atom feed
* Adding(?) XI support to MIPS-Linux?
       [not found] <200806091050.m59AoUUl014012@smtp02.msg.oleane.net>
@ 2008-06-09 10:55 ` Brian Foster
  0 siblings, 0 replies; 15+ messages in thread
From: Brian Foster @ 2008-06-09 10:55 UTC (permalink / raw)
  To: linux-mips

Hello,

 The MIPS 4KSd core (at least) implements an XI (eXecute Inhibit)
 page protection bit.  XI is similar to the NX (No Execute) bit
 in the more recent AMD/Intel x86 families:  Attempts to I-fetch
 from a page with XI set cause an exception.

 I've been asked to look into the possibility/difficulty of adding
 support for XI to MIPS-Linux (at least for the 4KSd core), for
 both kernel-mode and user-land.  An admittedly very quick check
 of 2.6.25(-ish) suggests there is no support at all, at present,
 for XI for any MIPS core/configuration.  Nor has a search of the
 'Net found much of anything, with the possible exception of the
 PaX and grsecurity projects.

 Of course, I don't want to repeat work which has already been done.
 Has anyone studied adding, or better yet, already (tried to?) added,
 any support for XI?

 *Speculating*, and with the caveat I'm not completely up on MIPS
 TLB/memory-management/caches, I don't see kernel-mode as too much
 of an issue.  There's no (known to me) cases of code-in-data/stack?
 Whilst I know bugger-all about module loading/unloading, I rather
 doubt there's anything too tricky going on there?

 User-land is clearly more difficult due to the `sigreturn' and FPU
 emulation trampolines, which reside in user-land stack.  At the
 moment I am presuming a `vsyscall'-page scheme solves that problem,
 but have not researched the issue (esp. the FPU emulation) closely.
 A `vsyscall' which just contains the trampolines doesn't sound too
 difficult; but if you add to that (which I am NOT proposing!) the
 optimization of volatile time-of-day data (RO to user-land, RW to
 kernel-mode), then there would seem to be issues/gotchas with MIPS
 caching and/or page-protection?

 Does `gcc' for MIPS generate any trampolines in the stack/data?
 I keep seeing hints that `gcc' does in certain unspecified cases
 and/or architectures, but am at a lost just what is being talked
 about.  Wikipedia suggests this only happens in (some?) cases of
 nested functions; as such, for C, they don't seem necessary and
 my initial inclination is say "don't use 'em!".

 I'm hoping to be able to avoid any support at all for executable
 stacks:  I want all user-land code to have XI-set stacks.  This is
 partly for simplicity (I presume), but also because the target is
 the the "secure" embedded world, where simply being able to assert
 you cannot, never, execute code in the stack (or in data) is much
 easier to pass muster with various certification authorities and
 testing laboratories.  (PCI-PED is the area of immediate interest
 here.)  I'm aware mprotect(2), at the least, is an issue, because
 it can be used to set a page to be both writable and executable.
 (Hence, more generally, I want to be able to assert that no memory
 with the exception of kseg0/kseg1, is ever concurrently writable
 and executable.)

 Advice, suggestions, pointers, comments are very welcome.

cheers!
       -blf-

-- 
"How many surrealists does it take to   | Brian Foster
 change a lightbulb? Three. One calms   | somewhere in south of France
 the warthog, and two fill the bathtub  |   Stop E$$o (ExxonMobil)!
 with brightly-coloured machine tools." |      http://www.stopesso.com

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Re: Adding(?) XI support to MIPS-Linux?
       [not found] <200806091658.10937.brian.foster@innova-card.com>
@ 2008-06-09 15:37 ` Brian Foster
  2008-06-09 19:32   ` Kevin D. Kissell
  0 siblings, 1 reply; 15+ messages in thread
From: Brian Foster @ 2008-06-09 15:37 UTC (permalink / raw)
  To: linux-mips, Andrew Dyer

> Date: Monday 09 June 2008
> From: Andrew Dyer <adyer@righthandtech.com>
>
> Brian Foster wrote:
>>  The MIPS 4KSd core (at least) implements an XI (eXecute Inhibit)
>>  page protection bit.  XI is similar to the NX (No Execute) bit
>>  in the more recent AMD/Intel x86 families:  Attempts to I-fetch
>>  from a page with XI set cause an exception.
>
> AFAIK this is the only part with this extension, so I doubt that
> much has been done with it.
>
> I know that OpenBSD has done a bunch of work with x86 implementing
> a similar protection scheme, you might do some searching on their
> lists to see if they have any information on GCC mods required.

Andrew,

 As far as I am aware, XI is part of the SMARTMIPS extension,
 and I _think_ SMARTMIPS is only implemented by the 4KS cores?
 Whilst other companies have licensed that core from MIPS, to
 the best of my knowledge the SoC I'm concerned with (Innova
 Card's USIP Pro) is the only one running Linux.  So I suspect
 you're quite correct:  Nothing's been done.

 I've been in contact with the PaX people, and they inform me
 "the experimental NX tweaks [ for MIPS ] didn't get anywhere
 due to lack of time/interest of the guy who started it."

 The "market segment" USIP is aimed at is sufficiently touchy
 about security I currently believe it's plausible (assuming
 it's technologically possible) to simply forbid (not support)
 concurrently executable-and-writable memory.  As such, certain
 programs won't work.  Tough.  There's no call to support the
 (broken) JVM's et al. that "require" it, and I'm hoping that
 nested C/C++ functions are rare (ideally non-existent in the
 code which normally runs on USIP).  It'd be nice if such code
 either fails to compile and/or fails to link/load, but that's
 some (highly useful) porcelain.

 Broadly, what I'm trying to say is I don't want to touch gcc
 (and/or binutils) and am unconvinced I have to.  But I'm very
 much open to correction here!

 The x86 (including amd64) and, AFAIK, SuperH (sh) Linux kernels
 now support NX or equivalent; indeed, a test on my 2.6.22(-ish)
 amd64 workstation (Kubuntu 7.10) has a non-executable stack.
 As such, those could be a model worth studying/following, but
 I understand they have support for specially-marked binaries to
 have executable stacks (i.e., binutils/gcc mods, which I want to
 avoid).  It's probably worth having a look at OpenBSD (thanks
 for the suggestion!).

 Advice, suggestions, pointers, comments, corrections are very
 welcome.

cheers!
	-blf-

-- 
"How many surrealists does it take to   | Brian Foster
 change a lightbulb? Three. One calms   | somewhere in south of France
 the warthog, and two fill the bathtub  |   Stop E$$o (ExxonMobil)!
 with brightly-coloured machine tools." |      http://www.stopesso.com

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Adding(?) XI support to MIPS-Linux?
  2008-06-09 15:37 ` Re: Adding(?) XI support to MIPS-Linux? Brian Foster
@ 2008-06-09 19:32   ` Kevin D. Kissell
  2008-06-09 20:46     ` Thiemo Seufer
  2008-06-11  9:06     ` Ralf Baechle
  0 siblings, 2 replies; 15+ messages in thread
From: Kevin D. Kissell @ 2008-06-09 19:32 UTC (permalink / raw)
  To: Brian Foster; +Cc: linux-mips, Andrew Dyer

Brian Foster wrote:
> Andrew,
>
>  As far as I am aware, XI is part of the SMARTMIPS extension,
>  and I _think_ SMARTMIPS is only implemented by the 4KS cores?
>   
That is correct, though there has long been interest in having XI/RI as 
an option
for non-SmartMIPS cores and I would not be surprised if sooner or later it
became more generally available.
>  Whilst other companies have licensed that core from MIPS, to
>  the best of my knowledge the SoC I'm concerned with (Innova
>  Card's USIP Pro) is the only one running Linux.  So I suspect
>  you're quite correct:  Nothing's been done.
>   
I believe that there is at least one other 4KS-family customer working with
Linux, but they haven't been nearly as active as InnovaCard.  I had some
email exchanges with someone who was working on their kernel a couple
of years back about this very topic.  Indeed, I thought that they submitted
some patches for basic RI/XI support at one point.  Scan the linux-mips.org
archives, if they survived the rehosting.
>  I've been in contact with the PaX people, and they inform me
>  "the experimental NX tweaks [ for MIPS ] didn't get anywhere
>  due to lack of time/interest of the guy who started it."
>
>  The "market segment" USIP is aimed at is sufficiently touchy
>  about security I currently believe it's plausible (assuming
>  it's technologically possible) to simply forbid (not support)
>  concurrently executable-and-writable memory.  As such, certain
>  programs won't work.  Tough.  There's no call to support the
>  (broken) JVM's et al. that "require" it, and I'm hoping that
>  nested C/C++ functions are rare (ideally non-existent in the
>  code which normally runs on USIP).  It'd be nice if such code
>  either fails to compile and/or fails to link/load, but that's
>  some (highly useful) porcelain.
>
>  Broadly, what I'm trying to say is I don't want to touch gcc
>  (and/or binutils) and am unconvinced I have to.  But I'm very
>  much open to correction here!
>
>  The x86 (including amd64) and, AFAIK, SuperH (sh) Linux kernels
>  now support NX or equivalent; indeed, a test on my 2.6.22(-ish)
>  amd64 workstation (Kubuntu 7.10) has a non-executable stack.
>  As such, those could be a model worth studying/following, but
>  I understand they have support for specially-marked binaries to
>  have executable stacks (i.e., binutils/gcc mods, which I want to
>  avoid).
Well, strictly speaking, you wouldn't actually *need* to modify binutils
to make specially tagged binaries.  You could borrow an unused bit in
the ELF header somewhere, have the kernel recognize it, and write your
own little tool that only turns that bit on/off in an ELF file.  In the 
longer
term, I'd argue that if there's support for appropriate binary tagging in
the x86 tools, that support should simply be enabled for MIPS targets
and any other non-x86 archiectures with such support (e.g. Alpha, if
anyone still uses them).

          Regards,

          Kevin K.

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Adding(?) XI support to MIPS-Linux?
  2008-06-09 19:32   ` Kevin D. Kissell
@ 2008-06-09 20:46     ` Thiemo Seufer
       [not found]       ` <200806101119.06227.brian.foster@innova-card.com>
  2008-06-11  9:06     ` Ralf Baechle
  1 sibling, 1 reply; 15+ messages in thread
From: Thiemo Seufer @ 2008-06-09 20:46 UTC (permalink / raw)
  To: Kevin D. Kissell; +Cc: Brian Foster, linux-mips, Andrew Dyer

Kevin D. Kissell wrote:
[snip]
>>  Broadly, what I'm trying to say is I don't want to touch gcc
>>  (and/or binutils) and am unconvinced I have to.  But I'm very
>>  much open to correction here!
>>
>>  The x86 (including amd64) and, AFAIK, SuperH (sh) Linux kernels
>>  now support NX or equivalent; indeed, a test on my 2.6.22(-ish)
>>  amd64 workstation (Kubuntu 7.10) has a non-executable stack.
>>  As such, those could be a model worth studying/following, but
>>  I understand they have support for specially-marked binaries to
>>  have executable stacks (i.e., binutils/gcc mods, which I want to
>>  avoid).
> Well, strictly speaking, you wouldn't actually *need* to modify binutils
> to make specially tagged binaries.  You could borrow an unused bit in
> the ELF header somewhere, have the kernel recognize it, and write your
> own little tool that only turns that bit on/off in an ELF file.

This exists already in ld's -z execstack/noexecstack feature. It is
not used by default because too many things depend on executable
stacks on MIPS.


Thiemo

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Adding(?) XI support to MIPS-Linux?
       [not found]       ` <200806101119.06227.brian.foster@innova-card.com>
@ 2008-06-10  9:32         ` Brian Foster
  2008-06-10  9:57           ` Thiemo Seufer
  0 siblings, 1 reply; 15+ messages in thread
From: Brian Foster @ 2008-06-10  9:32 UTC (permalink / raw)
  To: Kevin D. Kissell, Andrew Dyer, Thiemo Seufer; +Cc: linux-mips

 1) Date: Mon, 09 Jun 2008 21:32:59 +0200
 1) From: "Kevin D. Kissell" <KevinK@paralogos.com>
 1)
 1) Brian Foster wrote:
 1) >  As far as I am aware, XI is part of the SMARTMIPS extension,
 1) >  and I _think_ SMARTMIPS is only implemented by the 4KS cores?
 1)
 1) That is correct, though there has long been interest in having XI/RI
 1) as an option for non-SmartMIPS cores and I would not be surprised if
 1) sooner or later it became more generally available.

Ok, thanks for the confirmation.
I'll keep this in mind w.r.t. to any proposed patches.

 1) >  Whilst other companies have licensed that core from MIPS, to
 1) >  the best of my knowledge the SoC I'm concerned with (Innova
 1) >  Card's USIP Pro) is the only one running Linux.  [ ... ]
 1)
 1) I believe that there is at least one other 4KS-family customer working
 1) with Linux, but they haven't been nearly as active as InnovaCard.
 1) I had some email exchanges with someone who was working on their kernel
 1) a couple of years back about this very topic.  Indeed, I thought that
 1) they submitted some patches for basic RI/XI support at one point.
 1) Scan the linux-mips.org archives, if they survived the rehosting.

I just spent a fair bit of the morning searching the archives,
and cannot find anything related to 4KS, SmartMIPS, XI, or RI
(except odd mentions here and there, none(?) of substance (on
this subject), and all seeming to involve Innova Card).  I'm
*very* interested in seeing/learning what others have done or
tried, so if you or anyone else has any information/whatever
that you can share, please let me know!  Thanks.

 1)[ ... ]
 1) >  Broadly, what I'm trying to say is I don't want to touch gcc
 1) >  (and/or binutils) and am unconvinced I have to.  But I'm very
 1) >  much open to correction here!
 1) >
 1) >  The x86 (including amd64) and, AFAIK, SuperH (sh) Linux kernels
 1) >  now support NX or equivalent [ ... ].
 1) >  I understand they have support for specially-marked binaries to
 1) >  have executable stacks (i.e., binutils/gcc mods, which I want to
 1) >  avoid).
 1)
 1) Well, strictly speaking, you wouldn't actually *need* to modify
 1) binutils to make specially tagged binaries.  [ ... ]

Agreed.  I was speaking loosely.

 1) In the longer term, I'd argue that if there's support for appropriate
 1) binary tagging in the x86 tools, that support should simply be enabled
 1) for MIPS targets and any other non-x86 archiectures with such support
 1) (e.g. Alpha, if anyone still uses them).

Agreed.  This is all *speculative* ATM.  There seems to be
a rational argument that for the specific situation I'm
concerned with, an absolute imposition of non-executable
stack(+data) would be "better".  In the more general
situation, including the longer term, tagged binaries are
(very probably), perhaps unfortunately, desirable.

 2) Date: Mon, 9 Jun 2008 21:46:27 +0100
 2) From: Thiemo Seufer <ths@networkno.de>
 2)
 2) Kevin D. Kissell wrote:
 2)[ ... ]
 2) > Well, strictly speaking, you wouldn't actually *need* to modify
 2) > binutils to make specially tagged binaries.  [ ... ]
 2)
 2) This exists already in ld's -z execstack/noexecstack feature.

Good point.  Thanks for the reminder.

 2) It is not used by default because too many things depend on executable
 2) stacks on MIPS.

Ah!  Can you be more specific please?  At the present time
I'm only aware of three situations where executable stacks
are magically used ("magic" meaning it's being done without
the programmer explicitly coding it):

  1. sigreturn.
  2. something to do with FPU emulation?
  3. pointer to a nested function (gcc extension).

And, significantly, I am do not know of any need for the
kernel-mode stacks to be executable.  Except, perhaps,
for case 3, the above are (should be?) user-land only.

There are also "non-magic" users (JIT in some JVMs is,
I believe, the usual example).  These deliberate users,
and case 3, I want to be able to argue I can blow off
in the specific circumstance I am concerned about.
That is, they simply fail.  Always.  But as said above,
in general and for the longer term, that's presumably
not acceptable (i.e., marked binaries are needed).

cheers!
	-blf-

-- 
"How many surrealists does it take to   | Brian Foster
 change a lightbulb? Three. One calms   | somewhere in south of France
 the warthog, and two fill the bathtub  |   Stop E$$o (ExxonMobil)!
 with brightly-coloured machine tools." |      http://www.stopesso.com

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Adding(?) XI support to MIPS-Linux?
  2008-06-10  9:32         ` Brian Foster
@ 2008-06-10  9:57           ` Thiemo Seufer
  2008-06-10 16:21             ` David Daney
  0 siblings, 1 reply; 15+ messages in thread
From: Thiemo Seufer @ 2008-06-10  9:57 UTC (permalink / raw)
  To: Brian Foster; +Cc: Kevin D. Kissell, Andrew Dyer, linux-mips

Brian Foster wrote:
[snip]
>  2) Kevin D. Kissell wrote:
>  2)[ ... ]
>  2) > Well, strictly speaking, you wouldn't actually *need* to modify
>  2) > binutils to make specially tagged binaries.  [ ... ]
>  2)
>  2) This exists already in ld's -z execstack/noexecstack feature.
> 
> Good point.  Thanks for the reminder.
> 
>  2) It is not used by default because too many things depend on executable
>  2) stacks on MIPS.
> 
> Ah!  Can you be more specific please?  At the present time
> I'm only aware of three situations where executable stacks
> are magically used ("magic" meaning it's being done without
> the programmer explicitly coding it):
> 
>   1. sigreturn.
>   2. something to do with FPU emulation?
>   3. pointer to a nested function (gcc extension).

Those, plus manually coded trampolines in e.g. foreign function
interfacing (which are typically hidden in some library). I don't
know if you can ignore that completely. :-)

> And, significantly, I am do not know of any need for the
> kernel-mode stacks to be executable.  Except, perhaps,
> for case 3, the above are (should be?) user-land only.

AFAIK nested functions are frowned upon in kernelspace.


Thiemo

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Adding(?) XI support to MIPS-Linux?
  2008-06-10  9:57           ` Thiemo Seufer
@ 2008-06-10 16:21             ` David Daney
  2008-06-11 13:16               ` Brian Foster
  0 siblings, 1 reply; 15+ messages in thread
From: David Daney @ 2008-06-10 16:21 UTC (permalink / raw)
  To: Thiemo Seufer; +Cc: Brian Foster, Kevin D. Kissell, Andrew Dyer, linux-mips

Thiemo Seufer wrote:
> Brian Foster wrote:
> [snip]
>   
>>  2) Kevin D. Kissell wrote:
>>  2)[ ... ]
>>  2) > Well, strictly speaking, you wouldn't actually *need* to modify
>>  2) > binutils to make specially tagged binaries.  [ ... ]
>>  2)
>>  2) This exists already in ld's -z execstack/noexecstack feature.
>>
>> Good point.  Thanks for the reminder.
>>
>>  2) It is not used by default because too many things depend on executable
>>  2) stacks on MIPS.
>>
>> Ah!  Can you be more specific please?  At the present time
>> I'm only aware of three situations where executable stacks
>> are magically used ("magic" meaning it's being done without
>> the programmer explicitly coding it):
>>
>>   1. sigreturn.
>>   2. something to do with FPU emulation?
>>   3. pointer to a nested function (gcc extension).
>>     
>
> Those, plus manually coded trampolines in e.g. foreign function
> interfacing (which are typically hidden in some library). I don't
> know if you can ignore that completely. :-)
>
>   
The trampolines in libffi are user allocated, so there is a choice of 
where to place them.  In libgcj (which uses the libffi trampolines) the 
trampolines are allocated on the heap and care is taken to set the 
execute permissions on the memory in question.  Other users may have 
problems, but by now most code should work as XI support has been 
present on x86 for quite some time now.

As long as there is a mechanism to make user space stacks (and heap) 
executable, there should be no problem.  People running code that 
requires it can switch off the XI support.

David Daney
>> And, significantly, I am do not know of any need for the
>> kernel-mode stacks to be executable.  Except, perhaps,
>> for case 3, the above are (should be?) user-land only.
>>     
>
> AFAIK nested functions are frowned upon in kernelspace.
>
>
> Thiemo
>
>   

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Adding(?) XI support to MIPS-Linux?
  2008-06-09 19:32   ` Kevin D. Kissell
  2008-06-09 20:46     ` Thiemo Seufer
@ 2008-06-11  9:06     ` Ralf Baechle
  2008-06-11  9:35       ` Kevin D. Kissell
  1 sibling, 1 reply; 15+ messages in thread
From: Ralf Baechle @ 2008-06-11  9:06 UTC (permalink / raw)
  To: Kevin D. Kissell; +Cc: Brian Foster, linux-mips, Andrew Dyer

On Mon, Jun 09, 2008 at 09:32:59PM +0200, Kevin D. Kissell wrote:

> That is correct, though there has long been interest in having XI/RI as an 
> option
> for non-SmartMIPS cores and I would not be surprised if sooner or later it
> became more generally available.

Cavium has it in their 64-bit core.  I haven't verified this in the docs
but apparently it is meant to be compatible with the old SmartMIPS ASE
for MIPS32.

  Ralf

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Adding(?) XI support to MIPS-Linux?
  2008-06-11  9:06     ` Ralf Baechle
@ 2008-06-11  9:35       ` Kevin D. Kissell
  0 siblings, 0 replies; 15+ messages in thread
From: Kevin D. Kissell @ 2008-06-11  9:35 UTC (permalink / raw)
  To: Ralf Baechle; +Cc: Kevin D. Kissell, Brian Foster, linux-mips, Andrew Dyer

Ralf Baechle wrote:
> On Mon, Jun 09, 2008 at 09:32:59PM +0200, Kevin D. Kissell wrote:
>
>   
>> That is correct, though there has long been interest in having XI/RI as an option for non-SmartMIPS cores and I would not be surprised if sooner or later it became more generally available.
>>     
>
> Cavium has it in their 64-bit core.  I haven't verified this in the docs
> but apparently it is meant to be compatible with the old SmartMIPS ASE
> for MIPS32.
>   
Do check the documentation.  I can't comment officially, but I can 
observe that,
in the hypothetical case where you'd want XI/RI semantics in a 64-bit 
processor,
you might use exactly the same semantics (and therefore the same kernel 
C code
support), but you might want to use different bits  for XI/RI in a 
64-bit TLB entry
than in a 32-bit TLB entry (and therefore different header file 
definitions).

          Regards,

          Kevin K.

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Adding(?) XI support to MIPS-Linux?
  2008-06-10 16:21             ` David Daney
@ 2008-06-11 13:16               ` Brian Foster
  2008-06-11 18:51                 ` Kevin D. Kissell
  2008-06-18  8:42                 ` Brian Foster
  0 siblings, 2 replies; 15+ messages in thread
From: Brian Foster @ 2008-06-11 13:16 UTC (permalink / raw)
  To: David Daney, linux-mips; +Cc: Thiemo Seufer, Kevin D. Kissell, Andrew Dyer

David Daney wrote:
> Thiemo Seufer wrote:
> > Brian Foster wrote:
> >>  2) Kevin D. Kissell wrote:
> >>  2)[... ‘ld -z noexecstack’ ] is not used by default because too many
> >>  2) things depend on executable stacks on MIPS.
> >> 
> >> Ah!  Can you be more specific please?  At the present time
> >> I'm only aware of three situations where executable stacks
> >> are magically used ("magic" meaning it's being done without
> >> the programmer explicitly coding it):
> >> 
> >>   1. sigreturn.
> >>   2. something to do with FPU emulation?
> >>   3. pointer to a nested function (gcc extension).
> > 
> > Those, plus manually coded trampolines in e.g. foreign function
> > interfacing (which are typically hidden in some library).  I don't
> > know if you can ignore that completely. :-)
> 
> The trampolines in libffi are user allocated, so there is a choice of
> where to place them.  In libgcj (which uses the libffi trampolines) the
> trampolines are allocated on the heap and care is taken to set the
> execute permissions on the memory in question.  Other users may have
> problems, but by now most code should work as XI support has been
> present on x86 for quite some time now.

 David, thanks for clarifying Thiemo's point; I wasn't
 quite sure what he meant by “foreign functions” albeit
 (as it happens) apparently guessed correctly.  And for
 the specific example of ‘libffi’ (and ‘libgcj’); that's
 a new library (to me).

> As long as there is a mechanism to make user space stacks (and heap)
> executable, there should be no problem.  People running code that
> requires it can switch off the XI support.

 Agreed.  It is (alas?) important for the general case and
 the longer term.  But it's plausible that for the specific
 case I have, it's not important and maybe not even wanted.
 (I'm working in a security paranoid/sensitive area .... .)
 Please note this is rather *speculative* ATM!

 It's case 2 (above), the trampoline that has “something
 to do with FPU emulation”, which has me concerned ATM.
 The 4KSd core does not have an FPU.  That encourages the
 use of ‘-msoft-float’ (at least for performance), but does
 not require it.  (Albeit I wonder if, in the restricted
 world I'm playing in, if it could be “required” (assuming
 it doesn't have an issue?)?  Hum .... .)

 The quick summary (which I'm sure others on this list can
 clarify/correct) is the FP trampoline, which is pushed on
 the user-land stack is, unlike sigreturn, not fixed code.
 It varies on a per-instance per-thread basis.  Hence the
 simple ‘vsyscall’ mechanism ((to be?) used for sigreturn)
 is inappropriate.

 The trampoline is only used to execute a non-FP instruction
 (<instr>) in the delay slot of an FP-instruction:

     <instr>  # Non-FP instruction to execute in user-land
     BADINST  # Bad instruction forcing return to FP emulator
     COOKIE   # Bad instruction (not executed) for verification
     <epc>    # Where to resume execution after <instr>

 Belch! ;-\  Whilst I can think of a few things that may work
 (temporarily change page permissions;  or go ahead and use
 the ‘vsyscall’ page with some interlocking magic;  or a new
 new dedicated per-thread page;  or ...?) none seem appealing.

 Suggestions?  Comments?  Prior art to study?

thanks & cheers!
	-blf-

( I'm experimenting with a new technique for posting to the
 list to save me some hassle.  It *should* work, but .... ! )
-- 
“How many surrealists does it take to   | Brian Foster
 change a lightbulb? Three. One calms   | somewhere in south of France
 the warthog, and two fill the bathtub  |   Stop E$$o (ExxonMobil)!
 with brightly-coloured machine tools.” |      http://www.stopesso.com

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Adding(?) XI support to MIPS-Linux?
  2008-06-11 13:16               ` Brian Foster
@ 2008-06-11 18:51                 ` Kevin D. Kissell
  2008-06-12 12:03                   ` Brian Foster
  2008-06-18  8:42                 ` Brian Foster
  1 sibling, 1 reply; 15+ messages in thread
From: Kevin D. Kissell @ 2008-06-11 18:51 UTC (permalink / raw)
  To: Brian Foster
  Cc: David Daney, linux-mips, Thiemo Seufer, Kevin D. Kissell,
	Andrew Dyer

Brian Foster wrote:
>  It's case 2 (above), the trampoline that has “something
>  to do with FPU emulation”, which has me concerned ATM.
>  The 4KSd core does not have an FPU.  That encourages the
>  use of ‘-msoft-float’ (at least for performance), but does
>  not require it.  (Albeit I wonder if, in the restricted
>  world I'm playing in, if it could be “required” (assuming
>  it doesn't have an issue?)?  Hum .... .)
>   
The use of -msoft-float historically required (and as far as I know 
still requires)
a completely different ground-up userland build, so it gets used less 
than you
might think.
>  The quick summary (which I'm sure others on this list can
>  clarify/correct) is the FP trampoline, which is pushed on
>  the user-land stack is, unlike sigreturn, not fixed code.
>  It varies on a per-instance per-thread basis.  Hence the
>  simple ‘vsyscall’ mechanism ((to be?) used for sigreturn)
>  is inappropriate.
>
>  The trampoline is only used to execute a non-FP instruction
>  (<instr>) in the delay slot of an FP-instruction:
>
>      <instr>  # Non-FP instruction to execute in user-land
>      BADINST  # Bad instruction forcing return to FP emulator
>      COOKIE   # Bad instruction (not executed) for verification
>      <epc>    # Where to resume execution after <instr>
>
>  Belch! ;-\  Whilst I can think of a few things that may work
>  (temporarily change page permissions;  or go ahead and use
>  the ‘vsyscall’ page with some interlocking magic;  or a new
>  new dedicated per-thread page;  or ...?) none seem appealing.
>
>  Suggestions?  Comments?  Prior art to study?
>   
As the jerk who originally bolted the FP emulator into the MIPS kernel
and came up with the stack trampoline hack, I can explain why it seemed
sane at the time.  If an FP branch is emulated and to be taken, we have to
find a way for the instruction in the delay slot to be executed prior to the
transfer of control to the branch target.  It has to execute with the user's
permissions.  Putting it on the user's stack and building a trampoline was
the fairly classical way of doing it, but note that it's architecturally 
illegal
to put a branch in a branch delay slot (floating point or otherwise), so
there's no possibility of recursion. So one only needs 3-4 words (one
could substitute another means of validation for the cookie) per
thread.  It just has to be part of the user's address space.  I suppose
that instead of using a few words just above the stack, one could use
a few words just below the current "brk()" point, or, better still (but
far more invasive) pad the text segment, which should always be
executable, with 4 words that the kernel can find in a hurry.

          Regards,

          Kevin K.

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Adding(?) XI support to MIPS-Linux?
  2008-06-11 18:51                 ` Kevin D. Kissell
@ 2008-06-12 12:03                   ` Brian Foster
  0 siblings, 0 replies; 15+ messages in thread
From: Brian Foster @ 2008-06-12 12:03 UTC (permalink / raw)
  To: Kevin D. Kissell, linux-mips
  Cc: David Daney, Thiemo Seufer, Kevin D. Kissell, Andrew Dyer

On Wednesday 11 June 2008 Kevin D. Kissell wrote:
> Brian Foster wrote:
> >[ ...  the FPU emulation ] trampoline, which is pushed on
> >  the user-land stack is, unlike sigreturn, not fixed code.
> >  It varies on a per-instance per-thread basis.  Hence the
> >  simple ‘vsyscall’ mechanism ((to be?) used for sigreturn)
> >  is inappropriate.
> >
> >  The trampoline is only used to execute a non-FP instruction
> >  (<instr>) in the delay slot of an FP-instruction  [ ... ]
> >
> >  Belch! ;-\  Whilst I can think of a few things that may work
> >  (temporarily change page permissions;  or go ahead and use
> >  the ‘vsyscall’ page with some interlocking magic;  or a new
> >  new dedicated per-thread page;  or ...?) none seem appealing.
>[ ... ]
> As the jerk who originally bolted the FP emulator into the MIPS kernel
> and came up with the stack trampoline hack, I can explain why it seemed
> sane at the time.  If an FP branch is emulated and to be taken, we have to
> find a way for the instruction in the delay slot to be executed prior to the
> transfer of control to the branch target.  It has to execute with the user's
> permissions.  Putting it on the user's stack and building a trampoline was
> the fairly classical way of doing it, but note that it's architecturally
> illegal to put a branch in a branch delay slot (floating point or otherwise),
> so there's no possibility of recursion.  So one only needs 3-4 words (one
> could substitute another means of validation for the cookie) per thread.

Jerk,  ;-)

 Yes, once I worked out what it was doing it all seemed cute
 (albeit I don't quite see what the danger is with recursion?).
 My “Belch!” was referring to the problems it now causes with
 non-executable stacks.

> It just has to be part of the user's address space.  I suppose
> that instead of using a few words just above the stack, one could use
> a few words just below the current "brk()" point, or, better still (but
> far more invasive) pad the text segment, which should always be
> executable, with 4 words that the kernel can find in a hurry.

 First, you need to really careful about multithreaded code
 concurrently doing FPU stuff.  That is, it's possible there
 may be more than one “live” emulated FPU delay slot in the
 same address space.  So stuffing the code into text, or
 near the brk()-point, or similar, all has concurrency issues.

 This is what makes the current on-the-stack approach neat;
 the stack _is_ per-thread so there's no concurrency mess.

 As for putting the trampoline near the brk()-point, besides
 the concurrency problem, there's also the issue that the
 containing page would have to be made user-executable (if
 temporarily).  Unless I'm confused, that page is nominally
 data (heap-ish).  With the addition of XI support, I would
 expect data to nominally also be non-executable.

cheers!
	-blf-

-- 
“How many surrealists does it take to   | Brian Foster
 change a lightbulb? Three. One calms   | somewhere in south of France
 the warthog, and two fill the bathtub  |   Stop E$$o (ExxonMobil)!
 with brightly-coloured machine tools.” |      http://www.stopesso.com

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Adding(?) XI support to MIPS-Linux?
  2008-06-11 13:16               ` Brian Foster
  2008-06-11 18:51                 ` Kevin D. Kissell
@ 2008-06-18  8:42                 ` Brian Foster
  2008-06-18  9:36                   ` Kevin D. Kissell
  1 sibling, 1 reply; 15+ messages in thread
From: Brian Foster @ 2008-06-18  8:42 UTC (permalink / raw)
  To: linux-mips; +Cc: David Daney, Thiemo Seufer, Kevin D. Kissell, Andrew Dyer

On Wednesday 11 June 2008 15:16:56 Brian Foster wrote:
>[ ... ]
>  It's [ ... ] the trampoline that has “something to do with
>  FPU emulation”, which has me concerned ATM.  [ ... ]
> 
>  The quick summary [ ... ] is the FP trampoline, which is pushed
>  on the user-land stack is, unlike sigreturn, not fixed code.
>  It varies on a per-instance per-thread basis.  Hence the
>  simple ‘vsyscall’ mechanism ((to be?) used for sigreturn)
>  is inappropriate.
> 
>  The trampoline is only used to execute a non-FP instruction
>  (<instr>) in the delay slot of an FP-instruction:
> 
      [ point A "before" <instr> ]
>      <instr>  # Non-FP instruction to execute in user-land
      [ point B "after" <instr> "before" BADINST ]
>      BADINST  # Bad instruction forcing return to FP emulator
>      COOKIE   # Bad instruction (not executed) for verification
>      <epc>    # Where to resume execution after <instr>
      [ user-land stack-pointer points here(-ish) ]

 Whilst thinking about the problem and possible solutions,
 it occurred to me there could be a defect in the current
 trampoline:  Suppose there is a signal, either at point A,
 due to <instr> itself, or at point B, which is caught on
 this stack, and the user-land signal-handler ‘return’s.

 Doesn't the signal-handler/sigreturn stack-frame overwrite
 the FP trampoline?   In which case, when the signal-hander
 returns, more-or-less anything could happen.  (And very
 unlikely to be what's wanted!)

cheers!
	-blf-

-- 
“How many surrealists does it take to   | Brian Foster
 change a lightbulb? Three. One calms   | somewhere in south of France
 the warthog, and two fill the bathtub  |   Stop E$$o (ExxonMobil)!
 with brightly-coloured machine tools.” |      http://www.stopesso.com

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Adding(?) XI support to MIPS-Linux?
  2008-06-18  8:42                 ` Brian Foster
@ 2008-06-18  9:36                   ` Kevin D. Kissell
  2008-06-18  9:45                     ` Brian Foster
  0 siblings, 1 reply; 15+ messages in thread
From: Kevin D. Kissell @ 2008-06-18  9:36 UTC (permalink / raw)
  To: Brian Foster; +Cc: linux-mips, David Daney, Thiemo Seufer, Andrew Dyer

Brian Foster wrote:
>  Whilst thinking about the problem and possible solutions,
>  it occurred to me there could be a defect in the current
>  trampoline:  Suppose there is a signal, either at point A,
>  due to <instr> itself, or at point B, which is caught on
>  this stack, and the user-land signal-handler ‘return’s.
>
>  Doesn't the signal-handler/sigreturn stack-frame overwrite
>  the FP trampoline?   In which case, when the signal-hander
>  returns, more-or-less anything could happen.  (And very
>  unlikely to be what's wanted!)
>   
When I first integrated the FP emulator into the kernel, back in 2.2.x, 
I seem to
recall that someone found this problem and that I came up with a tweak 
to signal
stack setup that protected the FP branch delay slot trampoline.  Maybe 
I'm mistaken,
or maybe the tweak was lost?

          Regards,

          Kevin K.

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Adding(?) XI support to MIPS-Linux?
  2008-06-18  9:36                   ` Kevin D. Kissell
@ 2008-06-18  9:45                     ` Brian Foster
  0 siblings, 0 replies; 15+ messages in thread
From: Brian Foster @ 2008-06-18  9:45 UTC (permalink / raw)
  To: Kevin D. Kissell; +Cc: linux-mips, David Daney, Thiemo Seufer, Andrew Dyer

On Wednesday 18 June 2008 11:36:53 Kevin D. Kissell wrote:
> Brian Foster wrote:
> >  Whilst thinking about the problem and possible solutions,
> >  it occurred to me there could be a defect in the current
> >  trampoline:  Suppose there is a signal, either at point A,
> >  due to <instr> itself, or at point B, which is caught on
> >  this stack, and the user-land signal-handler ‘return’s.
> >
> >  Doesn't the signal-handler/sigreturn stack-frame overwrite
> >  the FP trampoline?   [ ... ]
> 
> When I first integrated the FP emulator into the kernel, back in 2.2.x,
> I seem to recall that someone found this problem and that I came up with
> a tweak to signal stack setup that protected the FP branch delay slot
> trampoline.  Maybe I'm mistaken, or maybe the tweak was lost?

 The error is mine:  I overlooked the tweak.
 Now that you mention it / remind me of it,
 I distinctly recall it; in fact, that was
 what first alerted me to the existance of
 the FP trampoline.

sorry & cheers!
	-blf-
-- 
“How many surrealists does it take to   | Brian Foster
 change a lightbulb? Three. One calms   | somewhere in south of France
 the warthog, and two fill the bathtub  |   Stop E$$o (ExxonMobil)!
 with brightly-coloured machine tools.” |      http://www.stopesso.com

^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2008-06-18  9:45 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <200806091658.10937.brian.foster@innova-card.com>
2008-06-09 15:37 ` Re: Adding(?) XI support to MIPS-Linux? Brian Foster
2008-06-09 19:32   ` Kevin D. Kissell
2008-06-09 20:46     ` Thiemo Seufer
     [not found]       ` <200806101119.06227.brian.foster@innova-card.com>
2008-06-10  9:32         ` Brian Foster
2008-06-10  9:57           ` Thiemo Seufer
2008-06-10 16:21             ` David Daney
2008-06-11 13:16               ` Brian Foster
2008-06-11 18:51                 ` Kevin D. Kissell
2008-06-12 12:03                   ` Brian Foster
2008-06-18  8:42                 ` Brian Foster
2008-06-18  9:36                   ` Kevin D. Kissell
2008-06-18  9:45                     ` Brian Foster
2008-06-11  9:06     ` Ralf Baechle
2008-06-11  9:35       ` Kevin D. Kissell
     [not found] <200806091050.m59AoUUl014012@smtp02.msg.oleane.net>
2008-06-09 10:55 ` Brian Foster

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox