/*
         * Special stuff for a reset
         */
-       void (*reset)(unsigned long addr) __attribute__((noreturn));
+       void (*reset)(unsigned long addr, bool hvc) __attribute__((noreturn));
        /*
         * Idle the processor
         */
 #else
 extern void cpu_set_pte_ext(pte_t *ptep, pte_t pte, unsigned int ext);
 #endif
-extern void cpu_reset(unsigned long addr) __attribute__((noreturn));
+extern void cpu_reset(unsigned long addr, bool hvc) __attribute__((noreturn));
 
 /* These three are private to arch/arm/kernel/suspend.c */
 extern void cpu_do_suspend(void *);
 
 
 #define HVC_GET_VECTORS 0
 #define HVC_SET_VECTORS 1
+#define HVC_SOFT_RESTART 2
 
 #ifndef ZIMAGE
 /*
        mcr     p15, 4, r1, c12, c0, 0  @ set HVBAR
        b       __hyp_stub_exit
 
+1:     teq     r0, #HVC_SOFT_RESTART
+       bne     1f
+       bx      r3
+
 1:     mov     r0, #-1
 
 __hyp_stub_exit:
        ret     lr
 ENDPROC(__hyp_set_vectors)
 
+ENTRY(__hyp_soft_restart)
+       mov     r3, r0
+       mov     r0, #HVC_SOFT_RESTART
+       __HVC(0)
+       mov     r0, r3
+       ret     lr
+ENDPROC(__hyp_soft_restart)
+
 #ifndef ZIMAGE
 .align 2
 .L__boot_cpu_mode_offset:
 
 
 #include <asm/cacheflush.h>
 #include <asm/idmap.h>
+#include <asm/virt.h>
 
 #include "reboot.h"
 
-typedef void (*phys_reset_t)(unsigned long);
+typedef void (*phys_reset_t)(unsigned long, bool);
 
 /*
  * Function pointers to optional machine specific functions
 
        /* Switch to the identity mapping. */
        phys_reset = (phys_reset_t)virt_to_idmap(cpu_reset);
-       phys_reset((unsigned long)addr);
+
+       /* original stub should be restored by kvm */
+       phys_reset((unsigned long)addr, is_hyp_mode_available());
 
        /* Should never get here. */
        BUG();
 
        .align  5
        .pushsection    .idmap.text, "ax"
 ENTRY(cpu_v7_reset)
-       mrc     p15, 0, r1, c1, c0, 0           @ ctrl register
-       bic     r1, r1, #0x1                    @ ...............m
- THUMB(        bic     r1, r1, #1 << 30 )              @ SCTLR.TE (Thumb exceptions)
-       mcr     p15, 0, r1, c1, c0, 0           @ disable MMU
+       mrc     p15, 0, r2, c1, c0, 0           @ ctrl register
+       bic     r2, r2, #0x1                    @ ...............m
+ THUMB(        bic     r2, r2, #1 << 30 )              @ SCTLR.TE (Thumb exceptions)
+       mcr     p15, 0, r2, c1, c0, 0           @ disable MMU
        isb
+#ifdef CONFIG_ARM_VIRT_EXT
+       teq     r1, #0
+       bne     __hyp_soft_restart
+#endif
        bx      r0
 ENDPROC(cpu_v7_reset)
        .popsection