@@ -127,6 +127,14 @@ void platform_poweroff(void)
platform->poweroff();
}
+bool platform_hvc(struct cpu_user_regs *regs)
+{
+ if ( platform && platform->hvc )
+ return platform->hvc(regs);
+
+ return false;
+}
+
bool_t platform_has_quirk(uint32_t quirk)
{
uint32_t quirks = 0;
@@ -43,6 +43,7 @@
#include <asm/cpufeature.h>
#include <asm/flushtlb.h>
#include <asm/monitor.h>
+#include <asm/platform.h>
#include "decode.h"
#include "vtimer.h"
@@ -1429,6 +1430,8 @@ static void do_trap_psci(struct cpu_user_regs *regs)
}
break;
default:
+ if ( platform_hvc(regs) )
+ return;
domain_crash_synchronous();
return;
}
@@ -26,6 +26,10 @@ struct platform_desc {
void (*reset)(void);
/* Platform power-off */
void (*poweroff)(void);
+ /* Platform specific HVC handler.
+ * Returns true if the call was handled and false if not.
+ */
+ bool (*hvc)(struct cpu_user_regs *regs);
/*
* Platform quirks
* Defined has a function because a platform can support multiple
@@ -55,6 +59,7 @@ int platform_cpu_up(int cpu);
#endif
void platform_reset(void);
void platform_poweroff(void);
+bool platform_hvc(struct cpu_user_regs *regs);
bool_t platform_has_quirk(uint32_t quirk);
bool_t platform_device_is_blacklisted(const struct dt_device_node *node);