#define TDVMCALL_STATUS_RETRY          0x0000000000000001ULL
 #define TDVMCALL_STATUS_INVALID_OPERAND        0x8000000000000000ULL
 #define TDVMCALL_STATUS_ALIGN_ERROR    0x8000000000000002ULL
+#define TDVMCALL_STATUS_SUBFUNC_UNSUPPORTED    0x8000000000000003ULL
 
 /*
  * Bitmasks of exposed registers (with VMM).
 
        /*
         * Converting TDVMCALL_MAP_GPA to KVM_HC_MAP_GPA_RANGE requires
         * userspace to enable KVM_CAP_EXIT_HYPERCALL with KVM_HC_MAP_GPA_RANGE
-        * bit set.  If not, the error code is not defined in GHCI for TDX, use
-        * TDVMCALL_STATUS_INVALID_OPERAND for this case.
+        * bit set.  This is a base call so it should always be supported, but
+        * KVM has no way to ensure that userspace implements the GHCI correctly.
+        * So if KVM_HC_MAP_GPA_RANGE does not cause a VMEXIT, return an error
+        * to the guest.
         */
        if (!user_exit_on_hypercall(vcpu->kvm, KVM_HC_MAP_GPA_RANGE)) {
-               ret = TDVMCALL_STATUS_INVALID_OPERAND;
+               ret = TDVMCALL_STATUS_SUBFUNC_UNSUPPORTED;
                goto error;
        }
 
                break;
        }
 
-       tdvmcall_set_return_code(vcpu, TDVMCALL_STATUS_INVALID_OPERAND);
+       tdvmcall_set_return_code(vcpu, TDVMCALL_STATUS_SUBFUNC_UNSUPPORTED);
        return 1;
 }