35 pr_warn(
"failed to read elf header");
46 while (argv && argv[
argc])
52 if (argv_copy.
empty())
56 while (envp && envp[envc])
64 proc->name =
f->dentry->name;
65 thread->name =
f->dentry->name;
69 for (
const auto &t : proc->thread_list)
81 proc->main_thread = thread;
99 if (stack_vmap.isErr())
101 pr_emerg(
"failed to allocate stack for new process");
106 stack_init(&thread->u_stack, (
void *) stack_vmap->vaddr, ustack_size);
111 .invocation = path_copy,
122 pr_emerg(
"failed to fill process, execve failed");
127 memzero(proc->signal_info.handlers,
sizeof(proc->signal_info.handlers));
132 const auto &fd = proc->files[i];
#define MOS_UNREACHABLE()
#define MOS_STACK_PAGES_USER
#define MOS_PROCESS_MAX_OPEN_FILES
#define MOS_ADDR_USER_STACK
auto push_back(const TItem &value) noexcept
auto empty() const noexcept
PtrResult< vmap_t > cow_allocate_zeroed_pages(MMContext *handle, size_t npages, ptr_t vaddr, VMFlags flags, bool exact=false)
Allocate zero-on-demand pages at a specific address.
bool elf_do_fill_process(Process *proc, FsBaseFile *file, elf_header_t elf, elf_startup_info_t *info)
bool elf_read_and_verify_executable(FsBaseFile *file, elf_header_t *header)
long process_do_execveat(fd_t dirfd, const char *path, const char *const argv[], const char *const envp[], int flags)
MOSAPI void stack_init(downwards_stack_t *stack, void *mem_region_bottom, size_t size)
long signal_send_to_thread(Thread *target, signal_t signal)
Send a signal to a thread.
#define list_foreach(t, v, h)
Iterate over a list.
void vmap_finalise_init(vmap_t *vmap, vmap_content_t content, vmap_type_t type)
Finalize the initialization of a vmap object.
void vmap_destroy(vmap_t *vmap)
Destroy a vmap object, and unmmap the region.
PtrResult< FsBaseFile > vfs_openat(int fd, mos::string_view path, OpenFlags flags)
Open a file at a given path.
mos::basic_string< char > string
#define pr_emerg(fmt,...)
void process_exit(Process *&&proc, u8 exit_code, signal_t signal)
bool process_detach_fd(Process *process, fd_t fd)
#define memzero(ptr, size)
#define spinlock_acquire(lock)
#define spinlock_release(lock)
static bool IsValid(const IO *io)
void thread_destroy(Thread *thread)
bool thread_wait_for_tid(tid_t tid)