Re: Why is byteorder removed from /proc/cpuinfo?

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

 




Ralf Baechle (ralf@oss.sgi.com) writes:

> (endianess should be considered per _thread_ on MIPS!)

I tried to ignore this, but I can't.  Ralf, what an elegant idea, but
it really doesn't make much sense.  

Ralf is influenced, I think, by the fact that MIPS CPUs have two
endianness switches: a "one-time" select which needs to match some of
the rest of the hardware in your system, and is picked at reset time,
and the very dodgy status register 'RE' bit.  RE ("reverse endianness
in user mode") bit was invented in a fit of madness for the MIPS
R4000.  It was intended to make it possible to run binaries from the
little-endian DECstation on a big-endian MIPS unix system.  As far as
I know, nobody ever did the software work to make such a thing happen,
so nobody really ever found out if it would have worked.

So yes, you could try to change the RE bit between threads... but
threads generally expect to be able to share code and data.  Now:

1. MIPS code is endianness-dependent (your big- and little-endian
   threads would require separate copies of any library function, for
   example);

2. MIPS data is endianness-dependent.  The endianness-switch uses
   cheap and simple hardware and produces particularly nasty effects.
   That's OK when you are just doing a one-time select (effectively,
   the memory system inherits the CPU's endianness, hiding the
   nastiness).

   But a big-endian and little-endian thread sharing data will see
   everything mangled; in fact they'll only show mutual comprehension
   of data consisting of aligned words (either 32-bit or 64-bit,
   according to the underlying CPU).  A feature which allows you to
   tell whether you've got a 64-bit CPU while running 32-bit code is
   not good.

3. The one-time endianness switch also controls some peripheral (chip
   interface) logic.  The memory controller has to know the CPU's
   endianness to decode bus cycles, so the RE bit presumably must
   leave this alone: though on the original R4000 it happened that it
   didn't matter so long as the backward code stayed in cache...  be
   that as it may, it means this whole thing is even more broken for
   64-bit CPUs on a 32-bit bus, for example.

So:

a) Any MIPS system really does have an endianness: the kernel always
   runs in it.  Since the kernel binary is already committed to either
   big- or little-endian, it really is fairly appropriate to have a
   compile-time flag to say which.

b) Dynamic endianness is just plausible on a unix process basis
   (thread + address space), as originally planned: but the amount of
   kernel re-writing involved, plus a complete second set of dynamic
   libraries, plus endless problem in I/O make it easy to see why it
   never got done.

   Dynamic endianness on a per-thread basis would require fantasy
   hardware which operates differently from the way MIPS chips do...

--
Dominic Sweetman
Algorithmics Ltd
The Fruit Farm, Ely Road, Chittering, CAMBS CB5 9PH, ENGLAND
phone: +44 1223 706200 / fax: +44 1223 706250 / home: +44 20 7226 0032
http://www.algor.co.uk

[Index of Archives]     [Linux MIPS Home]     [LKML Archive]     [Linux ARM Kernel]     [Linux ARM]     [Linux]     [Git]     [Yosemite News]     [Linux SCSI]     [Linux Hams]

  Powered by Linux