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 "priv.h"
8 
9 #include <fbl/ref_ptr.h>
10 #include <ktl/move.h>
11 #include <object/pager_dispatcher.h>
12 #include <object/vm_object_dispatcher.h>
13 #include <vm/vm_object_paged.h>
14 
15 // zx_status_t zx_pager_create
sys_pager_create(uint32_t options,user_out_handle * out)16 zx_status_t sys_pager_create(uint32_t options, user_out_handle* out) {
17     if (options) {
18         return ZX_ERR_INVALID_ARGS;
19     }
20 
21     fbl::RefPtr<Dispatcher> dispatcher;
22     zx_rights_t rights;
23     zx_status_t result = PagerDispatcher::Create(&dispatcher, &rights);
24     if (result != ZX_OK) {
25         return result;
26     }
27 
28     return out->make(ktl::move(dispatcher), rights);
29 }
30 
31 // zx_status_t zx_pager_create_vmo
sys_pager_create_vmo(zx_handle_t pager,zx_handle_t port,uint64_t key,uint64_t size,uint32_t options,user_out_handle * out)32 zx_status_t sys_pager_create_vmo(zx_handle_t pager, zx_handle_t port, uint64_t key,
33                                  uint64_t size, uint32_t options, user_out_handle* out) {
34     if (options) {
35         return ZX_ERR_INVALID_ARGS;
36     }
37 
38     auto up = ProcessDispatcher::GetCurrent();
39     fbl::RefPtr<PagerDispatcher> pager_dispatcher;
40     zx_status_t status = up->GetDispatcher(pager, &pager_dispatcher);
41     if (status != ZX_OK) {
42         return status;
43     }
44 
45     fbl::RefPtr<PortDispatcher> port_dispatcher;
46     status = up->GetDispatcherWithRights(port, ZX_RIGHT_WRITE, &port_dispatcher);
47     if (status != ZX_OK) {
48         return status;
49     }
50 
51     fbl::RefPtr<PageSource> src;
52     status = pager_dispatcher->CreateSource(ktl::move(port_dispatcher), key, &src);
53     if (status != ZX_OK) {
54         return status;
55     }
56 
57     fbl::RefPtr<VmObject> vmo;
58     status = VmObjectPaged::CreateExternal(ktl::move(src), size, &vmo);
59     if (status != ZX_OK) {
60         return status;
61     }
62 
63     fbl::RefPtr<Dispatcher> dispatcher;
64     zx_rights_t rights;
65     status = VmObjectDispatcher::Create(vmo, &dispatcher, &rights);
66     if (status != ZX_OK) {
67         return status;
68     }
69 
70     return out->make(ktl::move(dispatcher), rights);
71 }
72