mirror of
https://github.com/RGBCube/serenity
synced 2025-05-26 01:35:08 +00:00
Kernel: Add "video" pledge for accessing framebuffer devices
WindowServer becomes the only user.
This commit is contained in:
parent
bb6b9d9059
commit
017b34e1ad
5 changed files with 28 additions and 23 deletions
|
@ -86,6 +86,7 @@ u32 BXVGADevice::find_framebuffer_address()
|
||||||
|
|
||||||
KResultOr<Region*> BXVGADevice::mmap(Process& process, FileDescription&, VirtualAddress preferred_vaddr, size_t offset, size_t size, int prot)
|
KResultOr<Region*> BXVGADevice::mmap(Process& process, FileDescription&, VirtualAddress preferred_vaddr, size_t offset, size_t size, int prot)
|
||||||
{
|
{
|
||||||
|
REQUIRE_PROMISE(video);
|
||||||
ASSERT(offset == 0);
|
ASSERT(offset == 0);
|
||||||
ASSERT(size == framebuffer_size_in_bytes());
|
ASSERT(size == framebuffer_size_in_bytes());
|
||||||
auto vmobject = AnonymousVMObject::create_for_physical_range(m_framebuffer_address, framebuffer_size_in_bytes());
|
auto vmobject = AnonymousVMObject::create_for_physical_range(m_framebuffer_address, framebuffer_size_in_bytes());
|
||||||
|
@ -105,6 +106,7 @@ KResultOr<Region*> BXVGADevice::mmap(Process& process, FileDescription&, Virtual
|
||||||
|
|
||||||
int BXVGADevice::ioctl(FileDescription&, unsigned request, unsigned arg)
|
int BXVGADevice::ioctl(FileDescription&, unsigned request, unsigned arg)
|
||||||
{
|
{
|
||||||
|
REQUIRE_PROMISE(video);
|
||||||
switch (request) {
|
switch (request) {
|
||||||
case FB_IOCTL_GET_SIZE_IN_BYTES: {
|
case FB_IOCTL_GET_SIZE_IN_BYTES: {
|
||||||
auto* out = (size_t*)arg;
|
auto* out = (size_t*)arg;
|
||||||
|
|
|
@ -25,6 +25,7 @@ MBVGADevice::MBVGADevice(PhysicalAddress addr, int pitch, int width, int height)
|
||||||
|
|
||||||
KResultOr<Region*> MBVGADevice::mmap(Process& process, FileDescription&, VirtualAddress preferred_vaddr, size_t offset, size_t size, int prot)
|
KResultOr<Region*> MBVGADevice::mmap(Process& process, FileDescription&, VirtualAddress preferred_vaddr, size_t offset, size_t size, int prot)
|
||||||
{
|
{
|
||||||
|
REQUIRE_PROMISE(video);
|
||||||
ASSERT(offset == 0);
|
ASSERT(offset == 0);
|
||||||
ASSERT(size == framebuffer_size_in_bytes());
|
ASSERT(size == framebuffer_size_in_bytes());
|
||||||
auto vmobject = AnonymousVMObject::create_for_physical_range(m_framebuffer_address, framebuffer_size_in_bytes());
|
auto vmobject = AnonymousVMObject::create_for_physical_range(m_framebuffer_address, framebuffer_size_in_bytes());
|
||||||
|
@ -44,6 +45,7 @@ KResultOr<Region*> MBVGADevice::mmap(Process& process, FileDescription&, Virtual
|
||||||
|
|
||||||
int MBVGADevice::ioctl(FileDescription&, unsigned request, unsigned arg)
|
int MBVGADevice::ioctl(FileDescription&, unsigned request, unsigned arg)
|
||||||
{
|
{
|
||||||
|
REQUIRE_PROMISE(video);
|
||||||
switch (request) {
|
switch (request) {
|
||||||
case FB_IOCTL_GET_SIZE_IN_BYTES: {
|
case FB_IOCTL_GET_SIZE_IN_BYTES: {
|
||||||
auto* out = (size_t*)arg;
|
auto* out = (size_t*)arg;
|
||||||
|
|
|
@ -53,26 +53,6 @@
|
||||||
//#define SIGNAL_DEBUG
|
//#define SIGNAL_DEBUG
|
||||||
//#define SHARED_BUFFER_DEBUG
|
//#define SHARED_BUFFER_DEBUG
|
||||||
|
|
||||||
#define REQUIRE_NO_PROMISES \
|
|
||||||
do { \
|
|
||||||
if (has_promises()) { \
|
|
||||||
dbg() << *current << " has made a promise"; \
|
|
||||||
cli(); \
|
|
||||||
crash(SIGABRT, 0); \
|
|
||||||
ASSERT_NOT_REACHED(); \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define REQUIRE_PROMISE(promise) \
|
|
||||||
do { \
|
|
||||||
if (has_promises() && !has_promised(Pledge::promise)) { \
|
|
||||||
dbg() << *current << " has not pledged " << #promise; \
|
|
||||||
cli(); \
|
|
||||||
crash(SIGABRT, 0); \
|
|
||||||
ASSERT_NOT_REACHED(); \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
static void create_signal_trampolines();
|
static void create_signal_trampolines();
|
||||||
static void create_kernel_info_page();
|
static void create_kernel_info_page();
|
||||||
|
|
||||||
|
@ -233,7 +213,6 @@ Region* Process::region_containing(const Range& range)
|
||||||
int Process::sys$set_mmap_name(const Syscall::SC_set_mmap_name_params* user_params)
|
int Process::sys$set_mmap_name(const Syscall::SC_set_mmap_name_params* user_params)
|
||||||
{
|
{
|
||||||
REQUIRE_PROMISE(stdio);
|
REQUIRE_PROMISE(stdio);
|
||||||
|
|
||||||
if (!validate_read_typed(user_params))
|
if (!validate_read_typed(user_params))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
|
|
|
@ -46,6 +46,7 @@ extern VirtualAddress g_return_to_ring3_from_signal_trampoline;
|
||||||
__ENUMERATE_PLEDGE_PROMISE(chown) \
|
__ENUMERATE_PLEDGE_PROMISE(chown) \
|
||||||
__ENUMERATE_PLEDGE_PROMISE(chroot) \
|
__ENUMERATE_PLEDGE_PROMISE(chroot) \
|
||||||
__ENUMERATE_PLEDGE_PROMISE(thread) \
|
__ENUMERATE_PLEDGE_PROMISE(thread) \
|
||||||
|
__ENUMERATE_PLEDGE_PROMISE(video) \
|
||||||
__ENUMERATE_PLEDGE_PROMISE(shared_buffer)
|
__ENUMERATE_PLEDGE_PROMISE(shared_buffer)
|
||||||
|
|
||||||
enum class Pledge : u32 {
|
enum class Pledge : u32 {
|
||||||
|
@ -567,3 +568,24 @@ inline u32 Thread::effective_priority() const
|
||||||
{
|
{
|
||||||
return m_priority + m_process.priority_boost() + m_priority_boost + m_extra_priority;
|
return m_priority + m_process.priority_boost() + m_priority_boost + m_extra_priority;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define REQUIRE_NO_PROMISES \
|
||||||
|
do { \
|
||||||
|
if (current->process().has_promises()) { \
|
||||||
|
dbg() << *current << " has made a promise"; \
|
||||||
|
cli(); \
|
||||||
|
current->process().crash(SIGABRT, 0); \
|
||||||
|
ASSERT_NOT_REACHED(); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define REQUIRE_PROMISE(promise) \
|
||||||
|
do { \
|
||||||
|
if (current->process().has_promises() \
|
||||||
|
&& !current->process().has_promised(Pledge::promise)) { \
|
||||||
|
dbg() << *current << " has not pledged " << #promise; \
|
||||||
|
cli(); \
|
||||||
|
current->process().crash(SIGABRT, 0); \
|
||||||
|
ASSERT_NOT_REACHED(); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
|
|
||||||
int main(int, char**)
|
int main(int, char**)
|
||||||
{
|
{
|
||||||
if (pledge("stdio shared_buffer rpath wpath cpath unix proc exec fattr", nullptr) < 0) {
|
if (pledge("stdio video shared_buffer rpath wpath cpath unix proc exec fattr", nullptr) < 0) {
|
||||||
perror("pledge");
|
perror("pledge");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -35,7 +35,7 @@ int main(int, char**)
|
||||||
|
|
||||||
WSEventLoop loop;
|
WSEventLoop loop;
|
||||||
|
|
||||||
if (pledge("stdio shared_buffer rpath wpath cpath unix proc exec", nullptr) < 0) {
|
if (pledge("stdio video shared_buffer rpath wpath cpath unix proc exec", nullptr) < 0) {
|
||||||
perror("pledge");
|
perror("pledge");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue