|
@@ -1396,3 +1396,95 @@ do { \
|
|
__asm__ __volatile__( \
|
|
__asm__ __volatile__( \
|
|
" .set push \n" \
|
|
" .set push \n" \
|
|
" .set noat \n" \
|
|
" .set noat \n" \
|
|
|
|
+ " move $1, %0 \n" \
|
|
|
|
+ " # mtlo $1, $ac1 \n" \
|
|
|
|
+ " .word 0x00200813 \n" \
|
|
|
|
+ " .set pop \n" \
|
|
|
|
+ : \
|
|
|
|
+ : "r" (x)); \
|
|
|
|
+} while (0)
|
|
|
|
+
|
|
|
|
+#define mtlo2(x) \
|
|
|
|
+do { \
|
|
|
|
+ __asm__ __volatile__( \
|
|
|
|
+ " .set push \n" \
|
|
|
|
+ " .set noat \n" \
|
|
|
|
+ " move $1, %0 \n" \
|
|
|
|
+ " # mtlo $1, $ac2 \n" \
|
|
|
|
+ " .word 0x00201013 \n" \
|
|
|
|
+ " .set pop \n" \
|
|
|
|
+ : \
|
|
|
|
+ : "r" (x)); \
|
|
|
|
+} while (0)
|
|
|
|
+
|
|
|
|
+#define mtlo3(x) \
|
|
|
|
+do { \
|
|
|
|
+ __asm__ __volatile__( \
|
|
|
|
+ " .set push \n" \
|
|
|
|
+ " .set noat \n" \
|
|
|
|
+ " move $1, %0 \n" \
|
|
|
|
+ " # mtlo $1, $ac3 \n" \
|
|
|
|
+ " .word 0x00201813 \n" \
|
|
|
|
+ " .set pop \n" \
|
|
|
|
+ : \
|
|
|
|
+ : "r" (x)); \
|
|
|
|
+} while (0)
|
|
|
|
+
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * TLB operations.
|
|
|
|
+ *
|
|
|
|
+ * It is responsibility of the caller to take care of any TLB hazards.
|
|
|
|
+ */
|
|
|
|
+static inline void tlb_probe(void)
|
|
|
|
+{
|
|
|
|
+ __asm__ __volatile__(
|
|
|
|
+ ".set noreorder\n\t"
|
|
|
|
+ "tlbp\n\t"
|
|
|
|
+ ".set reorder");
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static inline void tlb_read(void)
|
|
|
|
+{
|
|
|
|
+#if MIPS34K_MISSED_ITLB_WAR
|
|
|
|
+ int res = 0;
|
|
|
|
+
|
|
|
|
+ __asm__ __volatile__(
|
|
|
|
+ " .set push \n"
|
|
|
|
+ " .set noreorder \n"
|
|
|
|
+ " .set noat \n"
|
|
|
|
+ " .set mips32r2 \n"
|
|
|
|
+ " .word 0x41610001 # dvpe $1 \n"
|
|
|
|
+ " move %0, $1 \n"
|
|
|
|
+ " ehb \n"
|
|
|
|
+ " .set pop \n"
|
|
|
|
+ : "=r" (res));
|
|
|
|
+
|
|
|
|
+ instruction_hazard();
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+ __asm__ __volatile__(
|
|
|
|
+ ".set noreorder\n\t"
|
|
|
|
+ "tlbr\n\t"
|
|
|
|
+ ".set reorder");
|
|
|
|
+
|
|
|
|
+#if MIPS34K_MISSED_ITLB_WAR
|
|
|
|
+ if ((res & _ULCAST_(1)))
|
|
|
|
+ __asm__ __volatile__(
|
|
|
|
+ " .set push \n"
|
|
|
|
+ " .set noreorder \n"
|
|
|
|
+ " .set noat \n"
|
|
|
|
+ " .set mips32r2 \n"
|
|
|
|
+ " .word 0x41600021 # evpe \n"
|
|
|
|
+ " ehb \n"
|
|
|
|
+ " .set pop \n");
|
|
|
|
+#endif
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static inline void tlb_write_indexed(void)
|
|
|
|
+{
|
|
|
|
+ __asm__ __volatile__(
|
|
|
|
+ ".set noreorder\n\t"
|
|
|
|
+ "tlbwi\n\t"
|
|
|
|
+ ".set reorder");
|