diff --git a/sys/dev/psci/smccc.h b/sys/dev/psci/smccc.h
--- a/sys/dev/psci/smccc.h
+++ b/sys/dev/psci/smccc.h
@@ -91,4 +91,29 @@
 int arm_smccc_hvc(register_t, register_t, register_t, register_t, register_t,
     register_t, register_t, register_t, struct arm_smccc_res *res);
 
+struct arm_smccc_1_2_regs {
+	register_t a0;
+	register_t a1;
+	register_t a2;
+	register_t a3;
+	register_t a4;
+	register_t a5;
+	register_t a6;
+	register_t a7;
+	register_t a8;
+	register_t a9;
+	register_t a10;
+	register_t a11;
+	register_t a12;
+	register_t a13;
+	register_t a14;
+	register_t a15;
+	register_t a16;
+	register_t a17;
+};
+
+int arm_smccc_1_2_hvc(const struct arm_smccc_1_2_regs *args,
+    struct arm_smccc_1_2_regs *res);
+int arm_smccc_1_2_smc(const struct arm_smccc_1_2_regs *args,
+    struct arm_smccc_1_2_regs *res);
 #endif /* _PSCI_SMCCC_H_ */
diff --git a/sys/dev/psci/smccc_arm64.S b/sys/dev/psci/smccc_arm64.S
--- a/sys/dev/psci/smccc_arm64.S
+++ b/sys/dev/psci/smccc_arm64.S
@@ -51,3 +51,38 @@
  */
 arm_smccc_1_0	hvc
 arm_smccc_1_0	smc
+
+.macro arm_smccc_1_2	insn
+ENTRY(arm_smccc_1_2_\insn)
+	stp	x1, x19, [sp, #-16]!
+	mov	x19, x0
+	ldp	x0, x1, [x19, #16 * 0]
+	ldp	x2, x3, [x19, #16 * 1]
+	ldp	x4, x5, [x19, #16 * 2]
+	ldp	x6, x7, [x19, #16 * 3]
+	ldp	x8, x9, [x19, #16 * 4]
+	ldp	x10, x11, [x19, #16 * 5]
+	ldp	x12, x13, [x19, #16 * 6]
+	ldp	x14, x15, [x19, #16 * 7]
+	ldp	x16, x17, [x19, #16 * 8]
+	\insn	#0
+	ldr	x19, [sp]
+	cbz	x19, 1f
+	stp	x0, x1, [x19, #16 * 0]
+	stp	x2, x3, [x19, #16 * 1]
+	stp	x4, x5, [x19, #16 * 2]
+	stp	x6, x7, [x19, #16 * 3]
+	stp	x8, x9, [x19, #16 * 4]
+	stp	x10, x11, [x19, #16 * 5]
+	stp	x12, x13, [x19, #16 * 6]
+	stp	x14, x15, [x19, #16 * 7]
+	stp	x16, x17, [x19, #16 * 8]
+	ldp	xzr, x19, [sp], #16
+1:	ret
+END(arm_smccc_1_2\insn)
+.endm
+/* int arm_smccc_1_2_*(const struct arm_smccc_1_2_regs *args,
+ *     struct arm_smccc_1_2_regs *res)
+ */
+arm_smccc_1_2	hvc
+arm_smccc_1_2	smc