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