From d936d86332241221151cc765404f1b383ac0fd0e Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Fri, 18 Dec 2020 14:09:14 +0100 Subject: [PATCH] Kernel: Add KBuffer::try_create_with_bytes() Here's another fallible KBuffer construction API that creates a KBuffer and populates it with a range of bytes. --- Kernel/KBuffer.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Kernel/KBuffer.h b/Kernel/KBuffer.h index b57ca20581..ade540b5fd 100644 --- a/Kernel/KBuffer.h +++ b/Kernel/KBuffer.h @@ -56,6 +56,16 @@ public: return adopt(*new KBufferImpl(region.release_nonnull(), size)); } + static RefPtr try_create_with_bytes(ReadonlyBytes bytes, u8 access, const char* name) + { + auto region = MM.allocate_kernel_region(PAGE_ROUND_UP(bytes.size()), name, access, false, false); + if (!region) + return nullptr; + if (!region->commit()) + return nullptr; + return adopt(*new KBufferImpl(region.release_nonnull(), bytes.size())); + } + static NonnullRefPtr create_with_size(size_t size, u8 access, const char* name) { auto impl = try_create_with_size(size, access, name); @@ -106,6 +116,14 @@ public: return adopt_own(*new KBuffer(impl.release_nonnull())); } + static OwnPtr try_create_with_bytes(ReadonlyBytes bytes, u8 access = Region::Access::Read | Region::Access::Write, const char* name = "KBuffer") + { + auto impl = KBufferImpl::try_create_with_bytes(bytes, access, name); + if (!impl) + return nullptr; + return adopt_own(*new KBuffer(impl.release_nonnull())); + } + static KBuffer create_with_size(size_t size, u8 access = Region::Access::Read | Region::Access::Write, const char* name = "KBuffer") { return KBuffer(KBufferImpl::create_with_size(size, access, name));