1.1 --- a/libexec/include/exec/internal_pager.h Fri Mar 03 18:15:38 2023 +0100
1.2 +++ b/libexec/include/exec/internal_pager.h Fri Mar 03 19:29:33 2023 +0100
1.3 @@ -1,7 +1,7 @@
1.4 /*
1.5 * A system pager implementation residing in the same task as a program.
1.6 *
1.7 - * Copyright (C) 2022 Paul Boddie <paul@boddie.org.uk>
1.8 + * Copyright (C) 2022, 2023 Paul Boddie <paul@boddie.org.uk>
1.9 *
1.10 * This program is free software; you can redistribute it and/or
1.11 * modify it under the terms of the GNU General Public License as
1.12 @@ -22,6 +22,7 @@
1.13 #pragma once
1.14
1.15 #include <exec/pager.h>
1.16 +#include <fsserver/resource.h>
1.17
1.18 #include "pager_object_interface.h"
1.19
1.20 @@ -29,11 +30,18 @@
1.21
1.22 /* A simple system pager also acting as a region mapper. */
1.23
1.24 -class InternalPager : public ExecPager, public PagerObject
1.25 +class InternalPager : public ExecPager, public PagerObject, public Resource
1.26 {
1.27 public:
1.28 explicit InternalPager(address_t start = 0, address_t end = 0);
1.29
1.30 + /* Server details. */
1.31 +
1.32 + virtual ipc_server_default_config_type config();
1.33 +
1.34 + virtual void *interface()
1.35 + { return static_cast<PagerObject *>(this); }
1.36 +
1.37 /* Notification methods, implementing PagerObject. */
1.38
1.39 virtual long exception(l4_exc_regs_t regs,
2.1 --- a/libexec/lib/src/external_pager.cc Fri Mar 03 18:15:38 2023 +0100
2.2 +++ b/libexec/lib/src/external_pager.cc Fri Mar 03 19:29:33 2023 +0100
2.3 @@ -237,6 +237,8 @@
2.4 /* NOTE: Capability indexes to be obtained from the process creation
2.5 activity. */
2.6
2.7 + /* Parent and pager/region mapper. */
2.8 +
2.9 l4_task_unmap(_task, l4_obj_fpage(0x13UL << L4_CAP_SHIFT, 0, L4_CAP_FPAGE_RWSD), L4_FP_ALL_SPACES);
2.10 l4_task_unmap(_task, l4_obj_fpage(0x19UL << L4_CAP_SHIFT, 0, L4_CAP_FPAGE_RWSD), L4_FP_ALL_SPACES);
2.11 }
3.1 --- a/libexec/lib/src/internal_pager.cc Fri Mar 03 18:15:38 2023 +0100
3.2 +++ b/libexec/lib/src/internal_pager.cc Fri Mar 03 19:29:33 2023 +0100
3.3 @@ -30,6 +30,7 @@
3.4
3.5 #include "dataspace_client.h"
3.6 #include "internal_pager.h"
3.7 +#include "pager_object_server.h"
3.8
3.9
3.10
3.11 @@ -44,6 +45,13 @@
3.12 {
3.13 }
3.14
3.15 +ipc_server_default_config_type InternalPager::config()
3.16 +{
3.17 + return config_PagerObject;
3.18 +}
3.19 +
3.20 +
3.21 +
3.22 /* Handle a general exception. */
3.23
3.24 long InternalPager::exception(l4_exc_regs_t regs, l4_snd_fpage_t *region)
4.1 --- a/libexec/rm/region_mapper.cc Fri Mar 03 18:15:38 2023 +0100
4.2 +++ b/libexec/rm/region_mapper.cc Fri Mar 03 19:29:33 2023 +0100
4.3 @@ -20,13 +20,12 @@
4.4 */
4.5
4.6 #include <l4/re/env.h>
4.7 +#include <l4/sys/err.h>
4.8
4.9 #include <exec/common.h>
4.10 #include <exec/internal_pager.h>
4.11 #include <exec/stack.h>
4.12 -#include <ipc/server.h>
4.13 -
4.14 -#include "pager_object_server.h"
4.15 +#include <fsserver/resource_server.h>
4.16
4.17
4.18
4.19 @@ -65,20 +64,23 @@
4.20
4.21 /* Start the pager. */
4.22
4.23 - printf("Starting pager...\n");
4.24 + printf("Initialising pager...\n");
4.25 printf("Pager capability: %lx\n", l4re_env_get_cap("server"));
4.26 printf("Main thread: %lx\n", l4re_env()->main_thread);
4.27
4.28 /* Initialise the server, enabling notifications. */
4.29
4.30 - ipc_server_config_type config;
4.31 - ipc_server_init_for(&config, PagerObject, &exec_pager);
4.32 - config.notifications = 1;
4.33 + ResourceServer server(&exec_pager);
4.34 + long err = server.bind("server");
4.35
4.36 - /* Bind to the named capability and serve until the IPC gate is released. */
4.37 + if (err)
4.38 + {
4.39 + printf("Could not bind server: %s\n", l4sys_errtostr(err));
4.40 + return 1;
4.41 + }
4.42
4.43 - ipc_server_bind("server", (l4_umword_t) &config, &config.server);
4.44 - ipc_server_start_config(&config);
4.45 + printf("Starting pager...\n");
4.46 + server.start(true);
4.47
4.48 printf("Ending pager...\n");
4.49 return 0;
5.1 --- a/libfsserver/include/fsserver/resource_server.h Fri Mar 03 18:15:38 2023 +0100
5.2 +++ b/libfsserver/include/fsserver/resource_server.h Fri Mar 03 19:29:33 2023 +0100
5.3 @@ -1,7 +1,7 @@
5.4 /*
5.5 * Common resource server functions.
5.6 *
5.7 - * Copyright (C) 2018, 2019, 2020, 2021 Paul Boddie <paul@boddie.org.uk>
5.8 + * Copyright (C) 2018, 2019, 2020, 2021, 2023 Paul Boddie <paul@boddie.org.uk>
5.9 *
5.10 * This program is free software; you can redistribute it and/or
5.11 * modify it under the terms of the GNU General Public License as
5.12 @@ -53,7 +53,7 @@
5.13
5.14 /* Server initiation. */
5.15
5.16 - long start();
5.17 + long start(bool finalisation = false);
5.18
5.19 long start_thread();
5.20
5.21 @@ -75,6 +75,8 @@
5.22
5.23 /* Server finalisation. */
5.24
5.25 +void resource_same_thread_finaliser(ipc_server_config_type *config);
5.26 +
5.27 void resource_thread_finaliser(ipc_server_config_type *config);
5.28
5.29 // vim: tabstop=2 expandtab shiftwidth=2
6.1 --- a/libfsserver/lib/generic/resource_server.cc Fri Mar 03 18:15:38 2023 +0100
6.2 +++ b/libfsserver/lib/generic/resource_server.cc Fri Mar 03 19:29:33 2023 +0100
6.3 @@ -37,12 +37,20 @@
6.4 return ipc_server_bind(name, (l4_umword_t) _config, &_config->server);
6.5 }
6.6
6.7 -/* Start in the same thread with no deletion notifications or finalisation. */
6.8 +/* Start in the same thread indicating whether deletion notifications and
6.9 + finalisation are to be used. */
6.10
6.11 -long ResourceServer::start()
6.12 +long ResourceServer::start(bool finalisation)
6.13 {
6.14 resource_init_config(_config, _resource);
6.15 _config->thread = pthread_l4_cap(pthread_self());
6.16 +
6.17 + if (finalisation)
6.18 + {
6.19 + _config->finaliser = resource_same_thread_finaliser;
6.20 + _config->notifications = 1;
6.21 + }
6.22 +
6.23 return resource_start_config(_config, _resource);
6.24 }
6.25
6.26 @@ -126,7 +134,24 @@
6.27
6.28
6.29
6.30 -/* A finaliser for exposed resources. */
6.31 +/* A finaliser for exposed resources in the same thread. */
6.32 +
6.33 +void resource_same_thread_finaliser(ipc_server_config_type *config)
6.34 +{
6.35 + Resource *resource = reinterpret_cast<Resource *>(config->finaliser_obj);
6.36 +
6.37 + /* Close but do not delete the resource since it is assumed that it is being
6.38 + managed by the thread. */
6.39 +
6.40 + resource->close();
6.41 +
6.42 + /* Release the capabilities. */
6.43 +
6.44 + ipc_server_finalise_config(config);
6.45 + delete config;
6.46 +}
6.47 +
6.48 +/* A finaliser for exposed resources in a different thread. */
6.49
6.50 void resource_thread_finaliser(ipc_server_config_type *config)
6.51 {