blob: fb17d5680a2d3b61509c5e4aa21dff823d4d701a [file] [log] [blame]
// Copyright 2016 The Fuchsia Authors
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT
#include <lib/userabi/userboot_internal.h>
#include <zircon/assert.h>
#include <ktl/move.h>
#include <object/handle.h>
#include <object/resource_dispatcher.h>
#include <ktl/enforce.h>
HandleOwner get_resource_handle(zx_rsrc_kind_t kind) {
char name[ZX_MAX_NAME_LEN];
switch (kind) {
case ZX_RSRC_KIND_MMIO:
strlcpy(name, "mmio", ZX_MAX_NAME_LEN);
break;
case ZX_RSRC_KIND_IRQ:
strlcpy(name, "irq", ZX_MAX_NAME_LEN);
break;
case ZX_RSRC_KIND_IOPORT:
strlcpy(name, "io_port", ZX_MAX_NAME_LEN);
break;
case ZX_RSRC_KIND_ROOT:
strlcpy(name, "root", ZX_MAX_NAME_LEN);
break;
case ZX_RSRC_KIND_SMC:
strlcpy(name, "smc", ZX_MAX_NAME_LEN);
break;
case ZX_RSRC_KIND_SYSTEM:
strlcpy(name, "system", ZX_MAX_NAME_LEN);
break;
}
zx_rights_t rights;
KernelHandle<ResourceDispatcher> rsrc;
zx_status_t result;
switch (kind) {
case ZX_RSRC_KIND_ROOT:
result = ResourceDispatcher::Create(&rsrc, &rights, kind, 0, 0, 0, name);
break;
case ZX_RSRC_KIND_MMIO:
case ZX_RSRC_KIND_IRQ:
#if ARCH_X86
case ZX_RSRC_KIND_IOPORT:
#elif ARCH_ARM64
case ZX_RSRC_KIND_SMC:
#endif
case ZX_RSRC_KIND_SYSTEM:
result = ResourceDispatcher::CreateRangedRoot(&rsrc, &rights, kind, name);
break;
default:
result = ZX_ERR_WRONG_TYPE;
break;
}
ZX_ASSERT(result == ZX_OK);
return Handle::Make(ktl::move(rsrc), rights);
}