Răsfoiți Sursa

[SPARC64]: Handle hypervisor case correctly in copy_tsb().

Signed-off-by: David S. Miller <davem@davemloft.net>
David S. Miller 19 ani în urmă
părinte
comite
e92b92571c
1 a modificat fișierele cu 9 adăugiri și 2 ștergeri
  1. 9 2
      arch/sparc64/mm/tsb.c

+ 9 - 2
arch/sparc64/mm/tsb.c

@@ -231,7 +231,13 @@ static void copy_tsb(struct tsb *old_tsb, unsigned long old_size,
 		register unsigned long pte asm("o5");
 		unsigned long v, hash;
 
-		if (tlb_type == cheetah_plus) {
+		if (tlb_type == hypervisor) {
+			__asm__ __volatile__(
+				"ldda [%2] %3, %0"
+				: "=r" (tag), "=r" (pte)
+				: "r" (__pa(&old_tsb[i])),
+				  "i" (ASI_QUAD_LDD_PHYS_4V));
+		} else if (tlb_type == cheetah_plus) {
 			__asm__ __volatile__(
 				"ldda [%2] %3, %0"
 				: "=r" (tag), "=r" (pte)
@@ -267,7 +273,8 @@ static void copy_tsb(struct tsb *old_tsb, unsigned long old_size,
 		v |= (i & (512UL - 1UL)) << 13UL;
 
 		hash = tsb_hash(v, new_nentries);
-		if (tlb_type == cheetah_plus) {
+		if (tlb_type == cheetah_plus ||
+		    tlb_type == hypervisor) {
 			__asm__ __volatile__(
 				"stxa	%0, [%1] %2\n\t"
 				"stxa	%3, [%4] %2"