1 // Copyright 2016 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 #pragma once
8 
9 #include <object/handle.h>
10 #include <object/vm_object_dispatcher.h>
11 
12 // An RoDso object describes one DSO image built with the rodso.ld layout.
13 class RoDso {
14 public:
vmo()15     const fbl::RefPtr<VmObjectDispatcher>& vmo() const {
16         return vmo_;
17     }
18     HandleOwner vmo_handle() const;
19 
size()20     size_t size() const { return size_; }
21 
valid_code_mapping(uint64_t vmo_offset,size_t size)22     bool valid_code_mapping(uint64_t vmo_offset, size_t size) const {
23         return vmo_offset == code_start_ && size == size_ - code_start_;
24     }
25 
26     zx_status_t Map(fbl::RefPtr<VmAddressRegionDispatcher> vmar,
27                     size_t offset) const;
28 
29 protected:
30 
31     RoDso(const char* name, const void* image, size_t size,
32           uintptr_t code_start);
33 
vmo_rights()34     zx_rights_t vmo_rights() const { return vmo_rights_; }
35 
36 private:
37 
38     zx_status_t MapSegment(fbl::RefPtr<VmAddressRegionDispatcher> vmar,
39                            bool code,
40                            size_t vmar_offset,
41                            size_t start_offset,
42                            size_t end_offset) const;
43 
44     const char* name_;
45     fbl::RefPtr<VmObjectDispatcher> vmo_;
46     zx_rights_t vmo_rights_;
47     uintptr_t code_start_;
48     size_t size_;
49 };
50