Index: kernel/arch/sparc64/Makefile.inc
===================================================================
--- kernel/arch/sparc64/Makefile.inc	(revision 36df41093d27358efd761887622e3076ed51cd14)
+++ kernel/arch/sparc64/Makefile.inc	(revision 751032650a0af420a9d0763cf66c6c43bdc89800)
@@ -58,4 +58,5 @@
 
 ARCH_SOURCES = \
+	arch/$(KARCH)/src/sparc64.c \
 	arch/$(KARCH)/src/cpu/$(USARCH)/cpu.c \
 	arch/$(KARCH)/src/debug/stacktrace.c \
Index: kernel/arch/sparc64/include/arch/arch.h
===================================================================
--- kernel/arch/sparc64/include/arch/arch.h	(revision 36df41093d27358efd761887622e3076ed51cd14)
+++ kernel/arch/sparc64/include/arch/arch.h	(revision 751032650a0af420a9d0763cf66c6c43bdc89800)
@@ -38,4 +38,8 @@
 #define KERN_sparc64_ARCH_H_
 
+#ifndef __ASM__
+#include <arch.h>
+#endif
+
 #include <arch/boot/boot.h>
 
@@ -53,4 +57,6 @@
 #ifndef __ASM__
 
+extern arch_ops_t *sparc64_ops;
+
 extern void sparc64_pre_main(bootinfo_t *);
 
Index: kernel/arch/sparc64/include/arch/asm.h
===================================================================
--- kernel/arch/sparc64/include/arch/asm.h	(revision 36df41093d27358efd761887622e3076ed51cd14)
+++ kernel/arch/sparc64/include/arch/asm.h	(revision 751032650a0af420a9d0763cf66c6c43bdc89800)
@@ -36,5 +36,4 @@
 #define KERN_sparc64_ASM_H_
 
-#include <arch/arch.h>
 #include <typedefs.h>
 #include <align.h>
Index: kernel/arch/sparc64/include/arch/sun4u/cpu.h
===================================================================
--- kernel/arch/sparc64/include/arch/sun4u/cpu.h	(revision 36df41093d27358efd761887622e3076ed51cd14)
+++ kernel/arch/sparc64/include/arch/sun4u/cpu.h	(revision 751032650a0af420a9d0763cf66c6c43bdc89800)
@@ -58,4 +58,5 @@
 #include <arch/regdef.h>
 #include <arch/asm.h>
+#include <arch/arch.h>
 #include <trace.h>
 
Index: kernel/arch/sparc64/src/sparc64.c
===================================================================
--- kernel/arch/sparc64/src/sparc64.c	(revision 751032650a0af420a9d0763cf66c6c43bdc89800)
+++ kernel/arch/sparc64/src/sparc64.c	(revision 751032650a0af420a9d0763cf66c6c43bdc89800)
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2016 Jakub Jermar
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup sparc64
+ * @{
+ */
+/** @file
+ */
+
+#include <arch.h>
+#include <arch/arch.h>
+
+#define SPARC64_ARCH_OP(op)	ARCH_STRUCT_OP(sparc64_ops, op)
+
+static void sparc64_pre_mm_init(void);
+static void sparc64_post_mm_init(void);
+static void sparc64_post_cpu_init(void);
+static void sparc64_pre_smp_init(void);
+static void sparc64_post_smp_init(void);
+
+arch_ops_t sparc64_arch_ops = {
+	.pre_mm_init = sparc64_pre_mm_init,
+	.post_mm_init = sparc64_post_mm_init,
+	.post_cpu_init = sparc64_post_cpu_init,
+	.pre_smp_init = sparc64_pre_smp_init,
+	.post_smp_init = sparc64_post_smp_init,
+};
+
+arch_ops_t *arch_ops = &sparc64_arch_ops;
+
+void sparc64_pre_mm_init(void)
+{
+	SPARC64_ARCH_OP(pre_mm_init);
+}
+
+void sparc64_post_mm_init(void)
+{
+	SPARC64_ARCH_OP(post_mm_init);
+}
+
+void sparc64_post_cpu_init(void)
+{
+	SPARC64_ARCH_OP(post_cpu_init);
+}
+
+void sparc64_pre_smp_init(void)
+{
+	SPARC64_ARCH_OP(pre_smp_init);
+}
+
+void sparc64_post_smp_init(void)
+{
+	SPARC64_ARCH_OP(post_smp_init);
+}
+
+/** @}
+ */
Index: kernel/arch/sparc64/src/sun4u/sparc64.c
===================================================================
--- kernel/arch/sparc64/src/sun4u/sparc64.c	(revision 36df41093d27358efd761887622e3076ed51cd14)
+++ kernel/arch/sparc64/src/sun4u/sparc64.c	(revision 751032650a0af420a9d0763cf66c6c43bdc89800)
@@ -53,15 +53,15 @@
 #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,
+static void sun4u_pre_mm_init(void);
+static void sun4u_post_mm_init(void);
+static void sun4u_post_smp_init(void);
+
+arch_ops_t sun4u_ops = {
+	.pre_mm_init = sun4u_pre_mm_init,
+	.post_mm_init = sun4u_post_mm_init,
+	.post_smp_init = sun4u_post_smp_init,
 };
 
-arch_ops_t *arch_ops = &sparc64_ops;
+arch_ops_t *sparc64_ops = &sun4u_ops;
 
 memmap_t memmap;
@@ -97,5 +97,5 @@
 
 /** Perform sparc64 specific initialization before mm is initialized. */
-void sparc64_pre_mm_init(void)
+void sun4u_pre_mm_init(void)
 {
 	if (config.cpu_active == 1) {
@@ -106,5 +106,5 @@
 
 /** Perform sparc64 specific initialization afterr mm is initialized. */
-void sparc64_post_mm_init(void)
+void sun4u_post_mm_init(void)
 {
 	if (config.cpu_active == 1) {
@@ -120,5 +120,5 @@
 }
 
-void sparc64_post_smp_init(void)
+void sun4u_post_smp_init(void)
 {
 	/* Currently the only supported platform for sparc64/sun4u is 'sun4u'. */
Index: kernel/arch/sparc64/src/sun4v/sparc64.c
===================================================================
--- kernel/arch/sparc64/src/sun4v/sparc64.c	(revision 36df41093d27358efd761887622e3076ed51cd14)
+++ kernel/arch/sparc64/src/sun4v/sparc64.c	(revision 751032650a0af420a9d0763cf66c6c43bdc89800)
@@ -55,15 +55,15 @@
 #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);
+static void sun4v_pre_mm_init(void);
+static void sun4v_post_mm_init(void);
+static void sun4v_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 sun4v_ops = {
+	.pre_mm_init = sun4v_pre_mm_init,
+	.post_mm_init = sun4v_post_mm_init,
+	.post_smp_init = sun4v_post_smp_init,
 };
 
-arch_ops_t *arch_ops = &sparc64_ops;
+arch_ops_t *sparc64_ops = &sun4v_ops;
 
 memmap_t memmap;
@@ -95,5 +95,5 @@
 
 /** Perform sparc64 specific initialization before mm is initialized. */
-void sparc64_pre_mm_init(void)
+void sun4v_pre_mm_init(void)
 {
 	if (config.cpu_active == 1) {
@@ -104,5 +104,5 @@
 
 /** Perform sparc64 specific initialization afterr mm is initialized. */
-void sparc64_post_mm_init(void)
+void sun4v_post_mm_init(void)
 {
 	if (config.cpu_active == 1) {
@@ -118,5 +118,5 @@
 }
 
-void sparc64_post_smp_init(void)
+void sun4v_post_smp_init(void)
 {
 	/* Currently the only supported platform for sparc64/sun4v is 'sun4v'. */
Index: kernel/generic/include/arch.h
===================================================================
--- kernel/generic/include/arch.h	(revision 36df41093d27358efd761887622e3076ed51cd14)
+++ kernel/generic/include/arch.h	(revision 751032650a0af420a9d0763cf66c6c43bdc89800)
@@ -89,9 +89,11 @@
 extern arch_ops_t *arch_ops;
 
-#define ARCH_OP(op) \
+#define ARCH_STRUCT_OP(s, op) \
 	do { \
-		if (arch_ops->op) \
-			arch_ops->op(); \
+		if ((s)->op) \
+			(s)->op(); \
 	} while (0)
+
+#define ARCH_OP(op)	ARCH_STRUCT_OP(arch_ops, op)
 
 extern void the_initialize(the_t *);
