diff options
author | David S. Miller <davem@sunset.davemloft.net> | 2007-05-29 05:22:14 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2007-05-29 05:52:15 -0400 |
commit | 7db35f31cbb8ca1dbaba03d74b7db79ace084358 (patch) | |
tree | 98dcbdb70d613ba6ddcf7c8bec03d79748342109 /arch/sparc64/mm/init.c | |
parent | 2d9e2763c22a4ce41c3cc5f35366a51f1eba38dc (diff) |
[SPARC64]: Fill holes in hypervisor APIs and fix KTSB registry.
Several interfaces were missing and others misnumbered or
improperly documented.
Also, make sure to check the return value when registering
the kernel TSBs with the hypervisor. This helped to find
the 4MB kernel TSB alignment bug fixed in a previous changeset.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/sparc64/mm/init.c')
-rw-r--r-- | arch/sparc64/mm/init.c | 41 |
1 files changed, 11 insertions, 30 deletions
diff --git a/arch/sparc64/mm/init.c b/arch/sparc64/mm/init.c index 97af4311f78..3010227fe24 100644 --- a/arch/sparc64/mm/init.c +++ b/arch/sparc64/mm/init.c | |||
@@ -558,26 +558,11 @@ static void __init hypervisor_tlb_lock(unsigned long vaddr, | |||
558 | unsigned long pte, | 558 | unsigned long pte, |
559 | unsigned long mmu) | 559 | unsigned long mmu) |
560 | { | 560 | { |
561 | register unsigned long func asm("%o5"); | 561 | unsigned long ret = sun4v_mmu_map_perm_addr(vaddr, 0, pte, mmu); |
562 | register unsigned long arg0 asm("%o0"); | 562 | |
563 | register unsigned long arg1 asm("%o1"); | 563 | if (ret != 0) { |
564 | register unsigned long arg2 asm("%o2"); | ||
565 | register unsigned long arg3 asm("%o3"); | ||
566 | |||
567 | func = HV_FAST_MMU_MAP_PERM_ADDR; | ||
568 | arg0 = vaddr; | ||
569 | arg1 = 0; | ||
570 | arg2 = pte; | ||
571 | arg3 = mmu; | ||
572 | __asm__ __volatile__("ta 0x80" | ||
573 | : "=&r" (func), "=&r" (arg0), | ||
574 | "=&r" (arg1), "=&r" (arg2), | ||
575 | "=&r" (arg3) | ||
576 | : "0" (func), "1" (arg0), "2" (arg1), | ||
577 | "3" (arg2), "4" (arg3)); | ||
578 | if (arg0 != 0) { | ||
579 | prom_printf("hypervisor_tlb_lock[%lx:%lx:%lx:%lx]: " | 564 | prom_printf("hypervisor_tlb_lock[%lx:%lx:%lx:%lx]: " |
580 | "errors with %lx\n", vaddr, 0, pte, mmu, arg0); | 565 | "errors with %lx\n", vaddr, 0, pte, mmu, ret); |
581 | prom_halt(); | 566 | prom_halt(); |
582 | } | 567 | } |
583 | } | 568 | } |
@@ -1314,20 +1299,16 @@ static void __init sun4v_ktsb_init(void) | |||
1314 | 1299 | ||
1315 | void __cpuinit sun4v_ktsb_register(void) | 1300 | void __cpuinit sun4v_ktsb_register(void) |
1316 | { | 1301 | { |
1317 | register unsigned long func asm("%o5"); | 1302 | unsigned long pa, ret; |
1318 | register unsigned long arg0 asm("%o0"); | ||
1319 | register unsigned long arg1 asm("%o1"); | ||
1320 | unsigned long pa; | ||
1321 | 1303 | ||
1322 | pa = kern_base + ((unsigned long)&ktsb_descr[0] - KERNBASE); | 1304 | pa = kern_base + ((unsigned long)&ktsb_descr[0] - KERNBASE); |
1323 | 1305 | ||
1324 | func = HV_FAST_MMU_TSB_CTX0; | 1306 | ret = sun4v_mmu_tsb_ctx0(NUM_KTSB_DESCR, pa); |
1325 | arg0 = NUM_KTSB_DESCR; | 1307 | if (ret != 0) { |
1326 | arg1 = pa; | 1308 | prom_printf("hypervisor_mmu_tsb_ctx0[%lx]: " |
1327 | __asm__ __volatile__("ta %6" | 1309 | "errors with %lx\n", pa, ret); |
1328 | : "=&r" (func), "=&r" (arg0), "=&r" (arg1) | 1310 | prom_halt(); |
1329 | : "0" (func), "1" (arg0), "2" (arg1), | 1311 | } |
1330 | "i" (HV_FAST_TRAP)); | ||
1331 | } | 1312 | } |
1332 | 1313 | ||
1333 | /* paging_init() sets up the page tables */ | 1314 | /* paging_init() sets up the page tables */ |