There is some redundant code and unnecessary function calls where inlines would be more appropriate in many of the sub-arches of i386. In addition, some subarches do not compile with certain kernel config options, which needed to be fixed. I have attempted to clean up the subarch implementation of i386 by removing the requirement of implementing a complete setup.c; instead, architectures are free to define only the hooks they actually need in the subarch headers, by introducing mach-xxx/mach_hooks.h and putting the generic definitions in arch_hooks.h. I have tested this as best as I can, and all of the subarches continue to compile (in fact, even better with the config fixes). I don't have all of the hardware combinations to actually test the generated kernels, but in general, this is fairly straightforward code movement. One liberty I took was removing the sub-arch hook for mca_nmi_handler, as it is clear this does not apply to any other subarch than Voyager. I created a new file, arch/i386/default.c, which has the default functions that are appropriate for all kernel compiles, which removes the redundant need to redefine IPI mechanisms in all architectures that provide a setup.c file. This was required, since Voyager chooses to override the entire functionality of smp.c. Comments, suggestions, anything welcome. I think this is a much cleaner approach, and both new and existing sub-architectures will benefit. I am sorry this patch is so large, but it is very difficult to separate into multiple steps that still allow all the subarches to compile. Zach