Module Name:    src
Committed By:   matt
Date:           Fri Jan  7 01:59:40 UTC 2011

Modified Files:
        src/sys/arch/powerpc/include [matt-nb5-pq3]: cpu.h db_machdep.h psl.h

Log Message:
Add booke support.


To generate a diff of this commit:
cvs rdiff -u -r1.65 -r1.65.22.1 src/sys/arch/powerpc/include/cpu.h
cvs rdiff -u -r1.19 -r1.19.88.1 src/sys/arch/powerpc/include/db_machdep.h
cvs rdiff -u -r1.14 -r1.14.86.1 src/sys/arch/powerpc/include/psl.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/powerpc/include/cpu.h
diff -u src/sys/arch/powerpc/include/cpu.h:1.65 src/sys/arch/powerpc/include/cpu.h:1.65.22.1
--- src/sys/arch/powerpc/include/cpu.h:1.65	Wed Apr 30 23:21:29 2008
+++ src/sys/arch/powerpc/include/cpu.h	Fri Jan  7 01:59:40 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu.h,v 1.65 2008/04/30 23:21:29 macallan Exp $	*/
+/*	$NetBSD: cpu.h,v 1.65.22.1 2011/01/07 01:59:40 matt Exp $	*/
 
 /*
  * Copyright (C) 1999 Wolfgang Solfrank.
@@ -59,6 +59,7 @@
 struct cpu_info {
 	struct cpu_data ci_data;	/* MI per-cpu data */
 	struct device *ci_dev;		/* device of corresponding cpu */
+	struct cpu_softc *ci_softc;	/* private cpu info */
 	struct lwp *ci_curlwp;		/* current owner of the processor */
 
 	struct pcb *ci_curpcb;
@@ -69,16 +70,21 @@
 
 	volatile int ci_astpending;
 	int ci_want_resched;
+	volatile uint64_t ci_lastintr;
 	volatile u_long ci_lasttb;
 	volatile int ci_tickspending;
 	volatile int ci_cpl;
 	volatile int ci_iactive;
 	volatile int ci_idepth;
+#ifndef PPC_BOOKE
 	volatile int ci_ipending;
-	int ci_intrdepth;
+#endif
 	int ci_mtx_oldspl;
 	int ci_mtx_count;
+#ifndef PPC_BOOKE
 	char *ci_intstk;
+#endif
+#ifndef PPC_BOOKE
 #define	CPUSAVE_LEN	8
 	register_t ci_tempsave[CPUSAVE_LEN];
 	register_t ci_ddbsave[CPUSAVE_LEN];
@@ -87,21 +93,37 @@
 #define	CPUSAVE_R29	1		/* where r29 gets saved */
 #define	CPUSAVE_R30	2		/* where r30 gets saved */
 #define	CPUSAVE_R31	3		/* where r31 gets saved */
+#if defined(PPC_IBM4XX)
+#define	CPUSAVE_DEAR	4		/* where SPR_DAR gets saved */
+#define	CPUSAVE_ESR	5		/* where SPR_DSISR gets saved */
+	register_t ci_tlbmisssave[CPUSAVE_LEN];
+#else
 #define	CPUSAVE_DAR	4		/* where SPR_DAR gets saved */
 #define	CPUSAVE_DSISR	5		/* where SPR_DSISR gets saved */
-#define	CPUSAVE_SRR0	6		/* where SRR0 gets saved */
-#define	CPUSAVE_SRR1	7		/* where SRR1 gets saved */
 #define	DISISAVE_LEN	4
 	register_t ci_disisave[DISISAVE_LEN];
+#endif
+#define	CPUSAVE_SRR0	6		/* where SRR0 gets saved */
+#define	CPUSAVE_SRR1	7		/* where SRR1 gets saved */
+#else
+#define	CPUSAVE_LEN	128
+	register_t ci_savelifo[CPUSAVE_LEN];
+	struct pmap_segtab *ci_pmap_segtabs[2];
+#define	ci_pmap_kern_segtab	ci_pmap_segtabs[0]
+#define	ci_pmap_user_segtab	ci_pmap_segtabs[1]
+	struct pmap_tlb_info *ci_tlb_info;
+#endif
 	struct cache_info ci_ci;		
 	void *ci_sysmon_cookie;
 	void (*ci_idlespin)(void);
 	uint32_t ci_khz;
 	struct evcnt ci_ev_clock;	/* clock intrs */
 	struct evcnt ci_ev_statclock; 	/* stat clock */
+#ifndef PPC_BOOKE
 	struct evcnt ci_ev_softclock;	/* softclock intrs */
 	struct evcnt ci_ev_softnet;	/* softnet intrs */
 	struct evcnt ci_ev_softserial;	/* softserial intrs */
+#endif
 	struct evcnt ci_ev_traps;	/* calls to trap() */
 	struct evcnt ci_ev_kdsi;	/* kernel DSI traps */
 	struct evcnt ci_ev_udsi;	/* user DSI traps */
@@ -119,6 +141,9 @@
 	struct evcnt ci_ev_vecsw;	/* Altivec context switches */
 	struct evcnt ci_ev_umchk;	/* user MCHK events */
 	struct evcnt ci_ev_ipi;		/* IPIs received */
+	struct evcnt ci_ev_tlbmiss_soft; /* tlb miss (no trap) */
+	struct evcnt ci_ev_dtlbmiss_hard; /* data tlb miss (trap) */
+	struct evcnt ci_ev_itlbmiss_hard; /* instruction tlb miss (trap) */
 };
 
 #ifdef MULTIPROCESSOR
@@ -190,7 +215,8 @@
 static __inline void
 mtmsr(register_t msr)
 {
-
+	//KASSERT(msr & PSL_CE);
+	//KASSERT(msr & PSL_DE);
 	__asm volatile ("mtmsr %0" : : "r"(msr));
 }
 
@@ -202,6 +228,8 @@
 	__asm volatile (
 #ifdef PPC_IBM403
 "	mftblo %0	\n"
+#elif defined(PPC_BOOKE)
+"	mfspr %0,268	\n"
 #else
 "	mftbl %0	\n"
 #endif
@@ -225,6 +253,10 @@
 "1:	mftbhi %0	\n"
 "	mftblo %0+1	\n"
 "	mftbhi %1	\n"
+#elif defined(PPC_BOOKE)
+"1:	mfspr %0,269	\n"
+"	mfspr %0+1,268	\n"
+"	mfspr %1,269	\n"
 #else
 "1:	mftbu %0	\n"
 "	mftb %0+1	\n"
@@ -297,16 +329,15 @@
 })
 #endif /* PPC_IBM4XX || PPC_IBM403 */
 
-#define	CLKF_USERMODE(frame)	(((frame)->srr1 & PSL_PR) != 0)
-#define	CLKF_PC(frame)		((frame)->srr0)
-#define	CLKF_INTR(frame)	((frame)->depth > 0)
+#define	CLKF_USERMODE(frame)	(((frame)->cf_srr1 & PSL_PR) != 0)
+#define	CLKF_PC(frame)		((frame)->cf_srr0)
+#define	CLKF_INTR(frame)	((frame)->cf_idepth >= 0)
+#define	LWP_PC(l)		(trapframe(l)->tf_srr0)
 
-#define	LWP_PC(l)		(trapframe(l)->srr0)
 
 #define	cpu_swapin(p)
 #define	cpu_swapout(p)
 #define	cpu_proc_fork(p1, p2)
-#define	cpu_idle()		(curcpu()->ci_idlespin())
 #define cpu_lwp_free2(l)
 
 extern int powersave;
@@ -314,15 +345,28 @@
 extern int cpu_printfataltraps;
 extern char cpu_model[];
 
+void cpu_uarea_remap(struct lwp *);
 struct cpu_info *cpu_attach_common(struct device *, int);
 void cpu_setup(struct device *, struct cpu_info *);
 void cpu_identify(char *, size_t);
 void delay (unsigned int);
 void cpu_probe_cache(void);
+#ifndef PPC_BOOKE
 void dcache_flush_page(vaddr_t);
 void icache_flush_page(vaddr_t);
 void dcache_flush(vaddr_t, vsize_t);
 void icache_flush(vaddr_t, vsize_t);
+#else
+void dcache_wb_page(vaddr_t);
+void dcache_wbinv_page(vaddr_t);
+void dcache_inv_page(vaddr_t);
+void dcache_zero_page(vaddr_t);
+void icache_inv_page(vaddr_t);
+void dcache_wb(vaddr_t, vsize_t);
+void dcache_wbinv(vaddr_t, vsize_t);
+void dcache_inv(vaddr_t, vsize_t);
+void icache_inv(vaddr_t, vsize_t);
+#endif
 void *mapiodev(paddr_t, psize_t);
 void unmapiodev(vaddr_t, vsize_t);
 
@@ -344,7 +388,7 @@
 #define	cpu_need_proftick(l)	((l)->l_pflag |= LP_OWEUPC, curcpu()->ci_astpending = 1)
 #define	cpu_signotify(l)	(curcpu()->ci_astpending = 1)	/* XXXSMP */
 
-#if !defined(PPC_IBM4XX)
+#if !defined(PPC_IBM4XX) && !defined(PPC_BOOKE)
 void oea_init(void (*)(void));
 void oea_startup(const char *);
 void oea_dumpsys(void);

Index: src/sys/arch/powerpc/include/db_machdep.h
diff -u src/sys/arch/powerpc/include/db_machdep.h:1.19 src/sys/arch/powerpc/include/db_machdep.h:1.19.88.1
--- src/sys/arch/powerpc/include/db_machdep.h:1.19	Sun May 14 21:56:32 2006
+++ src/sys/arch/powerpc/include/db_machdep.h	Fri Jan  7 01:59:39 2011
@@ -1,5 +1,5 @@
 /*	$OpenBSD: db_machdep.h,v 1.2 1997/03/21 00:48:48 niklas Exp $	*/
-/*	$NetBSD: db_machdep.h,v 1.19 2006/05/14 21:56:32 elad Exp $	*/
+/*	$NetBSD: db_machdep.h,v 1.19.88.1 2011/01/07 01:59:39 matt Exp $	*/
 
 /* 
  * Mach Operating System
@@ -118,7 +118,7 @@
 				 ((ins)&M_BCTR) == I_BCTR )
 #define inst_load(ins)		0
 #define inst_store(ins)		0
-#ifdef PPC_IBM4XX
+#if defined(PPC_IBM4XX) || defined(PPC_BOOKE)
 #define next_instr_address(v, b) ((db_addr_t) ((b) ? (v) : ((v) + 4)))
 extern db_addr_t branch_taken(int, db_addr_t, db_regs_t *);
 #endif
@@ -150,7 +150,8 @@
 void	kdb_kintr __P((void *));
 int	kdb_trap __P((int, void *));
 
-#ifdef PPC_IBM4XX
+#if defined (PPC_OEA) || defined(PPC_OEA64) || defined(PPC_OEA64_BRIDGE) \
+	|| defined(PPC_IBM4XX) || defined(USERACC) || defined(PPC_BOOKE)
 /*
  * We have machine-dependent commands.
  */

Index: src/sys/arch/powerpc/include/psl.h
diff -u src/sys/arch/powerpc/include/psl.h:1.14 src/sys/arch/powerpc/include/psl.h:1.14.86.1
--- src/sys/arch/powerpc/include/psl.h:1.14	Sat Aug  5 21:26:49 2006
+++ src/sys/arch/powerpc/include/psl.h	Fri Jan  7 01:59:39 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: psl.h,v 1.14 2006/08/05 21:26:49 sanjayl Exp $	*/
+/*	$NetBSD: psl.h,v 1.14.86.1 2011/01/07 01:59:39 matt Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -42,24 +42,34 @@
  *
  * [*] Little-endian mode on the 601 is implemented in the HID0 register.
  */
-#define	PSL_VEC		0x02000000	/* AltiVec vector unit available */
-#define	PSL_POW		0x00040000	/* power management */
-#define	PSL_TGPR	0x00020000	/* temp. gpr remapping (mpc603e) */
-#define	PSL_ILE		0x00010000	/* interrupt endian mode (1 == le) */
-#define	PSL_EE		0x00008000	/* external interrupt enable */
-#define	PSL_PR		0x00004000	/* privilege mode (1 == user) */
-#define	PSL_FP		0x00002000	/* floating point enable */
-#define	PSL_ME		0x00001000	/* machine check enable */
-#define	PSL_FE0		0x00000800	/* floating point interrupt mode 0 */
-#define	PSL_SE		0x00000400	/* single-step trace enable */
-#define	PSL_BE		0x00000200	/* branch trace enable */
-#define	PSL_FE1		0x00000100	/* floating point interrupt mode 1 */
-#define	PSL_IP		0x00000040	/* interrupt prefix */
-#define	PSL_IR		0x00000020	/* instruction address relocation */
-#define	PSL_DR		0x00000010	/* data address relocation */
-#define	PSL_PM		0x00000008	/* Performance monitor marked mode */
-#define	PSL_RI		0x00000002	/* recoverable interrupt */
-#define	PSL_LE		0x00000001	/* endian mode (1 == le) */
+#define	PSL_VEC		0x02000000	/* ..6. AltiVec vector unit available */
+#define	PSL_UCLE	0x00400000	/* B... user-mode cache lock enable */
+#define	PSL_SPV		0x00200000	/* B... (e500) SPE enable */
+#define	PSL_POW		0x00040000	/* ..6. power management */
+#define	PSL_WE		PSL_POW		/* B4.. wait state enable */
+#define	PSL_TGPR	0x00020000	/* ..6. temp. gpr remapping (mpc603e) */
+#define	PSL_CE		PSL_TGPR	/* B4.. critical interrupt enable */
+#define	PSL_ILE		0x00010000	/* ..6. interrupt endian mode (1 == le) */
+#define	PSL_EE		0x00008000	/* B468 external interrupt enable */
+#define	PSL_PR		0x00004000	/* B468 privilege mode (1 == user) */
+#define	PSL_FP		0x00002000	/* B.6. floating point enable */
+#define	PSL_ME		0x00001000	/* B468 machine check enable */
+#define	PSL_FE0		0x00000800	/* B.6. floating point mode 0 */
+#define	PSL_SE		0x00000400	/* ..6. single-step trace enable */
+#define	PSL_DWE		PSL_SE		/* .4.. debug wait enable */
+#define	PSL_UBLE	PSL_SE		/* B... user BTB lock enable */
+#define	PSL_BE		0x00000200	/* ..6. branch trace enable */
+#define	PSL_DE		PSL_BE		/* B4.. debug interrupt enable */
+#define	PSL_FE1		0x00000100	/* B.6. floating point mode 1 */
+#define	PSL_IP		0x00000040	/* ..6. interrupt prefix */
+#define	PSL_IR		0x00000020	/* .468 instruction address relocation */
+#define	PSL_IS		PSL_IR		/* B... instruction address space */
+#define	PSL_DR		0x00000010	/* .468 data address relocation */
+#define	PSL_DS		PSL_DR		/* B... data address space */
+#define	PSL_PM		0x00000008	/* ..6. Performance monitor */
+#define	PSL_PMM		PSL_PM		/* B... Performance monitor */
+#define	PSL_RI		0x00000002	/* ..6. recoverable interrupt */
+#define	PSL_LE		0x00000001	/* ..6. endian mode (1 == le) */
 
 #define	PSL_601_MASK	~(PSL_VEC|PSL_POW|PSL_ILE|PSL_BE|PSL_RI|PSL_LE)
 
@@ -97,12 +107,18 @@
 
 #define	PSL_USERSET		cpu_psluserset
 #define	PSL_USERMOD		cpu_pslusermod
+#elif defined(PPC_BOOKE)
+#define	PSL_USERSET		(PSL_EE | PSL_PR | PSL_ME | PSL_CE | PSL_DE | PSL_IS | PSL_DS)
+#define	PSL_USERMOD		(0)
+#define PSL_USERSRR1		((PSL_USERSET|PSL_USERMOD) & (PSL_CE|0xFFFF))
 #else /* PPC_IBM4XX */
 #define	PSL_USERSET		(PSL_EE | PSL_PR | PSL_ME | PSL_IR | PSL_DR)
 #define	PSL_USERMOD		(0)
 #endif /* PPC_OEA */
 
+#ifndef PSL_USERSRR1
 #define	PSL_USERSRR1		((PSL_USERSET|PSL_USERMOD) & 0xFFFF)
+#endif
 #define	PSL_USEROK_P(psl)	(((psl) & ~PSL_USERMOD) == PSL_USERSET)
 #endif /* !_LOCORE */
 

Reply via email to