// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <memory>

#include <ddk/binding.h>
#include <ddk/debug.h>
#include <ddk/platform-defs.h>
#include <ddktl/device.h>

namespace crash {

class CrashDevice;

using CrashDeviceType = ddk::Device<CrashDevice, ddk::Openable>;

class CrashDevice : public CrashDeviceType {
 public:
  explicit CrashDevice(zx_device_t* parent) : CrashDeviceType(parent) {}

  zx_status_t DdkOpen(zx_device_t** out, uint32_t flags) {
    zxlogf(INFO, "Crash-device open, will crash on purpose!");
    // We crash using a bad access here instead of just asserting false because there are some bots
    // in CQ that are looking for the ASSERT FAILED message to mark runs as failed.
    __builtin_abort();
    return ZX_OK;
  }

  void DdkRelease() { delete this; }

  static zx_status_t Create(void* ctx, zx_device_t* parent) {
    zxlogf(INFO, "CrashDevice::Create");
    auto dev = std::unique_ptr<CrashDevice>(new CrashDevice(parent));
    zx_status_t status = dev->DdkAdd("crash-device");
    if (status != ZX_OK) {
      zxlogf(ERROR, "%s: could not add device: %d", __func__, status);
    } else {
      // devmgr owns the memory now
      __UNUSED auto* ptr = dev.release();
    }
    return status;
  }
};

static constexpr zx_driver_ops_t driver_ops = []() {
  zx_driver_ops_t ops = {};
  ops.version = DRIVER_OPS_VERSION;
  ops.bind = CrashDevice::Create;
  return ops;
}();

}  // namespace crash

// clang-format off
ZIRCON_DRIVER_BEGIN(crash_device, crash::driver_ops, "fuchsia", "0.1", 3)
            BI_ABORT_IF(NE, BIND_PLATFORM_DEV_VID, PDEV_VID_GENERIC),
            BI_ABORT_IF(NE, BIND_PLATFORM_DEV_PID, PDEV_PID_GENERIC),
            BI_MATCH_IF(EQ, BIND_PLATFORM_DEV_DID, PDEV_DID_CRASH_TEST),
ZIRCON_DRIVER_END(crash_device)
    // clang-format on
