extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_rfence;
 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_srst;
 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_hsm;
+extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_dbcn;
 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_experimental;
 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_vendor;
 
 
                .ext_idx = KVM_RISCV_SBI_EXT_PMU,
                .ext_ptr = &vcpu_sbi_ext_pmu,
        },
+       {
+               .ext_idx = KVM_RISCV_SBI_EXT_DBCN,
+               .ext_ptr = &vcpu_sbi_ext_dbcn,
+       },
        {
                .ext_idx = KVM_RISCV_SBI_EXT_EXPERIMENTAL,
                .ext_ptr = &vcpu_sbi_ext_experimental,
 
        .extid_end = SBI_EXT_SRST,
        .handler = kvm_sbi_ext_srst_handler,
 };
+
+static int kvm_sbi_ext_dbcn_handler(struct kvm_vcpu *vcpu,
+                                   struct kvm_run *run,
+                                   struct kvm_vcpu_sbi_return *retdata)
+{
+       struct kvm_cpu_context *cp = &vcpu->arch.guest_context;
+       unsigned long funcid = cp->a6;
+
+       switch (funcid) {
+       case SBI_EXT_DBCN_CONSOLE_WRITE:
+       case SBI_EXT_DBCN_CONSOLE_READ:
+       case SBI_EXT_DBCN_CONSOLE_WRITE_BYTE:
+               /*
+                * The SBI debug console functions are unconditionally
+                * forwarded to the userspace.
+                */
+               kvm_riscv_vcpu_sbi_forward(vcpu, run);
+               retdata->uexit = true;
+               break;
+       default:
+               retdata->err_val = SBI_ERR_NOT_SUPPORTED;
+       }
+
+       return 0;
+}
+
+const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_dbcn = {
+       .extid_start = SBI_EXT_DBCN,
+       .extid_end = SBI_EXT_DBCN,
+       .default_unavail = true,
+       .handler = kvm_sbi_ext_dbcn_handler,
+};