diff options
-rw-r--r-- | virt/kvm/arm/arm.c | 31 |
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 | ||
1338 | static 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 | ||
1428 | out_err: | 1417 | out_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 | ||
1490 | out_hyp: | 1486 | out_hyp: |
1491 | teardown_hyp_mode(); | 1487 | if (!in_hyp_mode) |
1488 | teardown_hyp_mode(); | ||
1492 | out_err: | 1489 | out_err: |
1493 | teardown_common_resources(); | 1490 | teardown_common_resources(); |
1494 | return err; | 1491 | return err; |