diff --git a/xen/arch/arm/vsmc.c b/xen/arch/arm/vsmc.c
index 997f2e0ebc..3d8cbcc808 100644
--- a/xen/arch/arm/vsmc.c
+++ b/xen/arch/arm/vsmc.c
@@ -28,7 +28,7 @@
 #define XEN_SMCCC_FUNCTION_COUNT 3
 
 /* Number of functions currently supported by Standard Service Service Calls. */
-#define SSSC_SMCCC_FUNCTION_COUNT 11
+#define SSSC_SMCCC_FUNCTION_COUNT 14
 
 static bool fill_uid(struct cpu_user_regs *regs, xen_uuid_t uuid)
 {
@@ -84,13 +84,15 @@ static bool fill_function_call_count(struct cpu_user_regs *regs, uint32_t cnt)
 /* SMCCC interface for hypervisor. Tell about itself. */
 static bool handle_hypervisor(struct cpu_user_regs *regs)
 {
-    switch ( smccc_get_fn(get_user_reg(regs, 0)) )
+    uint32_t fid = (uint32_t)get_user_reg(regs, 0);
+
+    switch ( fid )
     {
-    case ARM_SMCCC_FUNC_CALL_COUNT:
+    case ARM_SMCCC_CALL_COUNT_FID(HYPERVISOR):
         return fill_function_call_count(regs, XEN_SMCCC_FUNCTION_COUNT);
-    case ARM_SMCCC_FUNC_CALL_UID:
+    case ARM_SMCCC_CALL_UID_FID(HYPERVISOR):
         return fill_uid(regs, XEN_SMCCC_UID);
-    case ARM_SMCCC_FUNC_CALL_REVISION:
+    case ARM_SMCCC_REVISION_FID(HYPERVISOR):
         return fill_revision(regs, XEN_SMCCC_MAJOR_REVISION,
                              XEN_SMCCC_MINOR_REVISION);
     default:
@@ -140,36 +142,37 @@ static bool handle_sssc(struct cpu_user_regs *regs)
 {
     uint32_t fid = (uint32_t)get_user_reg(regs, 0);
 
-    switch ( smccc_get_fn(fid) )
+    switch ( fid )
     {
-    case PSCI_0_2_FN_PSCI_VERSION:
+    case PSCI_0_2_FN32(PSCI_VERSION):
         perfc_incr(vpsci_version);
         PSCI_SET_RESULT(regs, do_psci_0_2_version());
         return true;
 
-    case PSCI_0_2_FN_CPU_OFF:
+    case PSCI_0_2_FN32(CPU_OFF):
         perfc_incr(vpsci_cpu_off);
         PSCI_SET_RESULT(regs, do_psci_0_2_cpu_off());
         return true;
 
-    case PSCI_0_2_FN_MIGRATE_INFO_TYPE:
+    case PSCI_0_2_FN32(MIGRATE_INFO_TYPE):
         perfc_incr(vpsci_migrate_info_type);
         PSCI_SET_RESULT(regs, do_psci_0_2_migrate_info_type());
         return true;
 
-    case PSCI_0_2_FN_SYSTEM_OFF:
+    case PSCI_0_2_FN32(SYSTEM_OFF):
         perfc_incr(vpsci_system_off);
         do_psci_0_2_system_off();
         PSCI_SET_RESULT(regs, PSCI_INTERNAL_FAILURE);
         return true;
 
-    case PSCI_0_2_FN_SYSTEM_RESET:
+    case PSCI_0_2_FN32(SYSTEM_RESET):
         perfc_incr(vpsci_system_reset);
         do_psci_0_2_system_reset();
         PSCI_SET_RESULT(regs, PSCI_INTERNAL_FAILURE);
         return true;
 
-    case PSCI_0_2_FN_CPU_ON:
+    case PSCI_0_2_FN32(CPU_ON):
+    case PSCI_0_2_FN64(CPU_ON):
     {
         register_t vcpuid = PSCI_ARG(regs, 1);
         register_t epoint = PSCI_ARG(regs, 2);
@@ -180,7 +183,8 @@ static bool handle_sssc(struct cpu_user_regs *regs)
         return true;
     }
 
-    case PSCI_0_2_FN_CPU_SUSPEND:
+    case PSCI_0_2_FN32(CPU_SUSPEND):
+    case PSCI_0_2_FN64(CPU_SUSPEND):
     {
         uint32_t pstate = PSCI_ARG32(regs, 1);
         register_t epoint = PSCI_ARG(regs, 2);
@@ -191,7 +195,8 @@ static bool handle_sssc(struct cpu_user_regs *regs)
         return true;
     }
 
-    case PSCI_0_2_FN_AFFINITY_INFO:
+    case PSCI_0_2_FN32(AFFINITY_INFO):
+    case PSCI_0_2_FN64(AFFINITY_INFO):
     {
         register_t taff = PSCI_ARG(regs, 1);
         uint32_t laff = PSCI_ARG32(regs, 2);
@@ -201,13 +206,13 @@ static bool handle_sssc(struct cpu_user_regs *regs)
         return true;
     }
 
-    case ARM_SMCCC_FUNC_CALL_COUNT:
+    case ARM_SMCCC_CALL_COUNT_FID(STANDARD):
         return fill_function_call_count(regs, SSSC_SMCCC_FUNCTION_COUNT);
 
-    case ARM_SMCCC_FUNC_CALL_UID:
+    case ARM_SMCCC_CALL_UID_FID(STANDARD):
         return fill_uid(regs, SSSC_SMCCC_UID);
 
-    case ARM_SMCCC_FUNC_CALL_REVISION:
+    case ARM_SMCCC_REVISION_FID(STANDARD):
         return fill_revision(regs, SSSC_SMCCC_MAJOR_REVISION,
                              SSSC_SMCCC_MINOR_REVISION);
 
diff --git a/xen/include/asm-arm/smccc.h b/xen/include/asm-arm/smccc.h
index f543dea0bb..62b3a8cdf5 100644
--- a/xen/include/asm-arm/smccc.h
+++ b/xen/include/asm-arm/smccc.h
@@ -82,9 +82,23 @@ static inline uint32_t smccc_get_owner(register_t funcid)
 #define ARM_SMCCC_OWNER_TRUSTED_OS_END  63
 
 /* List of generic function numbers */
-#define ARM_SMCCC_FUNC_CALL_COUNT       0xFF00
-#define ARM_SMCCC_FUNC_CALL_UID         0xFF01
-#define ARM_SMCCC_FUNC_CALL_REVISION    0xFF03
+#define ARM_SMCCC_CALL_COUNT_FID(owner)             \
+    ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,         \
+                       ARM_SMCCC_CONV_32,           \
+                       ARM_SMCCC_OWNER_##owner,     \
+                       0xFF00)
+
+#define ARM_SMCCC_CALL_UID_FID(owner)               \
+    ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,         \
+                       ARM_SMCCC_CONV_32,           \
+                       ARM_SMCCC_OWNER_##owner,     \
+                       0xFF01)
+
+#define ARM_SMCCC_REVISION_FID(owner)               \
+    ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,         \
+                       ARM_SMCCC_CONV_32,           \
+                       ARM_SMCCC_OWNER_##owner,     \
+                       0xFF03)
 
 /* Only one error code defined in SMCCC */
 #define ARM_SMCCC_ERR_UNKNOWN_FUNCTION  (-1)
