Index: kernel/arch/abs32le/src/abs32le.c
===================================================================
--- kernel/arch/abs32le/src/abs32le.c	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/arch/abs32le/src/abs32le.c	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -51,12 +51,16 @@
 #include <memstr.h>
 
+static void abs32le_post_mm_init(void);
+
+arch_ops_t abs32le_ops = {
+	.post_mm_init = abs32le_post_mm_init,
+};
+
+arch_ops_t *arch_ops = &abs32le_ops;
+
 char memcpy_from_uspace_failover_address;
 char memcpy_to_uspace_failover_address;
 
-void arch_pre_mm_init(void)
-{
-}
-
-void arch_post_mm_init(void)
+void abs32le_post_mm_init(void)
 {
 	if (config.cpu_active == 1) {
@@ -67,16 +71,4 @@
 		zone_merge_all();
 	}
-}
-
-void arch_post_cpu_init(void)
-{
-}
-
-void arch_pre_smp_init(void)
-{
-}
-
-void arch_post_smp_init(void)
-{
 }
 
Index: kernel/arch/amd64/include/arch/arch.h
===================================================================
--- kernel/arch/amd64/include/arch/arch.h	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/arch/amd64/include/arch/arch.h	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -36,7 +36,5 @@
 #define KERN_amd64_ARCH_H_
 
-#include <genarch/multiboot/multiboot.h>
-
-extern void arch_pre_main(uint32_t, void *);
+extern void amd64_pre_main(uint32_t, void *);
 
 #endif
Index: kernel/arch/amd64/src/amd64.c
===================================================================
--- kernel/arch/amd64/src/amd64.c	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/arch/amd64/src/amd64.c	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -34,4 +34,5 @@
 
 #include <arch.h>
+#include <arch/arch.h>
 #include <typedefs.h>
 #include <errno.h>
@@ -64,4 +65,20 @@
 #endif
 
+static void amd64_pre_mm_init(void);
+static void amd64_post_mm_init(void);
+static void amd64_post_cpu_init(void);
+static void amd64_pre_smp_init(void);
+static void amd64_post_smp_init(void);
+
+arch_ops_t amd64_ops = {
+	.pre_mm_init = amd64_pre_mm_init,
+	.post_mm_init = amd64_post_mm_init,
+	.post_cpu_init = amd64_post_cpu_init,
+	.pre_smp_init = amd64_pre_smp_init,
+	.post_smp_init = amd64_post_smp_init
+};
+
+arch_ops_t *arch_ops = &amd64_ops;
+
 /** Perform amd64-specific initialization before main_bsp() is called.
  *
@@ -70,5 +87,5 @@
  *
  */
-void arch_pre_main(uint32_t signature, void *info)
+void amd64_pre_main(uint32_t signature, void *info)
 {
 	/* Parse multiboot information obtained from the bootloader. */
@@ -83,5 +100,5 @@
 }
 
-void arch_pre_mm_init(void)
+void amd64_pre_mm_init(void)
 {
 	/* Enable no-execute pages */
@@ -107,6 +124,5 @@
 }
 
-
-void arch_post_mm_init(void)
+void amd64_post_mm_init(void)
 {
 	vreg_init();
@@ -144,5 +160,5 @@
 }
 
-void arch_post_cpu_init(void)
+void amd64_post_cpu_init(void)
 {
 #ifdef CONFIG_SMP
@@ -154,5 +170,5 @@
 }
 
-void arch_pre_smp_init(void)
+void amd64_pre_smp_init(void)
 {
 	if (config.cpu_active == 1) {
@@ -163,5 +179,5 @@
 }
 
-void arch_post_smp_init(void)
+void amd64_post_smp_init(void)
 {
 	/* Currently the only supported platform for amd64 is 'pc'. */
Index: kernel/arch/amd64/src/boot/multiboot.S
===================================================================
--- kernel/arch/amd64/src/boot/multiboot.S	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/arch/amd64/src/boot/multiboot.S	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -427,8 +427,8 @@
 	long_status $status_long
 	
-	/* Call arch_pre_main(multiboot_eax, multiboot_ebx) */
+	/* Call amd64_pre_main(multiboot_eax, multiboot_ebx) */
 	movl multiboot_eax, %edi
 	movl multiboot_ebx, %esi
-	callq arch_pre_main
+	callq amd64_pre_main
 
 	long_status $status_main
Index: kernel/arch/amd64/src/boot/multiboot2.S
===================================================================
--- kernel/arch/amd64/src/boot/multiboot2.S	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/arch/amd64/src/boot/multiboot2.S	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -250,8 +250,8 @@
 	movq %rsp, %rbp
 	
-	/* Call arch_pre_main(multiboot_eax, multiboot_ebx) */
+	/* Call amd64_pre_main(multiboot_eax, multiboot_ebx) */
 	movl multiboot_eax, %edi
 	movl multiboot_ebx, %esi
-	callq arch_pre_main 
+	callq amd64_pre_main 
 	
 	/* Call main_bsp() */
Index: kernel/arch/arm32/include/arch/arch.h
===================================================================
--- kernel/arch/arm32/include/arch/arch.h	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/arch/arm32/include/arch/arch.h	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -55,5 +55,5 @@
 } bootinfo_t;
 
-extern void arch_pre_main(void *entry, bootinfo_t *bootinfo);
+extern void arm32_pre_main(void *entry, bootinfo_t *bootinfo);
 
 #endif
Index: kernel/arch/arm32/src/arm32.c
===================================================================
--- kernel/arch/arm32/src/arm32.c	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/arch/arm32/src/arm32.c	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -35,4 +35,5 @@
 
 #include <arch.h>
+#include <arch/arch.h>
 #include <config.h>
 #include <genarch/fb/fb.h>
@@ -51,6 +52,19 @@
 #include <sysinfo/sysinfo.h>
 
+static void arm32_pre_mm_init(void);
+static void arm32_post_mm_init(void);
+static void arm32_post_smp_init(void);
+
+arch_ops_t arm32_ops = {
+	.pre_mm_init = arm32_pre_mm_init,
+	.post_mm_init = arm32_post_mm_init,
+	.post_smp_init = arm32_post_smp_init,
+};
+
+arch_ops_t *arch_ops = &arm32_ops;
+
+
 /** Performs arm32-specific initialization before main_bsp() is called. */
-void arch_pre_main(void *entry __attribute__((unused)), bootinfo_t *bootinfo)
+void arm32_pre_main(void *entry __attribute__((unused)), bootinfo_t *bootinfo)
 {
 	init.cnt = min3(bootinfo->cnt, TASKMAP_MAX_RECORDS, CONFIG_INIT_TASKS);
@@ -69,5 +83,5 @@
 
 /** Performs arm32 specific initialization before mm is initialized. */
-void arch_pre_mm_init(void)
+void arm32_pre_mm_init(void)
 {
 	/* It is not assumed by default */
@@ -76,5 +90,5 @@
 
 /** Performs arm32 specific initialization afterr mm is initialized. */
-void arch_post_mm_init(void)
+void arm32_post_mm_init(void)
 {
 	machine_init();
@@ -90,23 +104,4 @@
 }
 
-/** Performs arm32 specific tasks needed after cpu is initialized.
- *
- * Currently the function is empty.
- */
-void arch_post_cpu_init(void)
-{
-}
-
-
-/** Performs arm32 specific tasks needed before the multiprocessing is
- * initialized.
- *
- * Currently the function is empty because SMP is not supported.
- */
-void arch_pre_smp_init(void)
-{
-}
-
-
 /** Performs arm32 specific tasks needed after the multiprocessing is
  * initialized.
@@ -114,5 +109,5 @@
  * Currently the function is empty because SMP is not supported.
  */
-void arch_post_smp_init(void)
+void arm32_post_smp_init(void)
 {
 	machine_input_init();
Index: kernel/arch/arm32/src/start.S
===================================================================
--- kernel/arch/arm32/src/start.S	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/arch/arm32/src/start.S	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -63,5 +63,5 @@
 	ldr sp, =temp_stack
 	
-	bl arch_pre_main
+	bl arm32_pre_main
 	
 	#
Index: kernel/arch/ia32/include/arch/arch.h
===================================================================
--- kernel/arch/ia32/include/arch/arch.h	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/arch/ia32/include/arch/arch.h	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -38,5 +38,5 @@
 #include <typedefs.h>
 
-extern void arch_pre_main(uint32_t, void *);
+extern void ia32_pre_main(uint32_t, void *);
 
 #endif
Index: kernel/arch/ia32/src/boot/multiboot.S
===================================================================
--- kernel/arch/ia32/src/boot/multiboot.S	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/arch/ia32/src/boot/multiboot.S	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -142,8 +142,8 @@
 	pm2_status $status_prot3
 	
-	/* Call arch_pre_main(multiboot_eax, multiboot_ebx) */
+	/* Call ia32_pre_main(multiboot_eax, multiboot_ebx) */
 	pushl multiboot_ebx
 	pushl multiboot_eax
-	call arch_pre_main
+	call ia32_pre_main
 	
 	pm2_status $status_main
Index: kernel/arch/ia32/src/boot/multiboot2.S
===================================================================
--- kernel/arch/ia32/src/boot/multiboot2.S	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/arch/ia32/src/boot/multiboot2.S	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -178,8 +178,8 @@
 	movl %esp, %ebp
 	
-	/* Call arch_pre_main(multiboot_eax, multiboot_ebx) */
+	/* Call ia32_pre_main(multiboot_eax, multiboot_ebx) */
 	pushl multiboot_ebx
 	pushl multiboot_eax
-	call arch_pre_main
+	call ia32_pre_main
 	
 	/* Call main_bsp() */
Index: kernel/arch/ia32/src/ia32.c
===================================================================
--- kernel/arch/ia32/src/ia32.c	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/arch/ia32/src/ia32.c	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -36,4 +36,5 @@
 
 #include <arch.h>
+#include <arch/arch.h>
 #include <typedefs.h>
 #include <errno.h>
@@ -64,4 +65,20 @@
 #endif
 
+static void ia32_pre_mm_init(void);
+static void ia32_post_mm_init(void);
+static void ia32_post_cpu_init(void);
+static void ia32_pre_smp_init(void);
+static void ia32_post_smp_init(void);
+
+arch_ops_t ia32_ops = {
+	.pre_mm_init = ia32_pre_mm_init,
+	.post_mm_init = ia32_post_mm_init,
+	.post_cpu_init = ia32_post_cpu_init,
+	.pre_smp_init = ia32_pre_smp_init,
+	.post_smp_init = ia32_post_smp_init,
+};
+
+arch_ops_t *arch_ops = &ia32_ops;
+
 /** Perform ia32-specific initialization before main_bsp() is called.
  *
@@ -70,5 +87,5 @@
  *
  */
-void arch_pre_main(uint32_t signature, void *info)
+void ia32_pre_main(uint32_t signature, void *info)
 {
 	/* Parse multiboot information obtained from the bootloader. */
@@ -83,5 +100,5 @@
 }
 
-void arch_pre_mm_init(void)
+void ia32_pre_mm_init(void)
 {
 	pm_init();
@@ -96,5 +113,5 @@
 }
 
-void arch_post_mm_init(void)
+void ia32_post_mm_init(void)
 {
 	vreg_init();
@@ -129,5 +146,5 @@
 }
 
-void arch_post_cpu_init(void)
+void ia32_post_cpu_init(void)
 {
 #ifdef CONFIG_SMP
@@ -139,5 +156,5 @@
 }
 
-void arch_pre_smp_init(void)
+void ia32_pre_smp_init(void)
 {
 	if (config.cpu_active == 1) {
@@ -148,5 +165,5 @@
 }
 
-void arch_post_smp_init(void)
+void ia32_post_smp_init(void)
 {
 	/* Currently the only supported platform for ia32 is 'pc'. */
Index: kernel/arch/ia64/include/arch/arch.h
===================================================================
--- kernel/arch/ia64/include/arch/arch.h	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/arch/ia64/include/arch/arch.h	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -36,5 +36,5 @@
 #define KERN_ia64_ARCH_H_
 
-extern void arch_pre_main(void);
+extern void ia64_pre_main(void);
 
 #endif
Index: kernel/arch/ia64/src/ia64.c
===================================================================
--- kernel/arch/ia64/src/ia64.c	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/arch/ia64/src/ia64.c	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -34,4 +34,5 @@
 
 #include <arch.h>
+#include <arch/arch.h>
 #include <typedefs.h>
 #include <errno.h>
@@ -60,4 +61,16 @@
 #endif
 
+static void ia64_pre_mm_init(void);
+static void ia64_post_mm_init(void);
+static void ia64_post_smp_init(void);
+
+arch_ops_t ia64_ops = {
+	.pre_mm_init = ia64_pre_mm_init,
+	.post_mm_init = ia64_post_mm_init,
+	.post_smp_init = ia64_post_smp_init,
+};
+
+arch_ops_t *arch_ops = &ia64_ops;
+
 /* NS16550 as a COM 1 */
 #define NS16550_IRQ  (4 + LEGACY_INTERRUPT_BASE)
@@ -69,5 +82,5 @@
 
 /** Performs ia64-specific initialization before main_bsp() is called. */
-void arch_pre_main(void)
+void ia64_pre_main(void)
 {
 	init.cnt = min3(bootinfo->taskmap.cnt, TASKMAP_MAX_RECORDS,
@@ -84,5 +97,5 @@
 }
 
-void arch_pre_mm_init(void)
+void ia64_pre_mm_init(void)
 {
 	if (config.cpu_active == 1)
@@ -117,5 +130,5 @@
 }
 
-void arch_post_mm_init(void)
+void ia64_post_mm_init(void)
 {
 	if (config.cpu_active == 1) {
@@ -130,13 +143,5 @@
 }
 
-void arch_post_cpu_init(void)
-{
-}
-
-void arch_pre_smp_init(void)
-{
-}
-
-void arch_post_smp_init(void)
+void ia64_post_smp_init(void)
 {
 	static const char *platform;
Index: kernel/arch/ia64/src/start.S
===================================================================
--- kernel/arch/ia64/src/start.S	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/arch/ia64/src/start.S	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -158,5 +158,5 @@
 	srlz.d ;;
 	
-	br.call.sptk.many b0 = arch_pre_main
+	br.call.sptk.many b0 = ia64_pre_main
 0:
 	br.call.sptk.many b0 = main_bsp
Index: kernel/arch/mips32/include/arch/arch.h
===================================================================
--- kernel/arch/mips32/include/arch/arch.h	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/arch/mips32/include/arch/arch.h	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -63,5 +63,5 @@
 } bootinfo_t;
 
-extern void arch_pre_main(void *entry, bootinfo_t *bootinfo);
+extern void mips32_pre_main(void *entry, bootinfo_t *bootinfo);
 
 #endif
Index: kernel/arch/mips32/src/mips32.c
===================================================================
--- kernel/arch/mips32/src/mips32.c	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/arch/mips32/src/mips32.c	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -34,4 +34,5 @@
 
 #include <arch.h>
+#include <arch/arch.h>
 #include <typedefs.h>
 #include <errno.h>
@@ -56,4 +57,15 @@
 #define CACHE_EXC  ((char *) 0x80000100)
 
+static void mips32_pre_mm_init(void);
+static void mips32_post_mm_init(void);
+static void mips32_post_smp_init(void);
+
+arch_ops_t mips32_ops = {
+	.pre_mm_init = mips32_pre_mm_init,
+	.post_mm_init = mips32_post_mm_init,
+	.post_smp_init = mips32_post_smp_init,
+};
+
+arch_ops_t *arch_ops = &mips32_ops;
 
 /* Why the linker moves the variable 64K away in assembler
@@ -71,5 +83,5 @@
 
 /** Performs mips32-specific initialization before main_bsp() is called. */
-void arch_pre_main(void *entry __attribute__((unused)), bootinfo_t *bootinfo)
+void mips32_pre_main(void *entry __attribute__((unused)), bootinfo_t *bootinfo)
 {
 	init.cnt = min3(bootinfo->cnt, TASKMAP_MAX_RECORDS, CONFIG_INIT_TASKS);
@@ -96,5 +108,5 @@
 }
 
-void arch_pre_mm_init(void)
+void mips32_pre_mm_init(void)
 {
 	/* It is not assumed by default */
@@ -127,5 +139,5 @@
 }
 
-void arch_post_mm_init(void)
+void mips32_post_mm_init(void)
 {
 	interrupt_init();
@@ -135,13 +147,5 @@
 }
 
-void arch_post_cpu_init(void)
-{
-}
-
-void arch_pre_smp_init(void)
-{
-}
-
-void arch_post_smp_init(void)
+void mips32_post_smp_init(void)
 {
 	/* Set platform name. */
Index: kernel/arch/mips32/src/start.S
===================================================================
--- kernel/arch/mips32/src/start.S	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/arch/mips32/src/start.S	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -196,5 +196,5 @@
 	
 	/* $a1 contains physical address of bootinfo_t */
-	jal arch_pre_main
+	jal mips32_pre_main
 	addiu $sp, -ABI_STACK_FRAME
 	
Index: kernel/arch/ppc32/include/arch/arch.h
===================================================================
--- kernel/arch/ppc32/include/arch/arch.h	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/arch/ppc32/include/arch/arch.h	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -38,5 +38,5 @@
 #include <arch/boot/boot.h>
 
-extern void arch_pre_main(bootinfo_t *);
+extern void ppc32_pre_main(bootinfo_t *);
 
 #endif
Index: kernel/arch/ppc32/src/boot/boot.S
===================================================================
--- kernel/arch/ppc32/src/boot/boot.S	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/arch/ppc32/src/boot/boot.S	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -48,5 +48,5 @@
 	
 	addis r3, r3, 0x8000
-	bl arch_pre_main
+	bl ppc32_pre_main
 	b main_bsp
 
Index: kernel/arch/ppc32/src/ppc32.c
===================================================================
--- kernel/arch/ppc32/src/ppc32.c	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/arch/ppc32/src/ppc32.c	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -33,6 +33,7 @@
  */
 
+#include <arch.h>
+#include <arch/arch.h>
 #include <config.h>
-#include <arch.h>
 #include <arch/boot/boot.h>
 #include <genarch/drivers/via-cuda/cuda.h>
@@ -61,4 +62,16 @@
 #define IRQ_CUDA   10
 
+static void ppc32_pre_mm_init(void);
+static void ppc32_post_mm_init(void);
+static void ppc32_post_smp_init(void);
+
+arch_ops_t ppc32_ops = {
+	.pre_mm_init = ppc32_pre_mm_init,
+	.post_mm_init = ppc32_post_mm_init,
+	.post_smp_init = ppc32_post_smp_init,
+};
+
+arch_ops_t *arch_ops = &ppc32_ops;
+
 bootinfo_t bootinfo;
 
@@ -67,5 +80,5 @@
 
 /** Performs ppc32-specific initialization before main_bsp() is called. */
-void arch_pre_main(bootinfo_t *bootinfo)
+void ppc32_pre_main(bootinfo_t *bootinfo)
 {
 	/* Copy tasks map. */
@@ -95,5 +108,5 @@
 }
 
-void arch_pre_mm_init(void)
+void ppc32_pre_mm_init(void)
 {
 	/* Initialize dispatch table */
@@ -192,5 +205,5 @@
 #endif
 
-void arch_post_mm_init(void)
+void ppc32_post_mm_init(void)
 {
 	if (config.cpu_active == 1) {
@@ -207,12 +220,4 @@
 		zone_merge_all();
 	}
-}
-
-void arch_post_cpu_init(void)
-{
-}
-
-void arch_pre_smp_init(void)
-{
 }
 
@@ -273,5 +278,5 @@
 }
 
-void arch_post_smp_init(void)
+void ppc32_post_smp_init(void)
 {
 	/* Currently the only supported platform for ppc32 is 'mac'. */
Index: kernel/arch/sparc32/include/arch/arch.h
===================================================================
--- kernel/arch/sparc32/include/arch/arch.h	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/arch/sparc32/include/arch/arch.h	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -75,5 +75,5 @@
 } bootinfo_t;
 
-extern void arch_pre_main(void *, bootinfo_t *);
+extern void sparc32_pre_main(void *, bootinfo_t *);
 extern void write_to_invalid(uint32_t, uint32_t, uint32_t);
 extern void read_from_invalid(uint32_t *, uint32_t *, uint32_t *);
Index: kernel/arch/sparc32/include/arch/machine_func.h
===================================================================
--- kernel/arch/sparc32/include/arch/machine_func.h	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/arch/sparc32/include/arch/machine_func.h	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -42,5 +42,5 @@
 #define KERN_sparc32_MACHINE_FUNC_H_
 
-#include <arch.h>
+#include <arch/arch.h>
 
 #include <console/console.h>
Index: kernel/arch/sparc32/src/debug/stacktrace.c
===================================================================
--- kernel/arch/sparc32/src/debug/stacktrace.c	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/arch/sparc32/src/debug/stacktrace.c	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -37,5 +37,5 @@
 #include <syscall/copy.h>
 #include <typedefs.h>
-#include <arch.h>
+#include <arch/arch.h>
 #include <arch/stack.h>
 #include <proc/thread.h>
Index: kernel/arch/sparc32/src/machine_func.c
===================================================================
--- kernel/arch/sparc32/src/machine_func.c	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/arch/sparc32/src/machine_func.c	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -40,4 +40,5 @@
 #include <arch/machine_func.h>
 #include <arch/machine/leon3/leon3.h>
+#include <arch/arch.h>
 
 /** Pointer to machine_ops structure being used. */
Index: kernel/arch/sparc32/src/mm/page.c
===================================================================
--- kernel/arch/sparc32/src/mm/page.c	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/arch/sparc32/src/mm/page.c	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -46,4 +46,5 @@
 #include <func.h>
 #include <arch/interrupt.h>
+#include <arch/arch.h>
 #include <arch/asm.h>
 #include <debug.h>
Index: kernel/arch/sparc32/src/sparc32.c
===================================================================
--- kernel/arch/sparc32/src/sparc32.c	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/arch/sparc32/src/sparc32.c	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -34,4 +34,5 @@
 
 #include <arch.h>
+#include <arch/arch.h>
 #include <typedefs.h>
 #include <arch/interrupt.h>
@@ -54,4 +55,14 @@
 #include <str.h>
 
+static void sparc32_post_mm_init(void);
+static void sparc32_post_smp_init(void);
+
+arch_ops_t sparc32_ops = {
+	.post_mm_init = sparc32_post_mm_init,
+	.post_smp_init = sparc32_post_smp_init,
+};
+
+arch_ops_t *arch_ops = &sparc32_ops;
+
 char memcpy_from_uspace_failover_address;
 char memcpy_to_uspace_failover_address;
@@ -59,5 +70,5 @@
 static bootinfo_t machine_bootinfo;
 
-void arch_pre_main(void *unused, bootinfo_t *bootinfo)
+void sparc32_pre_main(void *unused, bootinfo_t *bootinfo)
 {
 	init.cnt = min3(bootinfo->cnt, TASKMAP_MAX_RECORDS, CONFIG_INIT_TASKS);
@@ -74,11 +85,5 @@
 }
 
-void arch_pre_mm_init(void)
-{
-}
-
-extern void func1(void);
-
-void arch_post_mm_init(void)
+void sparc32_post_mm_init(void)
 {
 	machine_init(&machine_bootinfo);
@@ -95,14 +100,5 @@
 }
 
-
-void arch_post_cpu_init(void)
-{
-}
-
-void arch_pre_smp_init(void)
-{
-}
-
-void arch_post_smp_init(void)
+void sparc32_post_smp_init(void)
 {
 	machine_input_init();
Index: kernel/arch/sparc32/src/start.S
===================================================================
--- kernel/arch/sparc32/src/start.S	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/arch/sparc32/src/start.S	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -59,5 +59,5 @@
 	
 	mov %l1, %o1
-	call arch_pre_main
+	call sparc32_pre_main
 	nop
 	
Index: kernel/arch/sparc32/src/userspace.c
===================================================================
--- kernel/arch/sparc32/src/userspace.c	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/arch/sparc32/src/userspace.c	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -35,5 +35,5 @@
 #include <userspace.h>
 #include <typedefs.h>
-#include <arch.h>
+#include <arch/arch.h>
 #include <arch/asm.h>
 #include <abi/proc/uarg.h>
Index: kernel/arch/sparc64/include/arch/arch.h
===================================================================
--- kernel/arch/sparc64/include/arch/arch.h	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/arch/sparc64/include/arch/arch.h	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -53,5 +53,5 @@
 #ifndef __ASM__
 
-extern void arch_pre_main(bootinfo_t *);
+extern void sparc64_pre_main(bootinfo_t *);
 
 #endif /* __ASM__ */
Index: kernel/arch/sparc64/src/sun4u/sparc64.c
===================================================================
--- kernel/arch/sparc64/src/sun4u/sparc64.c	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/arch/sparc64/src/sun4u/sparc64.c	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -34,4 +34,5 @@
 
 #include <arch.h>
+#include <arch/arch.h>
 #include <debug.h>
 #include <config.h>
@@ -52,8 +53,20 @@
 #include <sysinfo/sysinfo.h>
 
+static void sparc64_pre_mm_init(void);
+static void sparc64_post_mm_init(void);
+static void sparc64_post_smp_init(void);
+
+arch_ops_t sparc64_ops = {
+	.pre_mm_init = sparc64_pre_mm_init,
+	.post_mm_init = sparc64_post_mm_init,
+	.post_smp_init = sparc64_post_smp_init,
+};
+
+arch_ops_t *arch_ops = &sparc64_ops;
+
 memmap_t memmap;
 
 /** Perform sparc64-specific initialization before main_bsp() is called. */
-void arch_pre_main(bootinfo_t *bootinfo)
+void sparc64_pre_main(bootinfo_t *bootinfo)
 {
 	/* Copy init task info. */
@@ -84,5 +97,5 @@
 
 /** Perform sparc64 specific initialization before mm is initialized. */
-void arch_pre_mm_init(void)
+void sparc64_pre_mm_init(void)
 {
 	if (config.cpu_active == 1) {
@@ -93,5 +106,5 @@
 
 /** Perform sparc64 specific initialization afterr mm is initialized. */
-void arch_post_mm_init(void)
+void sparc64_post_mm_init(void)
 {
 	if (config.cpu_active == 1) {
@@ -107,13 +120,5 @@
 }
 
-void arch_post_cpu_init(void)
-{
-}
-
-void arch_pre_smp_init(void)
-{
-}
-
-void arch_post_smp_init(void)
+void sparc64_post_smp_init(void)
 {
 	/* Currently the only supported platform for sparc64/sun4u is 'sun4u'. */
Index: kernel/arch/sparc64/src/sun4u/start.S
===================================================================
--- kernel/arch/sparc64/src/sun4u/start.S	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/arch/sparc64/src/sun4u/start.S	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -292,7 +292,7 @@
 	
 	/*
-	 * Call arch_pre_main(bootinfo)
-	 */
-	call arch_pre_main
+	 * Call sparc64_pre_main(bootinfo)
+	 */
+	call sparc64_pre_main
 	mov %o1, %o0
 	
Index: kernel/arch/sparc64/src/sun4v/sparc64.c
===================================================================
--- kernel/arch/sparc64/src/sun4v/sparc64.c	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/arch/sparc64/src/sun4v/sparc64.c	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -34,4 +34,5 @@
 
 #include <arch.h>
+#include <arch/arch.h>
 #include <debug.h>
 #include <config.h>
@@ -54,8 +55,20 @@
 #include <sysinfo/sysinfo.h>
 
+static void sparc64_pre_mm_init(void);
+static void sparc64_post_mm_init(void);
+static void sparc64_post_smp_init(void);
+
+arch_ops_t sparc64_ops = {
+	.pre_mm_init = sparc64_pre_mm_init,
+	.post_mm_init = sparc64_post_mm_init,
+	.post_smp_init = sparc64_post_smp_init,
+};
+
+arch_ops_t *arch_ops = &sparc64_ops;
+
 memmap_t memmap;
 
 /** Perform sparc64-specific initialization before main_bsp() is called. */
-void arch_pre_main(bootinfo_t *bootinfo)
+void sparc64_pre_main(bootinfo_t *bootinfo)
 {
 	/* Copy init task info. */
@@ -82,5 +95,5 @@
 
 /** Perform sparc64 specific initialization before mm is initialized. */
-void arch_pre_mm_init(void)
+void sparc64_pre_mm_init(void)
 {
 	if (config.cpu_active == 1) {
@@ -91,5 +104,5 @@
 
 /** Perform sparc64 specific initialization afterr mm is initialized. */
-void arch_post_mm_init(void)
+void sparc64_post_mm_init(void)
 {
 	if (config.cpu_active == 1) {
@@ -105,13 +118,5 @@
 }
 
-void arch_post_cpu_init(void)
-{
-}
-
-void arch_pre_smp_init(void)
-{
-}
-
-void arch_post_smp_init(void)
+void sparc64_post_smp_init(void)
 {
 	/* Currently the only supported platform for sparc64/sun4v is 'sun4v'. */
Index: kernel/arch/sparc64/src/sun4v/start.S
===================================================================
--- kernel/arch/sparc64/src/sun4v/start.S	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/arch/sparc64/src/sun4v/start.S	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -248,7 +248,7 @@
 
 	/*
-	 * Call arch_pre_main(bootinfo)
-	 */
-	call arch_pre_main
+	 * Call sparc64_pre_main(bootinfo)
+	 */
+	call sparc64_pre_main
 	or %l1, %g0, %o0
 	
Index: kernel/genarch/include/genarch/drivers/grlib/irqmp.h
===================================================================
--- kernel/genarch/include/genarch/drivers/grlib/irqmp.h	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/genarch/include/genarch/drivers/grlib/irqmp.h	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -39,5 +39,5 @@
 
 #include <typedefs.h>
-#include <arch.h>
+#include <arch/arch.h>
 
 #define GRLIB_IRQMP_MASK_OFFSET   0x40
Index: kernel/genarch/src/drivers/grlib/irqmp.c
===================================================================
--- kernel/genarch/src/drivers/grlib/irqmp.c	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/genarch/src/drivers/grlib/irqmp.c	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -36,4 +36,5 @@
 
 #include <genarch/drivers/grlib/irqmp.h>
+#include <arch/arch.h>
 #include <arch/asm.h>
 #include <mm/km.h>
Index: kernel/generic/include/arch.h
===================================================================
--- kernel/generic/include/arch.h	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/generic/include/arch.h	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -36,5 +36,4 @@
 #define KERN_ARCH_H_
 
-#include <arch/arch.h>  /* arch_pre_main() */
 #include <arch/asm.h>   /* get_stack_base() */
 #include <config.h>
@@ -80,12 +79,22 @@
 } the_t;
 
+typedef struct {
+	void (* pre_mm_init)(void);
+	void (* post_mm_init)(void);
+	void (* post_cpu_init)(void);
+	void (* pre_smp_init)(void);
+	void (* post_smp_init)(void);
+} arch_ops_t;
+
+extern arch_ops_t *arch_ops;
+
+#define ARCH_OP(op) \
+	do { \
+		if (arch_ops->op) \
+			arch_ops->op(); \
+	} while (0)
+
 extern void the_initialize(the_t *);
 extern void the_copy(the_t *, the_t *);
-
-extern void arch_pre_mm_init(void);
-extern void arch_post_mm_init(void);
-extern void arch_post_cpu_init(void);
-extern void arch_pre_smp_init(void);
-extern void arch_post_smp_init(void);
 
 extern void calibrate_delay_loop(void);
@@ -95,5 +104,4 @@
 extern void *arch_construct_function(fncptr_t *, void *, void *);
 
-
 #endif
 
Index: kernel/generic/src/main/kinit.c
===================================================================
--- kernel/generic/src/main/kinit.c	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/generic/src/main/kinit.c	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -160,5 +160,5 @@
 	 * At this point SMP, if present, is configured.
 	 */
-	arch_post_smp_init();
+	ARCH_OP(post_smp_init);
 	
 	/* Start thread computing system load */
Index: kernel/generic/src/main/main.c
===================================================================
--- kernel/generic/src/main/main.c	(revision 7f0580d3f67409f7cdbf11fe2896799c9562dbf5)
+++ kernel/generic/src/main/main.c	(revision 36df41093d27358efd761887622e3076ed51cd14)
@@ -238,5 +238,5 @@
 	 * Memory management subsystems initialization.
 	 */
-	arch_pre_mm_init();
+	ARCH_OP(pre_mm_init);
 	km_identity_init();
 	frame_init();
@@ -250,7 +250,7 @@
 	km_non_identity_init();
 	ddi_init();
-	arch_post_mm_init();
+	ARCH_OP(post_mm_init);
 	reserve_init();
-	arch_pre_smp_init();
+	ARCH_OP(pre_smp_init);
 	smp_init();
 	
@@ -266,5 +266,5 @@
 	cpu_init();
 	calibrate_delay_loop();
-	arch_post_cpu_init();
+	ARCH_OP(post_cpu_init);
 
 	smp_call_init();
@@ -341,13 +341,13 @@
 	the_initialize(THE);
 	
-	arch_pre_mm_init();
+	ARCH_OP(pre_mm_init);
 	frame_init();
 	page_init();
 	tlb_init();
-	arch_post_mm_init();
+	ARCH_OP(post_mm_init);
 	
 	cpu_init();
 	calibrate_delay_loop();
-	arch_post_cpu_init();
+	ARCH_OP(post_cpu_init);
 	
 	the_copy(THE, (the_t *) CPU->stack);
