diff options
author | Andreas Kling <kling@serenityos.org> | 2020-07-15 17:32:46 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-07-15 18:47:45 +0200 |
commit | 2da44dba440da4562eac4fd4b8ab828537f64790 (patch) | |
tree | 982d89fe8052e5c0e4a94ae82b6584ed944850ee /DevTools/UserspaceEmulator/SharedBufferRegion.cpp | |
parent | 0ce4d3e9425f5c6d78dbd3a82a06aa1e2b45377c (diff) | |
download | serenity-2da44dba440da4562eac4fd4b8ab828537f64790.zip |
UserspaceEmulator: Add support for shared buffers (shbuf)
We track these separately from regular mmap() regions, as they have
slightly different behaviors.
Diffstat (limited to 'DevTools/UserspaceEmulator/SharedBufferRegion.cpp')
-rw-r--r-- | DevTools/UserspaceEmulator/SharedBufferRegion.cpp | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/DevTools/UserspaceEmulator/SharedBufferRegion.cpp b/DevTools/UserspaceEmulator/SharedBufferRegion.cpp new file mode 100644 index 0000000000..b21338fbff --- /dev/null +++ b/DevTools/UserspaceEmulator/SharedBufferRegion.cpp @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2020, Andreas Kling <kling@serenityos.org> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "SharedBufferRegion.h" +#include "Emulator.h" +#include <Kernel/API/Syscall.h> +#include <serenity.h> +#include <sys/mman.h> + +namespace UserspaceEmulator { + +NonnullOwnPtr<SharedBufferRegion> SharedBufferRegion::create_with_shbuf_id(u32 base, u32 size, int shbuf_id, u8* host_data) +{ + return adopt_own(*new SharedBufferRegion(base, size, shbuf_id, host_data)); +} + +SharedBufferRegion::SharedBufferRegion(u32 base, u32 size, int shbuf_id, u8* host_data) + : Region(base, size) + , m_data(host_data) + , m_shbuf_id(shbuf_id) +{ +} + +SharedBufferRegion::~SharedBufferRegion() +{ +} + +u8 SharedBufferRegion::read8(FlatPtr offset) +{ + ASSERT(offset < size()); + return *reinterpret_cast<const u8*>(m_data + offset); +} + +u16 SharedBufferRegion::read16(u32 offset) +{ + ASSERT(offset + 1 < size()); + return *reinterpret_cast<const u16*>(m_data + offset); +} + +u32 SharedBufferRegion::read32(u32 offset) +{ + ASSERT(offset + 3 < size()); + return *reinterpret_cast<const u32*>(m_data + offset); +} + +void SharedBufferRegion::write8(u32 offset, u8 value) +{ + ASSERT(offset < size()); + *reinterpret_cast<u8*>(m_data + offset) = value; +} + +void SharedBufferRegion::write16(u32 offset, u16 value) +{ + ASSERT(offset + 1 < size()); + *reinterpret_cast<u16*>(m_data + offset) = value; +} + +void SharedBufferRegion::write32(u32 offset, u32 value) +{ + ASSERT(offset + 3 < size()); + *reinterpret_cast<u32*>(m_data + offset) = value; +} + +int SharedBufferRegion::allow_all() +{ + return syscall(SC_shbuf_allow_all, m_shbuf_id); +} + +int SharedBufferRegion::allow_pid(pid_t pid) +{ + return syscall(SC_shbuf_allow_pid, m_shbuf_id, pid); +} + +int SharedBufferRegion::seal() +{ + return syscall(SC_shbuf_seal, m_shbuf_id); +} + +int SharedBufferRegion::release() +{ + return syscall(SC_shbuf_release, m_shbuf_id); +} + +int SharedBufferRegion::set_volatile(bool is_volatile) +{ + return syscall(SC_shbuf_set_volatile, m_shbuf_id, is_volatile); +} + +} |