blob: 44778be264785639c9af5aabe290d815141f5181 [file] [log] [blame]
// Copyright 2020 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 "register-util.h"
#include <errno.h>
#include <fuchsia/hardware/registers/llcpp/fidl.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/async-loop/loop.h>
#include <lib/fdio/directory.h>
#include <lib/fdio/fd.h>
#include <lib/fdio/fdio.h>
#include <lib/fdio/spawn.h>
#include <lib/fidl/llcpp/server.h>
#include <lib/zx/channel.h>
#include <lib/zx/process.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <zircon/process.h>
#include <zircon/processargs.h>
#include <zircon/syscalls.h>
#include <zircon/syscalls/object.h>
#include <zxtest/zxtest.h>
class PhyServer : public llcpp::fuchsia::hardware::registers::Device::Interface {
public:
PhyServer() : loop_(&kAsyncLoopConfigNeverAttachToThread) {
zx::channel channels[2];
zx::channel::create(0, channels, channels + 1);
channel_ = std::move(channels[1]);
fidl::BindServer(loop_.dispatcher(), std::move(channels[0]), this);
loop_.StartThread();
}
void ReadRegister8(uint64_t address, uint8_t mask,
ReadRegister8Completer::Sync& completer) override {
completer.ReplyError(ZX_ERR_NOT_SUPPORTED);
}
void ReadRegister16(uint64_t address, uint16_t mask,
ReadRegister16Completer::Sync& completer) override {
completer.ReplyError(ZX_ERR_NOT_SUPPORTED);
}
void ReadRegister32(uint64_t address, uint32_t mask,
ReadRegister32Completer::Sync& completer) override {
address_ = address;
completer.ReplySuccess(value_);
}
void ReadRegister64(uint64_t address, uint64_t mask,
ReadRegister64Completer::Sync& completer) override {
completer.ReplyError(ZX_ERR_NOT_SUPPORTED);
}
void WriteRegister8(uint64_t address, uint8_t mask, uint8_t value,
WriteRegister8Completer::Sync& completer) override {
completer.ReplyError(ZX_ERR_NOT_SUPPORTED);
}
void WriteRegister16(uint64_t address, uint16_t mask, uint16_t value,
WriteRegister16Completer::Sync& completer) override {
completer.ReplyError(ZX_ERR_NOT_SUPPORTED);
}
void WriteRegister32(uint64_t address, uint32_t mask, uint32_t value,
WriteRegister32Completer::Sync& completer) override {
address_ = address;
value_ = value;
completer.ReplySuccess();
}
void WriteRegister64(uint64_t address, uint64_t mask, uint64_t value,
WriteRegister64Completer::Sync& completer) override {
completer.ReplyError(ZX_ERR_NOT_SUPPORTED);
}
zx::channel TakeChannel() { return std::move(channel_); }
uint64_t address() { return address_; }
uint64_t value() { return value_; }
private:
uint64_t address_ = 0;
uint32_t value_ = 0;
async::Loop loop_;
zx::channel channel_;
};
TEST(RegisterUtil, RegisterReadTest) {
const char* args[] = {"", "/bin/register-util", "50"};
PhyServer server;
ASSERT_EQ(run(3, args, server.TakeChannel()), 0);
ASSERT_EQ(server.address(), 0x50);
}
TEST(RegisterUtil, RegisterWriteTest) {
const char* args[] = {"", "/bin/register-util", "50", "90"};
PhyServer server;
ASSERT_EQ(run(4, args, server.TakeChannel()), 0);
ASSERT_EQ(server.address(), 0x50);
ASSERT_EQ(server.value(), 0x90);
}