PERFORCE change 153361 for review
Nathan Whitehorn
nwhitehorn at FreeBSD.org
Sat Nov 22 09:42:52 PST 2008
http://perforce.freebsd.org/chv.cgi?CH=153361
Change 153361 by nwhitehorn at nwhitehorn_trantor on 2008/11/22 17:41:53
Initial SMP support for 64-bit PowerPC CPUs. This does not work yet,
due to the following problems:
1. G5s don't have L2CR and L3CR, so trying to set them as the current
SMP code does causes illegal instruction traps.
2. Mambo-specific: it looks like Mambo may require using magic
instructions to start secondary CPUs. However, they can still be
started by hand.
Affected files ...
.. //depot/projects/ppc-g5/sys/powerpc/aim/mmu_oea.c#5 edit
.. //depot/projects/ppc-g5/sys/powerpc/aim/mmu_oea64.c#10 edit
.. //depot/projects/ppc-g5/sys/powerpc/powerpc/mmu_if.m#2 edit
.. //depot/projects/ppc-g5/sys/powerpc/powerpc/pmap_dispatch.c#3 edit
Differences ...
==== //depot/projects/ppc-g5/sys/powerpc/aim/mmu_oea.c#5 (text+ko) ====
@@ -323,6 +323,7 @@
void moea_zero_page_idle(mmu_t, vm_page_t);
void moea_activate(mmu_t, struct thread *);
void moea_deactivate(mmu_t, struct thread *);
+void moea_cpu_bootstrap(mmu_t, int);
void moea_bootstrap(mmu_t, vm_offset_t, vm_offset_t);
void *moea_mapdev(mmu_t, vm_offset_t, vm_size_t);
void moea_unmapdev(mmu_t, vm_offset_t, vm_size_t);
@@ -364,6 +365,7 @@
/* Internal interfaces */
MMUMETHOD(mmu_bootstrap, moea_bootstrap),
+ MMUMETHOD(mmu_cpu_bootstrap, moea_cpu_bootstrap),
MMUMETHOD(mmu_mapdev, moea_mapdev),
MMUMETHOD(mmu_unmapdev, moea_unmapdev),
MMUMETHOD(mmu_kextract, moea_kextract),
@@ -617,7 +619,7 @@
}
void
-pmap_cpu_bootstrap(int ap)
+moea_cpu_bootstrap(mmu_t mmup, int ap)
{
u_int sdr;
int i;
@@ -898,7 +900,7 @@
kernel_pmap->pm_sr[KERNEL2_SR] = KERNEL2_SEGMENT;
kernel_pmap->pm_active = ~0;
- pmap_cpu_bootstrap(0);
+ moea_cpu_bootstrap(mmup,0);
pmap_bootstrapped++;
==== //depot/projects/ppc-g5/sys/powerpc/aim/mmu_oea64.c#10 (text+ko) ====
@@ -366,6 +366,7 @@
*/
static void moea64_bridge_bootstrap(mmu_t mmup,
vm_offset_t kernelstart, vm_offset_t kernelend);
+static void moea64_bridge_cpu_bootstrap(mmu_t, int ap);
static void moea64_enter_locked(pmap_t, vm_offset_t, vm_page_t,
vm_prot_t, boolean_t);
static void moea64_bootstrap_find_framebuffer(vm_offset_t *va,
@@ -450,6 +451,7 @@
/* Internal interfaces */
MMUMETHOD(mmu_bootstrap, moea64_bridge_bootstrap),
+ MMUMETHOD(mmu_cpu_bootstrap, moea64_bridge_cpu_bootstrap),
MMUMETHOD(mmu_mapdev, moea64_mapdev),
MMUMETHOD(mmu_unmapdev, moea64_unmapdev),
MMUMETHOD(mmu_kextract, moea64_kextract),
@@ -700,7 +702,7 @@
}
static void
-moea64_bridge_cpu_bootstrap(int ap)
+moea64_bridge_cpu_bootstrap(mmu_t mmup, int ap)
{
int i = 0;
@@ -979,7 +981,7 @@
/*
* Initialize MMU and remap early physical mappings
*/
- moea64_bridge_cpu_bootstrap(0);
+ moea64_bridge_cpu_bootstrap(mmup,0);
mtmsr(mfmsr() | PSL_DR | PSL_IR); isync();
pmap_bootstrapped++;
bs_remap_earlyboot();
==== //depot/projects/ppc-g5/sys/powerpc/powerpc/mmu_if.m#2 (text+ko) ====
@@ -697,6 +697,18 @@
vm_offset_t _end;
};
+/**
+ * @brief Set up the MMU on the current CPU. Only called by the PMAP layer
+ * for alternate CPUs on SMP systems.
+ *
+ * @param _ap Set to 1 if the CPU being set up is an AP
+ *
+ */
+METHOD void cpu_bootstrap {
+ mmu_t _mmu;
+ int _ap;
+};
+
/**
* @brief Create a kernel mapping for a given physical address range.
==== //depot/projects/ppc-g5/sys/powerpc/powerpc/pmap_dispatch.c#3 (text+ko) ====
@@ -53,6 +53,7 @@
#include <vm/vm_page.h>
#include <machine/mmuvar.h>
+#include <machine/smp.h>
#include "mmu_if.h"
@@ -407,6 +408,13 @@
MMU_BOOTSTRAP(mmu_obj, start, end);
}
+void
+pmap_cpu_bootstrap(int ap)
+{
+ CTR3(KTR_PMAP, "%s(%#x, %#x)", __func__, pa, size);
+ return (MMU_CPU_BOOTSTRAP(mmu_obj, ap));
+}
+
void *
pmap_mapdev(vm_offset_t pa, vm_size_t size)
{
More information about the p4-projects
mailing list