The Pedigree Project 0.1
DiskPaging.h
1/*
2 * Copyright (c) 2026, Pedigree Developers
3 *
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted.
6 */
7#ifndef PEDIGREE_MACHINE_DISKPAGING_H
8#define PEDIGREE_MACHINE_DISKPAGING_H
9
10#include "pedigree/kernel/compiler.h"
11#include "pedigree/kernel/processor/types.h"
12
13class Disk;
14struct DiskEndpoint;
15
17enum class PagingStatus { Success, Unsupported, Busy, NoMemory, Invalid, IoError, Closed };
18enum class PagingOperation { Read, Write, Flush };
20 PagingOperation operation;
21 uint64_t offset;
22 void* page;
23 PagingStatus result;
24};
25
27class EXPORTED_PUBLIC DiskUse {
28 public:
29 DiskUse();
30 DiskUse(DiskUse&& other) noexcept;
31 ~DiskUse();
32 DiskUse& operator=(DiskUse&& other) noexcept;
33 void reset();
34 Disk* get() const;
35 explicit operator bool() const;
36
37 private:
38 friend class Disk;
39 friend class DiskEndpoints;
40 DiskUse(const DiskUse&) = delete;
41 DiskUse& operator=(const DiskUse&) = delete;
42 DiskEndpoint* m_Endpoint;
43};
44
46class EXPORTED_PUBLIC PagingTransport {
47 public:
48 virtual PagingStatus transfer(PagingOperation operation, uint64_t offset, void* page) = 0;
49 virtual void release() = 0;
50
51 protected:
52 virtual ~PagingTransport() = default;
53};
54
60class EXPORTED_PUBLIC PagingChannel {
61 public:
62 static constexpr size_t PageBytes = 4096;
65 PagingChannel(const PagingChannel&) = delete;
66 PagingChannel& operator=(const PagingChannel&) = delete;
67
68 PagingStatus readPage(uint64_t offset, void* page);
69 PagingStatus writePage(uint64_t offset, const void* page);
70 PagingStatus flush();
71 void reset();
72 uint32_t endpointId() const;
73 uint64_t size() const;
74 explicit operator bool() const;
75
76 private:
77 friend class DiskEndpoints;
78 PagingStatus transfer(PagingOperation operation, uint64_t offset, void* page);
79 DiskEndpoint* m_Endpoint;
80};
81
87class EXPORTED_PUBLIC DiskEndpoints {
88 public:
89 static constexpr size_t Capacity = 64;
90 static bool acquire(uint32_t id, DiskUse& use);
91 static size_t snapshot(uint32_t* ids, size_t capacity);
92 static bool describe(uint32_t id, uint64_t& bytes);
93 static PagingStatus prepare(uint32_t id, PagingChannel& channel);
94
95 private:
96 friend class Disk;
97 static DiskEndpoint* reserve(Disk* disk);
98 static void publish(DiskEndpoint* endpoint);
99 static bool acquire(DiskEndpoint* endpoint, Disk* disk, DiskUse& use);
100 static uint32_t id(DiskEndpoint* endpoint, Disk* disk);
101 static void retire(DiskEndpoint* endpoint, Disk* disk);
102 static bool tryClose(DiskEndpoint* endpoint, Disk* disk);
103 static void reopen(DiskEndpoint* endpoint, Disk* disk);
104};
105
106#endif
Definition Disk.h:35