blob: b7d7419b454a7317e57b0550ca0a9143b9b65b91 [file] [log] [blame]
// 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 "tools/kazoo/outputs.h"
#include "tools/kazoo/syscall_library.h"
#include "tools/kazoo/test.h"
#include "tools/kazoo/test_ir_test_kernelwrappers.test.h"
namespace {
TEST(KernelWrappersOutput, Various) {
SyscallLibrary library;
ASSERT_TRUE(SyscallLibraryLoader::FromJson(k_test_kernelwrappers, &library));
Writer writer;
ASSERT_TRUE(KernelWrappersOutput(library, &writer));
EXPECT_EQ(writer.Out(),
R"(// 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.
// WARNING: THIS FILE IS MACHINE GENERATED BY //tools/kazoo. DO NOT EDIT.
extern "C" {
syscall_result wrapper_kwrap_simple_case(uint64_t pc);
syscall_result wrapper_kwrap_simple_case(uint64_t pc) {
return do_syscall(ZX_SYS_kwrap_simple_case, pc, &VDso::ValidSyscallPC::kwrap_simple_case, [&](ProcessDispatcher* current_process) -> uint64_t {
auto result = sys_kwrap_simple_case();
return result;
});
}
syscall_result wrapper_kwrap_multiple_in_handles(SafeSyscallArgument<const zx_handle_t*>::RawType handles, SafeSyscallArgument<size_t>::RawType num_handles, uint64_t pc);
syscall_result wrapper_kwrap_multiple_in_handles(SafeSyscallArgument<const zx_handle_t*>::RawType handles, SafeSyscallArgument<size_t>::RawType num_handles, uint64_t pc) {
return do_syscall(ZX_SYS_kwrap_multiple_in_handles, pc, &VDso::ValidSyscallPC::kwrap_multiple_in_handles, [&](ProcessDispatcher* current_process) -> uint64_t {
auto result = sys_kwrap_multiple_in_handles(make_user_in_ptr(SafeSyscallArgument<const zx_handle_t*>::Sanitize(handles)), SafeSyscallArgument<size_t>::Sanitize(num_handles));
return result;
});
}
syscall_result wrapper_kwrap_ano_ret_func(uint64_t pc);
syscall_result wrapper_kwrap_ano_ret_func(uint64_t pc) {
return do_syscall(ZX_SYS_kwrap_ano_ret_func, pc, &VDso::ValidSyscallPC::kwrap_ano_ret_func, [&](ProcessDispatcher* current_process) -> uint64_t {
/*noreturn*/ sys_kwrap_ano_ret_func();
/* NOTREACHED */
return ZX_ERR_BAD_STATE;
});
}
syscall_result wrapper_kwrap_inout_args(SafeSyscallArgument<zx_handle_t>::RawType handle, SafeSyscallArgument<uint32_t>::RawType op, SafeSyscallArgument<uint64_t>::RawType offset, SafeSyscallArgument<uint64_t>::RawType size, SafeSyscallArgument<void*>::RawType buffer, SafeSyscallArgument<size_t>::RawType buffer_size, uint64_t pc);
syscall_result wrapper_kwrap_inout_args(SafeSyscallArgument<zx_handle_t>::RawType handle, SafeSyscallArgument<uint32_t>::RawType op, SafeSyscallArgument<uint64_t>::RawType offset, SafeSyscallArgument<uint64_t>::RawType size, SafeSyscallArgument<void*>::RawType buffer, SafeSyscallArgument<size_t>::RawType buffer_size, uint64_t pc) {
return do_syscall(ZX_SYS_kwrap_inout_args, pc, &VDso::ValidSyscallPC::kwrap_inout_args, [&](ProcessDispatcher* current_process) -> uint64_t {
auto result = sys_kwrap_inout_args(SafeSyscallArgument<zx_handle_t>::Sanitize(handle), SafeSyscallArgument<uint32_t>::Sanitize(op), SafeSyscallArgument<uint64_t>::Sanitize(offset), SafeSyscallArgument<uint64_t>::Sanitize(size), make_user_inout_ptr(SafeSyscallArgument<void*>::Sanitize(buffer)), SafeSyscallArgument<size_t>::Sanitize(buffer_size));
return result;
});
}
syscall_result wrapper_kwrap_output_handle(SafeSyscallArgument<zx_handle_t*>::RawType event, uint64_t pc);
syscall_result wrapper_kwrap_output_handle(SafeSyscallArgument<zx_handle_t*>::RawType event, uint64_t pc) {
return do_syscall(ZX_SYS_kwrap_output_handle, pc, &VDso::ValidSyscallPC::kwrap_output_handle, [&](ProcessDispatcher* current_process) -> uint64_t {
user_out_handle out_handle_event;
auto result = sys_kwrap_output_handle(&out_handle_event);
if (result != ZX_OK)
return result;
result = out_handle_event.begin_copyout(current_process, make_user_out_ptr(SafeSyscallArgument<zx_handle_t*>::Sanitize(event)));
if (result != ZX_OK)
return result;
out_handle_event.finish_copyout(current_process);
return result;
});
}
syscall_result wrapper_kwrap_two_output_handle(SafeSyscallArgument<zx_handle_t*>::RawType out0, SafeSyscallArgument<zx_handle_t*>::RawType out1, uint64_t pc);
syscall_result wrapper_kwrap_two_output_handle(SafeSyscallArgument<zx_handle_t*>::RawType out0, SafeSyscallArgument<zx_handle_t*>::RawType out1, uint64_t pc) {
return do_syscall(ZX_SYS_kwrap_two_output_handle, pc, &VDso::ValidSyscallPC::kwrap_two_output_handle, [&](ProcessDispatcher* current_process) -> uint64_t {
user_out_handle out_handle_out0;
user_out_handle out_handle_out1;
auto result = sys_kwrap_two_output_handle(&out_handle_out0, &out_handle_out1);
if (result != ZX_OK)
return result;
result = out_handle_out0.begin_copyout(current_process, make_user_out_ptr(SafeSyscallArgument<zx_handle_t*>::Sanitize(out0)));
if (result != ZX_OK)
return result;
result = out_handle_out1.begin_copyout(current_process, make_user_out_ptr(SafeSyscallArgument<zx_handle_t*>::Sanitize(out1)));
if (result != ZX_OK)
return result;
out_handle_out0.finish_copyout(current_process);
out_handle_out1.finish_copyout(current_process);
return result;
});
}
syscall_result wrapper_kwrap_compiled_out(uint64_t pc);
syscall_result wrapper_kwrap_compiled_out(uint64_t pc) {
return do_syscall(ZX_SYS_kwrap_compiled_out, pc, &VDso::ValidSyscallPC::kwrap_compiled_out, [&](ProcessDispatcher* current_process) -> uint64_t {
auto result = sys_kwrap_compiled_out();
return result;
});
}
}
)");
}
TEST(KernelWrappersOutput, DebugExcludedInRelease) {
SyscallLibrary library;
ASSERT_TRUE(SyscallLibraryLoader::FromJson(k_test_kernelwrappers, &library));
std::set<std::string> exclude{"testonly"};
library.FilterSyscalls(exclude);
Writer writer;
ASSERT_TRUE(KernelWrappersOutput(library, &writer));
// kwrap_compiled_out does not appear in this output vs. above due to
// BuildType::kRelease.
EXPECT_EQ(writer.Out(),
R"(// 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.
// WARNING: THIS FILE IS MACHINE GENERATED BY //tools/kazoo. DO NOT EDIT.
extern "C" {
syscall_result wrapper_kwrap_simple_case(uint64_t pc);
syscall_result wrapper_kwrap_simple_case(uint64_t pc) {
return do_syscall(ZX_SYS_kwrap_simple_case, pc, &VDso::ValidSyscallPC::kwrap_simple_case, [&](ProcessDispatcher* current_process) -> uint64_t {
auto result = sys_kwrap_simple_case();
return result;
});
}
syscall_result wrapper_kwrap_multiple_in_handles(SafeSyscallArgument<const zx_handle_t*>::RawType handles, SafeSyscallArgument<size_t>::RawType num_handles, uint64_t pc);
syscall_result wrapper_kwrap_multiple_in_handles(SafeSyscallArgument<const zx_handle_t*>::RawType handles, SafeSyscallArgument<size_t>::RawType num_handles, uint64_t pc) {
return do_syscall(ZX_SYS_kwrap_multiple_in_handles, pc, &VDso::ValidSyscallPC::kwrap_multiple_in_handles, [&](ProcessDispatcher* current_process) -> uint64_t {
auto result = sys_kwrap_multiple_in_handles(make_user_in_ptr(SafeSyscallArgument<const zx_handle_t*>::Sanitize(handles)), SafeSyscallArgument<size_t>::Sanitize(num_handles));
return result;
});
}
syscall_result wrapper_kwrap_ano_ret_func(uint64_t pc);
syscall_result wrapper_kwrap_ano_ret_func(uint64_t pc) {
return do_syscall(ZX_SYS_kwrap_ano_ret_func, pc, &VDso::ValidSyscallPC::kwrap_ano_ret_func, [&](ProcessDispatcher* current_process) -> uint64_t {
/*noreturn*/ sys_kwrap_ano_ret_func();
/* NOTREACHED */
return ZX_ERR_BAD_STATE;
});
}
syscall_result wrapper_kwrap_inout_args(SafeSyscallArgument<zx_handle_t>::RawType handle, SafeSyscallArgument<uint32_t>::RawType op, SafeSyscallArgument<uint64_t>::RawType offset, SafeSyscallArgument<uint64_t>::RawType size, SafeSyscallArgument<void*>::RawType buffer, SafeSyscallArgument<size_t>::RawType buffer_size, uint64_t pc);
syscall_result wrapper_kwrap_inout_args(SafeSyscallArgument<zx_handle_t>::RawType handle, SafeSyscallArgument<uint32_t>::RawType op, SafeSyscallArgument<uint64_t>::RawType offset, SafeSyscallArgument<uint64_t>::RawType size, SafeSyscallArgument<void*>::RawType buffer, SafeSyscallArgument<size_t>::RawType buffer_size, uint64_t pc) {
return do_syscall(ZX_SYS_kwrap_inout_args, pc, &VDso::ValidSyscallPC::kwrap_inout_args, [&](ProcessDispatcher* current_process) -> uint64_t {
auto result = sys_kwrap_inout_args(SafeSyscallArgument<zx_handle_t>::Sanitize(handle), SafeSyscallArgument<uint32_t>::Sanitize(op), SafeSyscallArgument<uint64_t>::Sanitize(offset), SafeSyscallArgument<uint64_t>::Sanitize(size), make_user_inout_ptr(SafeSyscallArgument<void*>::Sanitize(buffer)), SafeSyscallArgument<size_t>::Sanitize(buffer_size));
return result;
});
}
syscall_result wrapper_kwrap_output_handle(SafeSyscallArgument<zx_handle_t*>::RawType event, uint64_t pc);
syscall_result wrapper_kwrap_output_handle(SafeSyscallArgument<zx_handle_t*>::RawType event, uint64_t pc) {
return do_syscall(ZX_SYS_kwrap_output_handle, pc, &VDso::ValidSyscallPC::kwrap_output_handle, [&](ProcessDispatcher* current_process) -> uint64_t {
user_out_handle out_handle_event;
auto result = sys_kwrap_output_handle(&out_handle_event);
if (result != ZX_OK)
return result;
result = out_handle_event.begin_copyout(current_process, make_user_out_ptr(SafeSyscallArgument<zx_handle_t*>::Sanitize(event)));
if (result != ZX_OK)
return result;
out_handle_event.finish_copyout(current_process);
return result;
});
}
syscall_result wrapper_kwrap_two_output_handle(SafeSyscallArgument<zx_handle_t*>::RawType out0, SafeSyscallArgument<zx_handle_t*>::RawType out1, uint64_t pc);
syscall_result wrapper_kwrap_two_output_handle(SafeSyscallArgument<zx_handle_t*>::RawType out0, SafeSyscallArgument<zx_handle_t*>::RawType out1, uint64_t pc) {
return do_syscall(ZX_SYS_kwrap_two_output_handle, pc, &VDso::ValidSyscallPC::kwrap_two_output_handle, [&](ProcessDispatcher* current_process) -> uint64_t {
user_out_handle out_handle_out0;
user_out_handle out_handle_out1;
auto result = sys_kwrap_two_output_handle(&out_handle_out0, &out_handle_out1);
if (result != ZX_OK)
return result;
result = out_handle_out0.begin_copyout(current_process, make_user_out_ptr(SafeSyscallArgument<zx_handle_t*>::Sanitize(out0)));
if (result != ZX_OK)
return result;
result = out_handle_out1.begin_copyout(current_process, make_user_out_ptr(SafeSyscallArgument<zx_handle_t*>::Sanitize(out1)));
if (result != ZX_OK)
return result;
out_handle_out0.finish_copyout(current_process);
out_handle_out1.finish_copyout(current_process);
return result;
});
}
}
)");
}
} // namespace