From owner-svn-src-projects@FreeBSD.ORG Tue Sep 8 03:55:09 2009 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id CBFD710656AB; Tue, 8 Sep 2009 03:55:09 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id B068A8FC14; Tue, 8 Sep 2009 03:55:09 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n883t9uM034928; Tue, 8 Sep 2009 03:55:09 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n883t9FA034925; Tue, 8 Sep 2009 03:55:09 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <200909080355.n883t9FA034925@svn.freebsd.org> From: Nathan Whitehorn Date: Tue, 8 Sep 2009 03:55:09 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r196957 - in projects/ppc64/sys/powerpc: aim aim64 X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 08 Sep 2009 03:55:09 -0000 Author: nwhitehorn Date: Tue Sep 8 03:55:09 2009 New Revision: 196957 URL: http://svn.freebsd.org/changeset/base/196957 Log: Start fixing up 64-bit OF access on Apple hardware a little. This change gives the PMAP layer the correct physical map by deleting a useless (and wrong, for PPC64) special case for reading the memory map from firmware, and also lays the groundwork for the address space swapping to call OF once the MMU is up. Reading the OFW translations map is still broken because of 32-bit/64-bit confusion. Modified: projects/ppc64/sys/powerpc/aim/ofw_machdep.c projects/ppc64/sys/powerpc/aim64/mmu_oea64.c Modified: projects/ppc64/sys/powerpc/aim/ofw_machdep.c ============================================================================== --- projects/ppc64/sys/powerpc/aim/ofw_machdep.c Tue Sep 8 01:11:23 2009 (r196956) +++ projects/ppc64/sys/powerpc/aim/ofw_machdep.c Tue Sep 8 03:55:09 2009 (r196957) @@ -136,6 +136,7 @@ static int parse_ofw_memory(phandle_t node, const char *prop, struct mem_region *output) { cell_t address_cells, size_cells; + cell_t OFmem[4*(OFMEM_REGIONS + 1)]; int sz, i, j; int apple_hack_mode; phandle_t phandle; @@ -171,15 +172,13 @@ parse_ofw_memory(phandle_t node, const c /* * Get memory. */ - if (address_cells > 1 || size_cells > 1) { - cell_t OFmem[4*(OFMEM_REGIONS + 1)]; - if ((node == -1) || (sz = OF_getprop(node, prop, - OFmem, sizeof(OFmem[0]) * 4 * OFMEM_REGIONS)) <= 0) - panic("Physical memory map not found"); - - i = 0; - j = 0; - while (i < sz/sizeof(cell_t)) { + if ((node == -1) || (sz = OF_getprop(node, prop, + OFmem, sizeof(OFmem[0]) * 4 * OFMEM_REGIONS)) <= 0) + panic("Physical memory map not found"); + + i = 0; + j = 0; + while (i < sz/sizeof(cell_t)) { #ifndef __powerpc64__ /* On 32-bit PPC, ignore regions starting above 4 GB */ if (OFmem[i] > 0) { @@ -216,14 +215,10 @@ parse_ofw_memory(phandle_t node, const c output[j].mr_start; } #endif + j++; - } - sz = j*sizeof(output[0]); - } else { - if ((sz = OF_getprop(node, prop, - output, sizeof(output[0]) * OFMEM_REGIONS)) <= 0) - panic("Physical memory map not found"); } + sz = j*sizeof(output[0]); #ifdef __powerpc64__ if (apple_hack_mode) { @@ -378,20 +373,30 @@ openfirmware(void *args) int result; #ifndef __powerpc64__ register_t srsave[16]; - u_int i; #endif + u_int i; if (pmap_bootstrapped && ofw_real_mode) args = (void *)pmap_kextract((vm_offset_t)args); ofw_sprg_prepare(); - #ifndef __powerpc64__ if (pmap_bootstrapped && !ofw_real_mode) { /* * Swap the kernel's address space with Open Firmware's */ - if (!ppc64) for (i = 0; i < 16; i++) { + + #ifdef __powerpc64__ + for (i = 1; i < 16; i++) { + if (i == KERNEL_SR || i == KERNEL2_SR || i == USER_SR) + continue; + + __asm __volatile ("slbie %0; slbmte %1, %2" :: + "r"(i << 28), "r"(ofw_pmap.pm_slb[i].slbv), + "r"(ofw_pmap.pm_slb[i].slbe)); + } + #else + for (i = 0; i < 16; i++) { srsave[i] = mfsrin(i << ADDR_SR_SHFT); mtsrin(i << ADDR_SR_SHFT, ofw_pmap.pm_sr[i]); } @@ -404,8 +409,8 @@ openfirmware(void *args) "mtdbatu 3, %0" : : "r" (0)); } isync(); + #endif } - #endif __asm __volatile( "\t" "sync\n\t" @@ -424,19 +429,28 @@ openfirmware(void *args) : : "r" (oldmsr) ); - #ifndef __powerpc64__ if (pmap_bootstrapped && !ofw_real_mode) { /* * Restore the kernel's addr space. The isync() doesn;t * work outside the loop unless mtsrin() is open-coded * in an asm statement :( */ + #ifdef __powerpc64__ + for (i = 1; i < 16; i++) { + if (i == KERNEL_SR || i == KERNEL2_SR || i == USER_SR) + continue; + + __asm __volatile ("slbie %0; slbmte %1, %2" :: + "r"(i << 28), "r"(kernel_pmap->pm_slb[i].slbv), + "r"(kernel_pmap->pm_slb[i].slbe)); + } + #else for (i = 0; i < 16; i++) { mtsrin(i << ADDR_SR_SHFT, srsave[i]); isync(); } + #endif } - #endif ofw_sprg_restore(); Modified: projects/ppc64/sys/powerpc/aim64/mmu_oea64.c ============================================================================== --- projects/ppc64/sys/powerpc/aim64/mmu_oea64.c Tue Sep 8 01:11:23 2009 (r196956) +++ projects/ppc64/sys/powerpc/aim64/mmu_oea64.c Tue Sep 8 03:55:09 2009 (r196957) @@ -971,6 +971,11 @@ moea64_bridge_bootstrap(mmu_t mmup, vm_o moea64_pinit(mmup, &ofw_pmap); + #ifndef __powerpc64__ + ofw_pmap.pm_sr[KERNEL_SR] = kernel_pmap->pm_sr[KERNEL_SR]; + ofw_pmap.pm_sr[KERNEL2_SR] = kernel_pmap->pm_sr[KERNEL2_SR]; + #endif + if ((chosen = OF_finddevice("/chosen")) == -1) panic("moea64_bootstrap: can't find /chosen"); OF_getprop(chosen, "mmu", &mmui, 4);