PowerPC architecture directory layout

Peter Grehan grehan at freebsd.org
Wed Nov 1 02:42:06 UTC 2006


Hi Rafal,

> Well, I guess there is quite a lot when considering the non-traditional 
> (like BookE, IBM/AMCC 4xx) variants of PowerPC (where we have a 
> completely different MMU design, new/changed exceptions, own local 
> buses, changes to vectors handling etc.) - they are very much just a 
> different CPU happening to have a similar core, although usually with 
> new and specific machine instructions not seen on the "traditional".

  If it turns out to be too painful to keep stuff in that directory I 
guess I could live with powerpc/cpu_*/ directories. At least the 
distinction between cpu type and platform would be obvious.

> For example, see the summary of our current and forseen changes to the 
> sys/powerpc/powerpc files:
> 
> clock.c        - OF-entangled, requires at least changes to decrementer 
> initialisation

  Yes, easy to fix.

> copyinout.c    - changes required due to different MMU design, address 
> spaces management etc.

  Yep, though a very small amount of code.

> interrupt.c    - not sure yet, may require changes

  Possibly, though once again tiny.

> locore.S    - complete replacement, no common parts with existing code

  Actually, I would like to see a single entry to the kernel, with a 
switch based on the bootloader type to do any early fixups. See the 
uboot section below.

> machdep.c    - significant changes to init pieces, new helper routines, 
> and yet more to come

  Yes, but that code path is small before SYSINITs start running so is 
feasible to have a per-CPU version selected at boot.

> nexus.c        - complete replacement (existing is OF-only)

  Agreed, this is totally bogus, but it is simple to declare child nexus 
drivers and only attach if running on a particular platform.

> pmap.c        - complete replacement (new MMU design: based on TLB-only 
> approach, no segments/BATs as in "traditional" PowerPC)

  CURRENT has the required indirection, should be easy to backport to 
6.* if need be.

> swtch.S        - changes required as now is using segment regs explicitly

  Absolutely, and this is easy to indirect through a function pointer, 
or even a boot-time code patch.

> trap.c, trap_subr.S    - major changes (to complete replacement) due to 
> new exceptions, changes to their handling etc.

  Yep. My plan for the G5 was to conditionally compile this file ala 
elf32/elf64 to handle the differences between the G5 and G3/4 exception 
handling. In a way that's almost all the effort since installing vectors 
is now CPU-type specific.

> <other changes we did not come accross yet>

  Some more to look at are:

  - halt/reboot
  - the assumption that all of memory is directly addressable (pmap page 
zero code, uma small malloc etc)
  - ddb: register dumping, handling backtrace across exceptions, 
hardware breakpoint support
  - libkvm support for different mmu implementations. not even there for 
the existing one :(
  - bus space ala alpha-style function pointers rather than inline lwbrx 
instructions only applicable on PCI.
  - soft float ?

> In some of the cases we could get away with slicing the code with 
> #ifdefs, but generally these are quite deep surges.

  No #ifdefs is the goal, however lofty.

> BTW: I'm not sure why this OEA define is currently used in current 
> code/kernel config (it's some NetBSD relic, isn't it?)

  Yes, inherited from NetBSD and should be terminated.

>>  - as much runtime customization as possible.
> ...
> I share your views on the general directions, although given the actual 
> constraints it might not be that easily made generic, but we are already 
> (and will be) following this route wherever possible.

  Good.

>>  - it should be mandatory for the bootloader to pass up FreeBSD-style 
>> metadata.
> 
> Yes, we stick with metadata conventions and it will be the bootloader's 
> job to format and pass these properly. BTW: we have working changes for 
> U-Boot that supplement the 'bootm' command in a way it recognises 
> FreeBSD kernel, composes metadata in FreeBSD-expected style (limited to 
> boothowto at the moment) for it and passes control.

  That's GREAT NEWS ! Please check that in to uboot :) I'd love to use 
that on my KuroBox. Now all that is needed is a BSD-licensed jffs2 :) 
Exporting uboot Environment variables would be super-useful, and not too 
hard.

  One thing I would like to retain is the register convention on boot. 
Currently, the OpenFirmware convention is assumed, and maintained by the 
loader, allowing a direct boot from OpenFirmware (e.g. in gdb's psim or 
from the Apple ofw prompt) or the loader without change.

  I'd like to extend this slightly (using unused registers) to support 
other loaders, so here is my suggestion. The interface is C-callable:

   r1 - valid stack
   r3 - unused ? kernel start maybe ?
   r4 - unused ? metadata end maybe ala amd64 ?
   r5 - boot-loader private. Callback on openfirmware systems.
   r6 - meta-data pointer
   r7 - boot-loader type. 0 = openfirmware-direct
                          1 = freebsd-ofw-loader
                          etc

  A little weird, but it preserves compatibility with the existing 
loader and gdb psim. Actually, the loader will have to be changed a bit, 
since r7 is sizeof(void *), but that parameter isn't used.

  locore.S, or maybe even locore.c since it's C-callable, can do a 
run-through of linker sets looking for code that will handle entry from 
that boot-loader, and call it. The usual init/mi_init could be done at 
the end of the routine.

> Heh, would be nice indeed, although it's not easily done (dtc/dtd is 
> only recently getting momentum for Linux), and not very quickly I'm afraid.

  What are the issues with dtc on linux ? Looks good to me, except for 
the small number of "linux," strings embedded when phandles are used :)

> Before we have this, we employed a simplified approach for the built-in 
> devices: since they are not auto-configurable in terms the mem-mapped 
> ranges, offsets they occupy, irq lines are fixed etc. we have just one 
> pseudo device which is self-identified and early attached and added to 
> the bus, and which in turn based upon hints (derived from device.hints 
> or built-in) instantiates on the bus all peripheral devices specified in 
> hints, sets their resources as provided and so on. This is similar to 
> what ISA bus driver has.

  The issue I have with hints is that it is difficult to represent a 
hierarchy easily. You can hard-code the ".at" to point to the parent bus 
but painful.

  Also, rather than a self-identifying pseudo driver, you can put in a 
nexus child which can do the top-level attaching itself. This does 
involve fixing the existing ofw nexus driver but that is sorely overdue.

>> in my utopia, GENERIC would be able to deal with all processor types and board 
>> options, and you would only need a custom config to reduce options.
>>
> I'm not sure if this can be achieved cheaply.

  Sure, but I don't want to immediately discount it. I also don't want 
to hinder progress :) I'm sure there's a practical balance somewhere 
between the two.

later,

Peter.


More information about the freebsd-ppc mailing list