aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--virt/kvm/arm/arm.c31
1 files changed, 14 insertions, 17 deletions
diff --git a/virt/kvm/arm/arm.c b/virt/kvm/arm/arm.c
index b9f68e4add71..95cba0799828 100644
--- a/virt/kvm/arm/arm.c
+++ b/virt/kvm/arm/arm.c
@@ -1326,21 +1326,12 @@ static void teardown_hyp_mode(void)
1326{ 1326{
1327 int cpu; 1327 int cpu;
1328 1328
1329 if (is_kernel_in_hyp_mode())
1330 return;
1331
1332 free_hyp_pgds(); 1329 free_hyp_pgds();
1333 for_each_possible_cpu(cpu) 1330 for_each_possible_cpu(cpu)
1334 free_page(per_cpu(kvm_arm_hyp_stack_page, cpu)); 1331 free_page(per_cpu(kvm_arm_hyp_stack_page, cpu));
1335 hyp_cpu_pm_exit(); 1332 hyp_cpu_pm_exit();
1336} 1333}
1337 1334
1338static int init_vhe_mode(void)
1339{
1340 kvm_info("VHE mode initialized successfully\n");
1341 return 0;
1342}
1343
1344/** 1335/**
1345 * Inits Hyp-mode on all online CPUs 1336 * Inits Hyp-mode on all online CPUs
1346 */ 1337 */
@@ -1421,8 +1412,6 @@ static int init_hyp_mode(void)
1421 } 1412 }
1422 } 1413 }
1423 1414
1424 kvm_info("Hyp mode initialized successfully\n");
1425
1426 return 0; 1415 return 0;
1427 1416
1428out_err: 1417out_err:
@@ -1456,6 +1445,7 @@ int kvm_arch_init(void *opaque)
1456{ 1445{
1457 int err; 1446 int err;
1458 int ret, cpu; 1447 int ret, cpu;
1448 bool in_hyp_mode;
1459 1449
1460 if (!is_hyp_mode_available()) { 1450 if (!is_hyp_mode_available()) {
1461 kvm_err("HYP mode not available\n"); 1451 kvm_err("HYP mode not available\n");
@@ -1474,21 +1464,28 @@ int kvm_arch_init(void *opaque)
1474 if (err) 1464 if (err)
1475 return err; 1465 return err;
1476 1466
1477 if (is_kernel_in_hyp_mode()) 1467 in_hyp_mode = is_kernel_in_hyp_mode();
1478 err = init_vhe_mode(); 1468
1479 else 1469 if (!in_hyp_mode) {
1480 err = init_hyp_mode(); 1470 err = init_hyp_mode();
1481 if (err) 1471 if (err)
1482 goto out_err; 1472 goto out_err;
1473 }
1483 1474
1484 err = init_subsystems(); 1475 err = init_subsystems();
1485 if (err) 1476 if (err)
1486 goto out_hyp; 1477 goto out_hyp;
1487 1478
1479 if (in_hyp_mode)
1480 kvm_info("VHE mode initialized successfully\n");
1481 else
1482 kvm_info("Hyp mode initialized successfully\n");
1483
1488 return 0; 1484 return 0;
1489 1485
1490out_hyp: 1486out_hyp:
1491 teardown_hyp_mode(); 1487 if (!in_hyp_mode)
1488 teardown_hyp_mode();
1492out_err: 1489out_err:
1493 teardown_common_resources(); 1490 teardown_common_resources();
1494 return err; 1491 return err;