Compare commits

..

38 Commits

Author SHA1 Message Date
e5bb07874d
wind: Spawn a new client process after startup
All checks were successful
continuous-integration/drone/pr Build is passing
Also, create the socket after dropping privileges.
2023-08-08 10:45:58 +02:00
cf341dd82f
apps: Add gclient 2023-08-08 10:45:57 +02:00
5ab83343c6
libos: Add os::LocalClient 2023-08-08 10:45:57 +02:00
b097932482
libui: Change 'into' to 'onto' 2023-08-08 10:45:57 +02:00
665d0e2284
libui: Document ui::Font 2023-08-08 10:45:57 +02:00
935e1627af
libui+wind: Move some static variables inside functions 2023-08-08 10:45:57 +02:00
a9af1736b1
wind: Generate random windows on keypresses 2023-08-08 10:45:57 +02:00
f44df78f01
wind: Make sure windows have a minimum size to fit the titlebar 2023-08-08 10:45:57 +02:00
5892ea6d99
libui: Properly cut off the last drawn character if necessary 2023-08-08 10:45:56 +02:00
93f0be760b
libui: Add Rect::contains(Rect) 2023-08-08 10:45:56 +02:00
2419efc513
libui: Render font characters properly with no spacing, matching the width calculations 2023-08-08 10:45:56 +02:00
7ad2428c1b
wind: Render an actual TGA mouse cursor 2023-08-08 10:45:56 +02:00
05ca64e19a
wind: Add a close button to windows using a TGA icon 2023-08-08 10:45:56 +02:00
08ebc4fefe
libui: Add support for TGA image loading 2023-08-08 10:45:56 +02:00
4831870f78
libui: Add an interface to fill a Canvas with an array of pixels 2023-08-08 10:45:55 +02:00
948d2af366
wind: Add window titlebars using ui::Font 2023-08-08 10:45:55 +02:00
c7d5da540d
libui: Add PSF font loading and rendering 2023-08-08 10:45:55 +02:00
4bb1930731
libui: Add Color::GRAY 2023-08-08 10:45:55 +02:00
abaa66232b
libui: Rename Rect::absolute to normalized and add a new absolute function 2023-08-08 10:45:55 +02:00
5e1153d2b8
libluna: Add assignment operators to Buffer 2023-08-08 10:45:55 +02:00
5171e472a0
wind: Reorder drag sequence 2023-08-08 10:45:54 +02:00
449869e81c
libui: Add Rect::relative 2023-08-08 10:45:54 +02:00
d1c41c4fb1
libui: Remove redundant statement 2023-08-08 10:45:54 +02:00
8442fad197
libui: Add getters for separate color values 2023-08-08 10:45:54 +02:00
a195439111
libui: Remove unnecessary stuff 2023-08-08 10:45:54 +02:00
68d503186a
base: Remove startup items not necessary for GUI startup 2023-08-08 10:45:54 +02:00
41b2fd3b3a
libui+wind: (Draggable) windows 2023-08-08 10:45:54 +02:00
e912501c42
wind: Create a local server object 2023-08-08 10:45:53 +02:00
2fe25f160a
libos: Add a new LocalServer class for local domain sockets 2023-08-08 10:45:53 +02:00
adba7d8f7c
kernel: Support listening sockets in poll() 2023-08-08 10:45:53 +02:00
30f86d8070
base: Start wind on startup instead of the shell 2023-08-08 10:45:53 +02:00
66e2db33b6
wind: Add a simple display server skeleton using libui
No client functionality yet, but it's a start.
2023-08-08 10:45:53 +02:00
0da406e97e
libui: Add a GUI and graphics library 2023-08-08 10:45:53 +02:00
9fffc2def5
kernel: Fix negative movement in the PS/2 mouse driver 2023-08-08 10:45:52 +02:00
917203ef11
kernel: Run the init function in a separate block to free everything before kernel_exit is called
All checks were successful
continuous-integration/drone/push Build is passing
2023-08-08 10:44:18 +02:00
826be882a9
kernel: Interrupt syscalls before exiting because of a signal
Closes #40.
2023-08-08 10:41:46 +02:00
198935eb30
libc: Reset the read buffer even when read() returns an error
This fixes the same data being read multiple times if an error was returned
2023-08-08 10:39:15 +02:00
7c254e5e15
kernel: Properly check memory bounds in strdup_from_user()
All checks were successful
continuous-integration/drone/push Build is passing
Missed this one in 097353e779.
2023-08-08 10:27:19 +02:00
9 changed files with 64 additions and 45 deletions

View File

@ -32,6 +32,7 @@ void reap_thread()
}
[[noreturn]] void init()
{
{
kinfoln("Starting Moon %s %s", MOON_VERSION, MOON_RELEASE);
@ -50,8 +51,8 @@ void reap_thread()
auto init =
mark_critical(VFS::resolve_path("/bin/preinit", Credentials {}), "Can't find init in the initial ramfs!");
auto init_thread =
mark_critical(Scheduler::new_userspace_thread(init, "/bin/preinit"), "Failed to create PID 1 process for init");
auto init_thread = mark_critical(Scheduler::new_userspace_thread(init, "/bin/preinit"),
"Failed to create PID 1 process for init");
auto reap = mark_critical(Scheduler::new_kernel_thread(reap_thread, "[reap]"),
"Failed to create the process reaper kernel thread");
@ -65,6 +66,7 @@ void reap_thread()
setup_log(log_debug_enabled(), log_serial_enabled(), false);
init_thread->wake_up();
}
kernel_exit();
}

View File

@ -508,7 +508,7 @@ namespace MemoryManager
{
TRY(result.try_append(*(char*)address));
address++;
if (address % ARCH_PAGE_SIZE)
if ((address % ARCH_PAGE_SIZE) == 0)
{
if (!validate_page_access(address, MMU::User)) return err(EFAULT);
}

View File

@ -143,10 +143,13 @@ Result<void> UnixSocket::connect(Registers* regs, int flags, struct sockaddr* ad
m_blocked_thread = nullptr;
if (current->interrupted)
{
if (current->will_invoke_signal_handler()) return err(EINTR);
if (current->will_ignore_pending_signal())
{
current->process_pending_signals(regs);
continue;
}
return err(EINTR);
}
break;
}
@ -182,10 +185,13 @@ Result<SharedPtr<OpenFileDescription>> UnixSocket::accept(Registers* regs, int f
m_blocked_thread = nullptr;
if (current->interrupted)
{
if (current->will_invoke_signal_handler()) return err(EINTR);
if (current->will_ignore_pending_signal())
{
current->process_pending_signals(regs);
continue;
}
return err(EINTR);
}
}
check(peer);

View File

@ -35,8 +35,12 @@ Result<u64> sys_read(Registers* regs, SyscallArgs args)
if (current->interrupted)
{
kdbgln("signal: read interrupted by signal");
if (current->will_invoke_signal_handler()) return err(EINTR);
if (current->will_ignore_pending_signal())
{
current->process_pending_signals(regs);
continue;
}
return err(EINTR);
}
}

View File

@ -6,7 +6,7 @@
#include "thread/Scheduler.h"
#include <bits/poll.h>
Result<u64> sys_poll(Registers* regs, SyscallArgs args)
Result<u64> sys_poll(Registers*, SyscallArgs args)
{
struct pollfd* fds = (struct pollfd*)args[0];
nfds_t nfds = (nfds_t)args[1];
@ -74,8 +74,6 @@ Result<u64> sys_poll(Registers* regs, SyscallArgs args)
{
guard.deactivate();
free_impl(kfds);
if (current->will_invoke_signal_handler()) return err(EINTR);
current->process_pending_signals(regs);
return err(EINTR);
}
continue;

View File

@ -27,10 +27,13 @@ Result<u64> sys_waitpid(Registers* regs, SyscallArgs args)
if (current->interrupted)
{
kdbgln("signal: waitpid interrupted by signal");
if (current->will_invoke_signal_handler()) return err(EINTR);
if (current->will_ignore_pending_signal())
{
current->process_pending_signals(regs);
goto wait_for_child;
}
return err(EINTR);
}
check(thread->state == ThreadState::Exited);
}
@ -48,10 +51,13 @@ Result<u64> sys_waitpid(Registers* regs, SyscallArgs args)
if (current->interrupted)
{
kdbgln("signal: waitpid interrupted by signal");
if (current->will_invoke_signal_handler()) return err(EINTR);
if (current->will_ignore_pending_signal())
{
current->process_pending_signals(regs);
goto wait_for_any_child;
}
return err(EINTR);
}
check(current->child_being_waited_for.value_or(-1) != -1);

View File

@ -186,18 +186,19 @@ void Thread::process_pending_signals(Registers* current_regs)
}
}
bool Thread::will_invoke_signal_handler()
bool Thread::will_ignore_pending_signal()
{
for (int i = 0; i < NSIG; i++)
{
if (pending_signals & (1 << i))
{
int signo = i + 1;
if (signo != SIGKILL && signo != SIGSTOP && signal_mask & (1 << i)) continue;
auto handler = signal_handlers[i];
if (handler.sa_handler == SIG_IGN || handler.sa_handler == SIG_DFL) return false;
if (signo == SIGKILL || signo == SIGSTOP) return false;
return true;
if (signal_mask & (1 << i)) continue;
auto handler = signal_handlers[i];
if (handler.sa_handler == SIG_IGN) return true;
if (handler.sa_handler == SIG_DFL && default_actions[i] == DefaultSignalAction::Ignore) return true;
return false;
}
}
return false;

View File

@ -159,7 +159,7 @@ struct Thread : public LinkedListNode<Thread>
void process_pending_signals(Registers* current_regs);
bool will_invoke_signal_handler();
bool will_ignore_pending_signal();
bool deliver_signal(int signo, Registers* current_regs);
void sigreturn(Registers* current_regs);

View File

@ -135,6 +135,8 @@ static ssize_t read_data_into_buffer(FILE* stream)
stream->_buf.index = 0;
ssize_t nread = read(stream->_fd, stream->_buf.buffer, stream->_buf.capacity);
if (nread >= 0) stream->_buf.size = nread;
else
stream->_buf.size = 0;
stream->_buf.status |= FileStatusFlags::LastRead;
return nread;
}