Index: kernel/arch/sparc64/src/mm/as.c
===================================================================
--- kernel/arch/sparc64/src/mm/as.c	(revision 19dba2bf660c4ef2d48df50eeba33d3ca9a7508a)
+++ kernel/arch/sparc64/src/mm/as.c	(revision 00b38a3225eae97d519c8185a42202d226dd8513)
@@ -38,4 +38,5 @@
 #include <genarch/mm/asid_fifo.h>
 #include <debug.h>
+#include <config.h>
 
 #ifdef CONFIG_TSB
@@ -52,6 +53,8 @@
 void as_arch_init(void)
 {
-	as_operations = &as_ht_operations;
-	asid_fifo_init();
+	if (config.cpu_active == 1) {
+		as_operations = &as_ht_operations;
+		asid_fifo_init();
+	}
 }
 
Index: kernel/arch/sparc64/src/mm/frame.c
===================================================================
--- kernel/arch/sparc64/src/mm/frame.c	(revision 19dba2bf660c4ef2d48df50eeba33d3ca9a7508a)
+++ kernel/arch/sparc64/src/mm/frame.c	(revision 00b38a3225eae97d519c8185a42202d226dd8513)
@@ -54,19 +54,21 @@
 	pfn_t confdata;
 
-	for (i = 0; i < bootinfo.memmap.count; i++) {
-		uintptr_t start = bootinfo.memmap.zones[i].start;
-		size_t size = bootinfo.memmap.zones[i].size;
+	if (config.cpu_active == 1) {
+		for (i = 0; i < bootinfo.memmap.count; i++) {
+			uintptr_t start = bootinfo.memmap.zones[i].start;
+			size_t size = bootinfo.memmap.zones[i].size;
 
-		/*
-		 * The memmap is created by HelenOS boot loader.
-		 * It already contains no holes.
-		 */
+			/*
+			 * The memmap is created by HelenOS boot loader.
+			 * It already contains no holes.
+			 */
 	
-		confdata = ADDR2PFN(start);
-		if (confdata == 0)
-			confdata = 2;
-		zone_create(ADDR2PFN(start), SIZE2FRAMES(ALIGN_DOWN(size, FRAME_SIZE)),	confdata, 0);
+			confdata = ADDR2PFN(start);
+			if (confdata == 0)
+				confdata = 2;
+			zone_create(ADDR2PFN(start), SIZE2FRAMES(ALIGN_DOWN(size, FRAME_SIZE)),	confdata, 0);
 		
-		last_frame = max(last_frame, start + ALIGN_UP(size, FRAME_SIZE));
+			last_frame = max(last_frame, start + ALIGN_UP(size, FRAME_SIZE));
+		}
 	}
 
Index: kernel/arch/sparc64/src/mm/page.c
===================================================================
--- kernel/arch/sparc64/src/mm/page.c	(revision 19dba2bf660c4ef2d48df50eeba33d3ca9a7508a)
+++ kernel/arch/sparc64/src/mm/page.c	(revision 00b38a3225eae97d519c8185a42202d226dd8513)
@@ -41,8 +41,43 @@
 #include <debug.h>
 #include <align.h>
+#include <config.h>
 
+#ifdef CONFIG_SMP
+/** Entries locked in DTLB of BSP.
+ *
+ * Application processors need to have the same locked entries
+ * in their DTLBs as the bootstrap processor.
+ */
+static struct {
+	uintptr_t virt_page;
+	uintptr_t phys_page;
+	int pagesize_code;
+} bsp_locked_dtlb_entry[DTLB_ENTRY_COUNT];
+
+/** Number of entries in bsp_locked_dtlb_entry array. */
+static count_t bsp_locked_dtlb_entries = 0;
+#endif /* CONFIG_SMP */
+
+/** Perform sparc64 specific initialization of paging. */
 void page_arch_init(void)
 {
-	page_mapping_operations = &ht_mapping_operations;
+	if (config.cpu_active == 1) {
+		page_mapping_operations = &ht_mapping_operations;
+	} else {
+
+#ifdef CONFIG_SMP
+		int i;
+
+		/*
+		 * Copy locked DTLB entries from the BSP.
+		 */		
+		for (i = 0; i < bsp_locked_dtlb_entries; i++) {
+			dtlb_insert_mapping(bsp_locked_dtlb_entry[i].virt_page,
+				bsp_locked_dtlb_entry[i].phys_page, bsp_locked_dtlb_entry[i].pagesize_code,
+				true, false);
+		}
+#endif	
+
+	}
 }
 
@@ -68,6 +103,8 @@
 	int i;
 
+	ASSERT(config.cpu_active == 1);
+
 	struct {
-		int pagesize;
+		int pagesize_code;
 		size_t increment;
 		count_t count;
@@ -102,8 +139,22 @@
 	last_frame = ALIGN_UP(virtaddr + size, 1<<(order + FRAME_WIDTH));
 	
-	for (i = 0; i < sizemap[order].count; i++)
+	for (i = 0; i < sizemap[order].count; i++) {
+		/*
+		 * First, insert the mapping into DTLB.
+		 */
 		dtlb_insert_mapping(virtaddr + i*sizemap[order].increment,
 				    physaddr + i*sizemap[order].increment,
-				    sizemap[order].pagesize, true, false);
+				    sizemap[order].pagesize_code, true, false);
+	
+#ifdef CONFIG_SMP	
+		/*
+		 * Second, save the information about the mapping for APs.
+		 */
+		bsp_locked_dtlb_entry[bsp_locked_dtlb_entries].virt_page = virtaddr + i*sizemap[order].increment;
+		bsp_locked_dtlb_entry[bsp_locked_dtlb_entries].phys_page = physaddr + i*sizemap[order].increment;
+		bsp_locked_dtlb_entry[bsp_locked_dtlb_entries].pagesize_code = sizemap[order].pagesize_code;
+		bsp_locked_dtlb_entries++;
+#endif
+	}
 	
 	return virtaddr;
