Module Name:    src
Committed By:   matt
Date:           Fri Mar 28 21:47:48 UTC 2014

Modified Files:
        src/sys/arch/arm/include: cpufunc.h

Log Message:
Use cpsie/cpsid if possible.
change cache_type to uint8_t
more ARM_MMU_EXTENDED support (ASID)


To generate a diff of this commit:
cvs rdiff -u -r1.68 -r1.69 src/sys/arch/arm/include/cpufunc.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/arm/include/cpufunc.h
diff -u src/sys/arch/arm/include/cpufunc.h:1.68 src/sys/arch/arm/include/cpufunc.h:1.69
--- src/sys/arch/arm/include/cpufunc.h:1.68	Sat Feb 22 20:50:46 2014
+++ src/sys/arch/arm/include/cpufunc.h	Fri Mar 28 21:47:48 2014
@@ -60,7 +60,11 @@ struct cpu_functions {
 
 	u_int	(*cf_control)		(u_int, u_int);
 	void	(*cf_domains)		(u_int);
+#if defined(ARM_MMU_EXTENDED)
+	void	(*cf_setttb)		(u_int, tlb_asid_t);
+#else
 	void	(*cf_setttb)		(u_int, bool);
+#endif
 	u_int	(*cf_faultstatus)	(void);
 	u_int	(*cf_faultaddress)	(void);
 
@@ -152,7 +156,11 @@ struct cpu_functions {
 	int	(*cf_dataabt_fixup)	(void *);
 	int	(*cf_prefetchabt_fixup)	(void *);
 
+#if defined(ARM_MMU_EXTENDED)
+	void	(*cf_context_switch)	(u_int, tlb_asid_t);
+#else
 	void	(*cf_context_switch)	(u_int);
+#endif
 
 	void	(*cf_setup)		(char *);
 };
@@ -424,10 +432,14 @@ extern unsigned armv5_dcache_index_inc;
 void	arm11mpcore_setup		(char *);
 #endif
 
-#if defined(CPU_ARM11) || defined(CPU_CORTEX)
+#if defined(CPU_ARM11)
+#if defined(ARM_MMU_EXTENDED)
+void	arm11_setttb		(u_int, tlb_asid_t);
+void	arm11_context_switch	(u_int, tlb_asid_t);
+#else
 void	arm11_setttb		(u_int, bool);
-
 void	arm11_context_switch	(u_int);
+#endif
 
 void	arm11_cpu_sleep		(int);
 void	arm11_setup		(char *string);
@@ -459,7 +471,13 @@ void	armv6_idcache_wbinv_range (vaddr_t,
 #endif
 
 #if defined(CPU_CORTEX)
+#if defined(ARM_MMU_EXTENDED)
+void	armv7_setttb(u_int, tlb_asid_t);
+void	armv7_context_switch(u_int, tlb_asid_t);
+#else
 void	armv7_setttb(u_int, bool);
+void	armv7_context_switch(u_int);
+#endif
 
 void	armv7_icache_sync_range(vaddr_t, vsize_t);
 void	armv7_dcache_wb_range(vaddr_t, vsize_t);
@@ -478,7 +496,6 @@ void	armv7_tlb_flushI_SE(vaddr_t);
 void	armv7_tlb_flushD_SE(vaddr_t);
 
 void	armv7_cpu_sleep(int);
-void	armv7_context_switch(u_int);
 void	armv7_drain_writebuf(void);
 void	armv7_setup(char *string);
 #endif
@@ -489,7 +506,13 @@ void	armv7_idcache_wbinv_all(void);
 #endif
 
 #if defined(CPU_PJ4B)
+#if defined(ARM_MMU_EXTENDED)
+void	pj4b_setttb(u_int, tlb_asid_t);
+void	pj4b_context_switch(u_int, tlb_asid_t);
+#else
 void	pj4b_setttb(u_int, bool);
+void	pj4b_context_switch(u_int);
+#endif
 void	pj4b_tlb_flushID(void);
 void	pj4b_tlb_flushID_SE(vaddr_t);
 
@@ -503,7 +526,6 @@ void	pj4b_drain_writebuf(void);
 void	pj4b_drain_readbuf(void);
 void	pj4b_flush_brnchtgt_all(void);
 void	pj4b_flush_brnchtgt_va(u_int);
-void	pj4b_context_switch(u_int);
 void	pj4b_sleep(int);
 
 void	pj4bv7_setup(char *string);
@@ -653,16 +675,32 @@ disable_interrupts(uint32_t mask)
 static __inline uint32_t
 enable_interrupts(uint32_t mask)
 {
-	uint32_t	ret, tmp;
+	uint32_t	ret;
 	mask &= (I32_bit | F32_bit);
 
-	__asm volatile(
-		"mrs     %0, cpsr\n"	/* Get the CPSR */
-		"bic	 %1, %0, %2\n"	/* Clear bits */
-		"msr     cpsr_c, %1\n"	/* Set the control field of CPSR */
-	: "=&r" (ret), "=&r" (tmp)
-	: "r" (mask)
-	: "memory");
+	/* Get the CPSR */
+	__asm __volatile("mrs\t%0, cpsr\n" : "=r"(ret));
+#ifdef _ARM_ARCH_6
+	if (__builtin_constant_p(mask)) {
+		switch (mask) {
+		case I32_bit | F32_bit:
+			__asm __volatile("cpsie\tif");
+			break;
+		case I32_bit:
+			__asm __volatile("cpsie\ti");
+			break;
+		case F32_bit:
+			__asm __volatile("cpsie\tf");
+			break;
+		default:
+			break;
+		}
+		return ret;
+	}
+#endif /* _ARM_ARCH_6 */
+
+	/* Set the control field of CPSR */
+	__asm volatile("msr\tcpsr_c, %0" :: "r"(ret & ~mask));
 
 	return ret;
 }
@@ -764,7 +802,7 @@ struct arm_cache_info {
 	u_int dcache_way_size;
 	u_int dcache_sets;
 
-	u_int cache_type;
+	uint8_t cache_type;
 	bool cache_unified;
 	uint8_t icache_type;
 	uint8_t dcache_type;

Reply via email to