1 // Copyright 2018 The Fuchsia Authors
2 //
3 // Use of this source code is governed by a MIT-style
4 // license that can be found in the LICENSE file or at
5 // https://opensource.org/licenses/MIT
6
7 #include <object/buffer_chain.h>
8
9 // Makes a const void* look like a user_in_ptr<const void>.
10 //
11 // Sometimes we need to copy data from kernel space. KernelPtrAdapter allows us to implement the
12 // copy logic once for both const void* and user_in_ptr<const void>.
13 class KernelPtrAdapter {
14 public:
KernelPtrAdapter(const void * p)15 explicit KernelPtrAdapter(const void* p)
16 : p_(p) {}
copy_array_from_user(void * dst,size_t count) const17 zx_status_t copy_array_from_user(void* dst, size_t count) const {
18 memcpy(dst, p_, count);
19 return ZX_OK;
20 }
byte_offset(size_t offset) const21 KernelPtrAdapter byte_offset(size_t offset) const {
22 return KernelPtrAdapter(reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(p_) + offset));
23 }
24
25 private:
26 const void* p_;
27 };
28
CopyInKernel(const void * src,size_t dst_offset,size_t size)29 zx_status_t BufferChain::CopyInKernel(const void* src, size_t dst_offset, size_t size) {
30 return CopyInCommon(KernelPtrAdapter(src), dst_offset, size);
31 }
32
33 template zx_status_t BufferChain::CopyInCommon(user_in_ptr<const void> src, size_t dst_offset,
34 size_t size);
35