a7c24c425b
Extend the Book-E pmap to support 64-bit operation. Much of this was taken from Juniper's Junos FreeBSD port. It uses a 3-level page table (page directory list -- PP2D, page directory, page table), but has gaps in the page directory list where regions will repeat, due to the design of the PP2D hash (a 20-bit gap between the two parts of the index). In practice this may not be a problem given the expanded address space. However, an alternative to this would be to use a 4-level page table, like Linux, and possibly reduce the available address space; Linux appears to use a 46-bit address space. Alternatively, a cache of page directory pointers could be used to keep the overall design as-is, but remove the gaps in the address space. This includes a new kernel config for 64-bit QorIQ SoCs, based on MPC85XX, with the following notes: * The DPAA driver has not yet been ported to 64-bit so is not included in the kernel config. * This has been tested on the AmigaOne X5000, using a MD_ROOT compiled in (total size kernel+mdroot must be under 64MB). * This can run both 32-bit and 64-bit processes, and has even been tested to run a 32-bit init with 64-bit children. Many thanks to stevek and marcel for getting Juniper's FreeBSD patches open sourced to be used here, and to stevek for reviewing, and providing some historical contexts on quirks of the code. Reviewed by: stevek Obtained from: Juniper (in part) MFC after: 2 months Relnotes: yes Differential Revision: https://reviews.freebsd.org/D9433
115 lines
4.9 KiB
C
115 lines
4.9 KiB
C
/*-
|
|
* Copyright (C) 1995, 1996 Wolfgang Solfrank.
|
|
* Copyright (C) 1995, 1996 TooLs GmbH.
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. 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.
|
|
* 3. All advertising materials mentioning features or use of this software
|
|
* must display the following acknowledgement:
|
|
* This product includes software developed by TooLs GmbH.
|
|
* 4. The name of TooLs GmbH may not be used to endorse or promote products
|
|
* derived from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``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 TOOLS GMBH 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.
|
|
*
|
|
* $NetBSD: psl.h,v 1.5 2000/11/19 19:52:37 matt Exp $
|
|
* $FreeBSD$
|
|
*/
|
|
|
|
#ifndef _MACHINE_PSL_H_
|
|
#define _MACHINE_PSL_H_
|
|
|
|
/*
|
|
* Machine State Register (MSR) - All cores
|
|
*/
|
|
#define PSL_VEC 0x02000000UL /* AltiVec/SPE vector unit available */
|
|
#define PSL_VSX 0x00800000UL /* Vector-Scalar unit available */
|
|
#define PSL_EE 0x00008000UL /* external interrupt enable */
|
|
#define PSL_PR 0x00004000UL /* privilege mode (1 == user) */
|
|
#define PSL_FP 0x00002000UL /* floating point enable */
|
|
#define PSL_ME 0x00001000UL /* machine check enable */
|
|
#define PSL_FE0 0x00000800UL /* floating point interrupt mode 0 */
|
|
#define PSL_BE 0x00000200UL /* branch trace enable */
|
|
#define PSL_FE1 0x00000100UL /* floating point interrupt mode 1 */
|
|
#define PSL_PMM 0x00000004UL /* performance monitor mark */
|
|
|
|
/* Machine State Register - Book-E cores */
|
|
#ifdef __powerpc64__
|
|
#define PSL_CM 0x80000000UL /* Computation Mode (64-bit) */
|
|
#endif
|
|
|
|
#define PSL_UCLE 0x04000000UL /* User mode cache lock enable */
|
|
#define PSL_WE 0x00040000UL /* Wait state enable */
|
|
#define PSL_CE 0x00020000UL /* Critical interrupt enable */
|
|
#define PSL_UBLE 0x00000400UL /* BTB lock enable - e500 only */
|
|
#define PSL_DWE 0x00000400UL /* Debug Wait Enable - 440 only*/
|
|
#define PSL_DE 0x00000200UL /* Debug interrupt enable */
|
|
#define PSL_IS 0x00000020UL /* Instruction address space */
|
|
#define PSL_DS 0x00000010UL /* Data address space */
|
|
|
|
/* Machine State Register (MSR) - AIM cores */
|
|
#ifdef __powerpc64__
|
|
#define PSL_SF 0x8000000000000000UL /* 64-bit addressing */
|
|
#define PSL_HV 0x1000000000000000UL /* hyper-privileged mode */
|
|
#endif
|
|
|
|
#define PSL_POW 0x00040000UL /* power management */
|
|
#define PSL_ILE 0x00010000UL /* interrupt endian mode (1 == le) */
|
|
#define PSL_SE 0x00000400UL /* single-step trace enable */
|
|
#define PSL_IP 0x00000040UL /* interrupt prefix - 601 only */
|
|
#define PSL_IR 0x00000020UL /* instruction address relocation */
|
|
#define PSL_DR 0x00000010UL /* data address relocation */
|
|
#define PSL_RI 0x00000002UL /* recoverable interrupt */
|
|
#define PSL_LE 0x00000001UL /* endian mode (1 == le) */
|
|
|
|
/*
|
|
* Floating-point exception modes:
|
|
*/
|
|
#define PSL_FE_DIS 0 /* none */
|
|
#define PSL_FE_NONREC PSL_FE1 /* imprecise non-recoverable */
|
|
#define PSL_FE_REC PSL_FE0 /* imprecise recoverable */
|
|
#define PSL_FE_PREC (PSL_FE0 | PSL_FE1) /* precise */
|
|
#define PSL_FE_DFLT PSL_FE_DIS /* default == none */
|
|
|
|
#if defined(BOOKE_E500)
|
|
/* Initial kernel MSR, use IS=1 ad DS=1. */
|
|
#define PSL_KERNSET_INIT (PSL_IS | PSL_DS)
|
|
#ifdef __powerpc64__
|
|
#define PSL_KERNSET (PSL_CM | PSL_CE | PSL_ME | PSL_EE)
|
|
#else
|
|
#define PSL_KERNSET (PSL_CE | PSL_ME | PSL_EE)
|
|
#endif
|
|
#define PSL_SRR1_MASK 0x00000000UL /* No mask on Book-E */
|
|
#elif defined(BOOKE_PPC4XX)
|
|
#define PSL_KERNSET (PSL_CE | PSL_ME | PSL_EE | PSL_FP)
|
|
#define PSL_SRR1_MASK 0x00000000UL /* No mask on Book-E */
|
|
#elif defined(AIM)
|
|
#ifdef __powerpc64__
|
|
#define PSL_KERNSET (PSL_SF | PSL_EE | PSL_ME | PSL_IR | PSL_DR | PSL_RI)
|
|
#else
|
|
#define PSL_KERNSET (PSL_EE | PSL_ME | PSL_IR | PSL_DR | PSL_RI)
|
|
#endif
|
|
#define PSL_SRR1_MASK 0x783f0000UL /* Bits 1-4, 10-15 (ppc32), 33-36, 42-47 (ppc64) */
|
|
#endif
|
|
|
|
#define PSL_USERSET (PSL_KERNSET | PSL_PR)
|
|
#define PSL_USERSTATIC (~(PSL_VEC | PSL_FP | PSL_FE0 | PSL_FE1) & ~PSL_SRR1_MASK)
|
|
|
|
#endif /* _MACHINE_PSL_H_ */
|