First round of big changes: the term team has replaced proc all over the kernel, the few kern_* syscalls have been renamed to sys_* for consistency, and other small changes. The ps app is temporarily disabled until get_next_team_info is implemented.
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@557 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
+19
-10
@@ -97,16 +97,11 @@ extern "C" {
|
|||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
|
||||||
* @typedef team_id
|
|
||||||
* id of an team (process)
|
|
||||||
*/
|
|
||||||
/**
|
/**
|
||||||
* @typedef area_id
|
* @typedef area_id
|
||||||
* id of an area
|
* id of an area
|
||||||
*/
|
*/
|
||||||
|
|
||||||
typedef int32 team_id;
|
|
||||||
typedef int32 area_id;
|
typedef int32 area_id;
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
@@ -205,13 +200,13 @@ int _get_next_port_info(team_id, int32 *, port_info *, size_t);
|
|||||||
*/
|
*/
|
||||||
typedef struct sem_info {
|
typedef struct sem_info {
|
||||||
sem_id sem;
|
sem_id sem;
|
||||||
proc_id proc;
|
team_id team;
|
||||||
char name[B_OS_NAME_LENGTH];
|
char name[B_OS_NAME_LENGTH];
|
||||||
int32 count;
|
int32 count;
|
||||||
thread_id latest_holder;
|
thread_id latest_holder;
|
||||||
} sem_info;
|
} sem_info;
|
||||||
|
|
||||||
sem_id create_sem_etc(int count, const char *name, proc_id owner);
|
sem_id create_sem_etc(int count, const char *name, team_id owner);
|
||||||
sem_id create_sem(int count, const char *name);
|
sem_id create_sem(int count, const char *name);
|
||||||
int delete_sem(sem_id id);
|
int delete_sem(sem_id id);
|
||||||
int delete_sem_etc(sem_id id, int return_code);
|
int delete_sem_etc(sem_id id, int return_code);
|
||||||
@@ -221,8 +216,8 @@ int release_sem(sem_id id);
|
|||||||
int release_sem_etc(sem_id id, int count, int flags);
|
int release_sem_etc(sem_id id, int count, int flags);
|
||||||
int get_sem_count(sem_id id, int32* thread_count);
|
int get_sem_count(sem_id id, int32* thread_count);
|
||||||
int _get_sem_info(sem_id id, struct sem_info *info, size_t);
|
int _get_sem_info(sem_id id, struct sem_info *info, size_t);
|
||||||
int _get_next_sem_info(proc_id proc, uint32 *cookie, struct sem_info *info, size_t);
|
int _get_next_sem_info(team_id team, uint32 *cookie, struct sem_info *info, size_t);
|
||||||
int set_sem_owner(sem_id id, proc_id proc);
|
int set_sem_owner(sem_id id, team_id team);
|
||||||
|
|
||||||
#define get_sem_info(sem, info) \
|
#define get_sem_info(sem, info) \
|
||||||
_get_sem_info((sem), (info), sizeof(*(info)))
|
_get_sem_info((sem), (info), sizeof(*(info)))
|
||||||
@@ -289,7 +284,7 @@ typedef enum {
|
|||||||
/** information on a thread
|
/** information on a thread
|
||||||
* @note the thread can be in any state
|
* @note the thread can be in any state
|
||||||
*/
|
*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
thread_id thread;
|
thread_id thread;
|
||||||
team_id team;
|
team_id team;
|
||||||
char name[B_OS_NAME_LENGTH];
|
char name[B_OS_NAME_LENGTH];
|
||||||
@@ -302,6 +297,20 @@ typedef struct {
|
|||||||
void *stack_end;
|
void *stack_end;
|
||||||
} thread_info;
|
} thread_info;
|
||||||
|
|
||||||
|
/** information on a team */
|
||||||
|
typedef struct {
|
||||||
|
team_id team;
|
||||||
|
int32 thread_count;
|
||||||
|
int32 image_count;
|
||||||
|
int32 area_count;
|
||||||
|
thread_id debugger_nub_thread;
|
||||||
|
port_id debugger_nub_port;
|
||||||
|
int32 argc;
|
||||||
|
char args[64];
|
||||||
|
uid_t uid;
|
||||||
|
gid_t gid;
|
||||||
|
} team_info;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gives information on user and kernel time for a thread
|
* gives information on user and kernel time for a thread
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -51,33 +51,33 @@ bigtime_t sys_system_time();
|
|||||||
int sys_snooze(bigtime_t time);
|
int sys_snooze(bigtime_t time);
|
||||||
|
|
||||||
/* sem functions */
|
/* sem functions */
|
||||||
sem_id kern_create_sem(int count, const char *name);
|
sem_id sys_create_sem(int count, const char *name);
|
||||||
int kern_delete_sem(sem_id id);
|
int sys_delete_sem(sem_id id);
|
||||||
int kern_acquire_sem(sem_id id);
|
int sys_acquire_sem(sem_id id);
|
||||||
int kern_acquire_sem_etc(sem_id id, int count, int flags, bigtime_t timeout);
|
int sys_acquire_sem_etc(sem_id id, int count, int flags, bigtime_t timeout);
|
||||||
int kern_release_sem(sem_id id);
|
int sys_release_sem(sem_id id);
|
||||||
int kern_release_sem_etc(sem_id id, int count, int flags);
|
int sys_release_sem_etc(sem_id id, int count, int flags);
|
||||||
int sys_sem_get_count(sem_id id, int32* thread_count);
|
int sys_sem_get_count(sem_id id, int32* thread_count);
|
||||||
int kern_get_sem_info(sem_id, struct sem_info *, size_t);
|
int sys_get_sem_info(sem_id, struct sem_info *, size_t);
|
||||||
int kern_get_next_sem_info(proc_id, uint32 *, struct sem_info *, size_t);
|
int sys_get_next_sem_info(team_id, uint32 *, struct sem_info *, size_t);
|
||||||
int sys_set_sem_owner(sem_id id, proc_id proc);
|
int sys_set_sem_owner(sem_id id, team_id proc);
|
||||||
|
|
||||||
|
|
||||||
int sys_proc_get_table(struct proc_info *pi, size_t len);
|
//int sys_team_get_table(struct proc_info *pi, size_t len);
|
||||||
void sys_exit(int retcode);
|
void sys_exit(int retcode);
|
||||||
proc_id sys_proc_create_proc(const char *path, const char *name, char **args, int argc, char **envp, int envc, int priority);
|
team_id sys_create_team(const char *path, const char *name, char **args, int argc, char **envp, int envc, int priority);
|
||||||
|
|
||||||
thread_id kern_spawn_thread(int (*func)(void*), const char *, int, void *);
|
thread_id sys_spawn_thread(int (*func)(void*), const char *, int, void *);
|
||||||
thread_id kern_get_current_thread_id(void);
|
thread_id sys_get_current_thread_id(void);
|
||||||
int kern_suspend_thread(thread_id tid);
|
int sys_suspend_thread(thread_id tid);
|
||||||
int kern_resume_thread(thread_id tid);
|
int sys_resume_thread(thread_id tid);
|
||||||
int kern_kill_thread(thread_id tid);
|
int sys_kill_thread(thread_id tid);
|
||||||
|
|
||||||
int sys_thread_wait_on_thread(thread_id tid, int *retcode);
|
int sys_wait_on_thread(thread_id tid, int *retcode);
|
||||||
int sys_proc_kill_proc(proc_id pid);
|
int sys_kill_team(team_id tid);
|
||||||
|
|
||||||
proc_id sys_get_current_proc_id();
|
team_id sys_get_current_team_id();
|
||||||
int sys_proc_wait_on_proc(proc_id pid, int *retcode);
|
int sys_wait_on_team(team_id tid, int *retcode);
|
||||||
|
|
||||||
region_id sys_vm_create_anonymous_region(const char *name, void **address, int addr_type,
|
region_id sys_vm_create_anonymous_region(const char *name, void **address, int addr_type,
|
||||||
addr size, int wiring, int lock);
|
addr size, int wiring, int lock);
|
||||||
@@ -94,13 +94,13 @@ int sys_port_close(port_id id);
|
|||||||
int sys_port_delete(port_id id);
|
int sys_port_delete(port_id id);
|
||||||
port_id sys_port_find(const char *port_name);
|
port_id sys_port_find(const char *port_name);
|
||||||
int sys_port_get_info(port_id id, struct port_info *info);
|
int sys_port_get_info(port_id id, struct port_info *info);
|
||||||
int sys_port_get_next_port_info(proc_id proc, uint32 *cookie, struct port_info *info);
|
int sys_port_get_next_port_info(team_id team, uint32 *cookie, struct port_info *info);
|
||||||
ssize_t sys_port_buffer_size(port_id port);
|
ssize_t sys_port_buffer_size(port_id port);
|
||||||
ssize_t sys_port_buffer_size_etc(port_id port, uint32 flags, bigtime_t timeout);
|
ssize_t sys_port_buffer_size_etc(port_id port, uint32 flags, bigtime_t timeout);
|
||||||
int32 sys_port_count(port_id port);
|
int32 sys_port_count(port_id port);
|
||||||
ssize_t sys_port_read(port_id port, int32 *msg_code, void *msg_buffer, size_t buffer_size);
|
ssize_t sys_port_read(port_id port, int32 *msg_code, void *msg_buffer, size_t buffer_size);
|
||||||
ssize_t sys_port_read_etc(port_id port, int32 *msg_code, void *msg_buffer, size_t buffer_size, uint32 flags, bigtime_t timeout);
|
ssize_t sys_port_read_etc(port_id port, int32 *msg_code, void *msg_buffer, size_t buffer_size, uint32 flags, bigtime_t timeout);
|
||||||
int sys_port_set_owner(port_id port, team_id proc);
|
int sys_port_set_owner(port_id port, team_id team);
|
||||||
int sys_port_write(port_id port, int32 msg_code, const void *msg_buffer, size_t buffer_size);
|
int sys_port_write(port_id port, int32 msg_code, const void *msg_buffer, size_t buffer_size);
|
||||||
int sys_port_write_etc(port_id port, int32 msg_code, const void *msg_buffer, size_t buffer_size, uint32 flags, bigtime_t timeout);
|
int sys_port_write_etc(port_id port, int32 msg_code, const void *msg_buffer, size_t buffer_size, uint32 flags, bigtime_t timeout);
|
||||||
|
|
||||||
@@ -123,7 +123,7 @@ area_id sys_find_region_by_name(const char *);
|
|||||||
/* This is a real BSD'ism :) Basically it returns the size of the
|
/* This is a real BSD'ism :) Basically it returns the size of the
|
||||||
* descriptor table for the current process as an integer.
|
* descriptor table for the current process as an integer.
|
||||||
*/
|
*/
|
||||||
int kern_getdtablesize(void);
|
int sys_getdtablesize(void);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,9 +56,9 @@ enum {
|
|||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
PROC_STATE_NORMAL, // normal state
|
TEAM_STATE_NORMAL, // normal state
|
||||||
PROC_STATE_BIRTH, // being contructed
|
TEAM_STATE_BIRTH, // being contructed
|
||||||
PROC_STATE_DEATH // being killed
|
TEAM_STATE_DEATH // being killed
|
||||||
};
|
};
|
||||||
|
|
||||||
#define SIG_NONE 0
|
#define SIG_NONE 0
|
||||||
@@ -66,16 +66,14 @@ enum {
|
|||||||
#define SIG_KILL 2
|
#define SIG_KILL 2
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The proc structure.
|
* The team structure; equivalent to a common process.
|
||||||
* @note This is available only within the kernel.
|
* @note This is available only within the kernel.
|
||||||
*/
|
*/
|
||||||
struct proc {
|
struct team {
|
||||||
/** Pointer to next proc structure */
|
/** Pointer to next team structure */
|
||||||
struct proc *next;
|
struct team *next;
|
||||||
/** The proc_id for this process.
|
/** The team_id for this process. */
|
||||||
* @note This is equivalent to a team_id (???)
|
team_id id;
|
||||||
*/
|
|
||||||
proc_id id;
|
|
||||||
/** name of the process
|
/** name of the process
|
||||||
* @note The maximum length is current SYS_MAX_OS_NAME_LEN chars.
|
* @note The maximum length is current SYS_MAX_OS_NAME_LEN chars.
|
||||||
*/
|
*/
|
||||||
@@ -101,12 +99,12 @@ struct proc {
|
|||||||
addr user_env_base;
|
addr user_env_base;
|
||||||
struct thread *main_thread;
|
struct thread *main_thread;
|
||||||
struct thread *thread_list;
|
struct thread *thread_list;
|
||||||
struct arch_proc arch_info;
|
struct arch_team arch_info;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct thread {
|
struct thread {
|
||||||
struct thread *all_next;
|
struct thread *all_next;
|
||||||
struct thread *proc_next;
|
struct thread *team_next;
|
||||||
struct thread *q_next;
|
struct thread *q_next;
|
||||||
thread_id id;
|
thread_id id;
|
||||||
char name[SYS_MAX_OS_NAME_LEN];
|
char name[SYS_MAX_OS_NAME_LEN];
|
||||||
@@ -125,7 +123,7 @@ struct thread {
|
|||||||
addr fault_handler;
|
addr fault_handler;
|
||||||
addr entry;
|
addr entry;
|
||||||
void *args;
|
void *args;
|
||||||
struct proc *proc;
|
struct team *team;
|
||||||
sem_id return_code_sem;
|
sem_id return_code_sem;
|
||||||
region_id kernel_stack_region_id;
|
region_id kernel_stack_region_id;
|
||||||
addr kernel_stack_base;
|
addr kernel_stack_base;
|
||||||
@@ -145,18 +143,6 @@ struct thread_queue {
|
|||||||
struct thread *tail;
|
struct thread *tail;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* Process information structure
|
|
||||||
* @note Seem to be a lot of duplicated fields with main
|
|
||||||
* proc structure???
|
|
||||||
*/
|
|
||||||
struct proc_info {
|
|
||||||
proc_id id;
|
|
||||||
char name[SYS_MAX_OS_NAME_LEN];
|
|
||||||
int state;
|
|
||||||
int num_threads;
|
|
||||||
};
|
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
/**
|
/**
|
||||||
* Test routine for threads.
|
* Test routine for threads.
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
#include <thread.h>
|
#include <thread.h>
|
||||||
|
|
||||||
int arch_proc_init_proc_struct(struct proc *p, bool kernel);
|
int arch_team_init_team_struct(struct team *t, bool kernel);
|
||||||
int arch_thread_init_thread_struct(struct thread *t);
|
int arch_thread_init_thread_struct(struct thread *t);
|
||||||
void arch_thread_context_switch(struct thread *t_from, struct thread *t_to);
|
void arch_thread_context_switch(struct thread *t_from, struct thread *t_to);
|
||||||
int arch_thread_initialize_kthread_stack(struct thread *t, int (*start_func)(void), void (*entry_func)(void), void (*exit_func)(void));
|
int arch_thread_initialize_kthread_stack(struct thread *t, int (*start_func)(void), void (*entry_func)(void), void (*exit_func)(void));
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ struct arch_thread {
|
|||||||
uint8 fpu_state[512];
|
uint8 fpu_state[512];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct arch_proc {
|
struct arch_team {
|
||||||
// nothing here
|
// nothing here
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
#include <thread.h>
|
#include <thread.h>
|
||||||
|
|
||||||
int elf_load_uspace(const char *path, struct proc *p, int flags, addr *entry);
|
int elf_load_uspace(const char *path, struct team *t, int flags, addr *entry);
|
||||||
image_id elf_load_kspace(const char *path, const char *sym_prepend);
|
image_id elf_load_kspace(const char *path, const char *sym_prepend);
|
||||||
int elf_unload_kspace( const char *path);
|
int elf_unload_kspace( const char *path);
|
||||||
addr elf_lookup_symbol(image_id id, const char *symbol);
|
addr elf_lookup_symbol(image_id id, const char *symbol);
|
||||||
|
|||||||
@@ -79,9 +79,9 @@ static struct io_context *get_current_io_context(bool kernel);
|
|||||||
static __inline struct io_context *get_current_io_context(bool kernel)
|
static __inline struct io_context *get_current_io_context(bool kernel)
|
||||||
{
|
{
|
||||||
if (kernel)
|
if (kernel)
|
||||||
return proc_get_kernel_proc()->ioctx;
|
return team_get_kernel_team()->ioctx;
|
||||||
|
|
||||||
return thread_get_current_thread()->proc->ioctx;
|
return thread_get_current_thread()->team->ioctx;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* _FILE_H */
|
#endif /* _FILE_H */
|
||||||
|
|||||||
@@ -34,9 +34,9 @@ enum {
|
|||||||
SYSCALL_SEM_RELEASE_ETC,
|
SYSCALL_SEM_RELEASE_ETC,
|
||||||
SYSCALL_GET_CURRENT_THREAD_ID,
|
SYSCALL_GET_CURRENT_THREAD_ID,
|
||||||
SYSCALL_EXIT_THREAD,
|
SYSCALL_EXIT_THREAD,
|
||||||
SYSCALL_PROC_CREATE_PROC,
|
SYSCALL_CREATE_TEAM,
|
||||||
SYSCALL_THREAD_WAIT_ON_THREAD,
|
SYSCALL_WAIT_ON_THREAD,
|
||||||
SYSCALL_PROC_WAIT_ON_PROC,
|
SYSCALL_WAIT_ON_TEAM,
|
||||||
SYSCALL_VM_CREATE_ANONYMOUS_REGION,
|
SYSCALL_VM_CREATE_ANONYMOUS_REGION,
|
||||||
SYSCALL_VM_CLONE_REGION, /* 30 */
|
SYSCALL_VM_CLONE_REGION, /* 30 */
|
||||||
SYSCALL_VM_MAP_FILE,
|
SYSCALL_VM_MAP_FILE,
|
||||||
@@ -47,8 +47,8 @@ enum {
|
|||||||
SYSCALL_KILL_THREAD,
|
SYSCALL_KILL_THREAD,
|
||||||
SYSCALL_SUSPEND_THREAD,
|
SYSCALL_SUSPEND_THREAD,
|
||||||
SYSCALL_RESUME_THREAD,
|
SYSCALL_RESUME_THREAD,
|
||||||
SYSCALL_PROC_KILL_PROC,
|
SYSCALL_KILL_TEAM,
|
||||||
SYSCALL_GET_CURRENT_PROC_ID,
|
SYSCALL_GET_CURRENT_TEAM_ID,
|
||||||
SYSCALL_GETCWD, /* 40 */
|
SYSCALL_GETCWD, /* 40 */
|
||||||
SYSCALL_SETCWD,
|
SYSCALL_SETCWD,
|
||||||
SYSCALL_PORT_CREATE,
|
SYSCALL_PORT_CREATE,
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ typedef int pid_t;
|
|||||||
typedef int thread_id;
|
typedef int thread_id;
|
||||||
typedef int region_id;
|
typedef int region_id;
|
||||||
typedef int aspace_id;
|
typedef int aspace_id;
|
||||||
typedef int proc_id;
|
typedef int team_id;
|
||||||
typedef int sem_id;
|
typedef int sem_id;
|
||||||
typedef int port_id;
|
typedef int port_id;
|
||||||
typedef int image_id;
|
typedef int image_id;
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
#define PORT_FLAG_USE_USER_MEMCPY 0x80000000
|
#define PORT_FLAG_USE_USER_MEMCPY 0x80000000
|
||||||
|
|
||||||
int port_init(kernel_args *ka);
|
int port_init(kernel_args *ka);
|
||||||
int delete_owned_ports(proc_id owner);
|
int delete_owned_ports(team_id owner);
|
||||||
|
|
||||||
// temp: test
|
// temp: test
|
||||||
void port_test(void);
|
void port_test(void);
|
||||||
@@ -24,7 +24,7 @@ int user_close_port(port_id id);
|
|||||||
int user_delete_port(port_id id);
|
int user_delete_port(port_id id);
|
||||||
port_id user_find_port(const char *port_name);
|
port_id user_find_port(const char *port_name);
|
||||||
int user_get_port_info(port_id id, struct port_info *info);
|
int user_get_port_info(port_id id, struct port_info *info);
|
||||||
int user_get_next_port_info(proc_id proc,
|
int user_get_next_port_info(team_id team,
|
||||||
uint32 *cookie,
|
uint32 *cookie,
|
||||||
struct port_info *info);
|
struct port_info *info);
|
||||||
ssize_t user_port_buffer_size_etc(port_id port,
|
ssize_t user_port_buffer_size_etc(port_id port,
|
||||||
@@ -37,7 +37,7 @@ ssize_t user_read_port_etc(port_id port,
|
|||||||
size_t buffer_size,
|
size_t buffer_size,
|
||||||
uint32 flags,
|
uint32 flags,
|
||||||
bigtime_t timeout);
|
bigtime_t timeout);
|
||||||
int user_set_port_owner(port_id port, proc_id proc);
|
int user_set_port_owner(port_id port, team_id team);
|
||||||
int user_write_port_etc(port_id port,
|
int user_write_port_etc(port_id port,
|
||||||
int32 msg_code,
|
int32 msg_code,
|
||||||
void *msg_buffer,
|
void *msg_buffer,
|
||||||
|
|||||||
@@ -24,12 +24,12 @@ int user_release_sem(sem_id id);
|
|||||||
int user_release_sem_etc(sem_id id, int count, int flags);
|
int user_release_sem_etc(sem_id id, int count, int flags);
|
||||||
int user_get_sem_count(sem_id id, int32* thread_count);
|
int user_get_sem_count(sem_id id, int32* thread_count);
|
||||||
int user_get_sem_info(sem_id, struct sem_info *, size_t);
|
int user_get_sem_info(sem_id, struct sem_info *, size_t);
|
||||||
int user_get_next_sem_info(proc_id, uint32 *, struct sem_info *, size_t);
|
int user_get_next_sem_info(team_id, uint32 *, struct sem_info *, size_t);
|
||||||
int user_set_sem_owner(sem_id id, proc_id proc);
|
int user_set_sem_owner(sem_id id, team_id team);
|
||||||
|
|
||||||
|
|
||||||
int sem_init(kernel_args *ka);
|
int sem_init(kernel_args *ka);
|
||||||
int sem_delete_owned_sems(proc_id owner);
|
int sem_delete_owned_sems(team_id owner);
|
||||||
int sem_interrupt_thread(struct thread *t);
|
int sem_interrupt_thread(struct thread *t);
|
||||||
/* #endif */
|
/* #endif */
|
||||||
|
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ struct ctlname {
|
|||||||
#ifdef _KERNEL_MODE
|
#ifdef _KERNEL_MODE
|
||||||
typedef int (sysctlfn)(int *, uint, void *, size_t *, void *, size_t);
|
typedef int (sysctlfn)(int *, uint, void *, size_t *, void *, size_t);
|
||||||
|
|
||||||
int kern_sysctl(int *, uint, void *, size_t *, void *, size_t);
|
int sys_sysctl(int *, uint, void *, size_t *, void *, size_t);
|
||||||
int hw_sysctl(int *, uint, void *, size_t *, void *, size_t);
|
int hw_sysctl(int *, uint, void *, size_t *, void *, size_t);
|
||||||
int sysctl_int (void *, size_t *, void *, size_t, int *);
|
int sysctl_int (void *, size_t *, void *, size_t, int *);
|
||||||
int sysctl_rdint (void *, size_t *, void *, int);
|
int sysctl_rdint (void *, size_t *, void *, int);
|
||||||
|
|||||||
@@ -44,28 +44,28 @@ extern inline thread_id thread_get_current_thread_id(void) {
|
|||||||
}
|
}
|
||||||
int thread_wait_on_thread(thread_id id, int *retcode);
|
int thread_wait_on_thread(thread_id id, int *retcode);
|
||||||
|
|
||||||
thread_id thread_create_user_thread(char *name, proc_id pid, addr entry, void *args);
|
thread_id thread_create_user_thread(char *name, team_id tid, addr entry, void *args);
|
||||||
thread_id thread_create_kernel_thread(const char *name, int (*func)(void *args), void *args);
|
thread_id thread_create_kernel_thread(const char *name, int (*func)(void *args), void *args);
|
||||||
|
|
||||||
struct proc *proc_get_kernel_proc(void);
|
struct team *team_get_kernel_team(void);
|
||||||
proc_id proc_create_proc(const char *path, const char *name, char **args, int argc, char **envp, int envc, int priority);
|
team_id team_create_team(const char *path, const char *name, char **args, int argc, char **envp, int envc, int priority);
|
||||||
int proc_kill_proc(proc_id);
|
int team_kill_team(team_id);
|
||||||
int proc_wait_on_proc(proc_id id, int *retcode);
|
int team_wait_on_team(team_id id, int *retcode);
|
||||||
proc_id proc_get_kernel_proc_id(void);
|
team_id team_get_kernel_team_id(void);
|
||||||
proc_id proc_get_current_proc_id(void);
|
team_id team_get_current_team_id(void);
|
||||||
char **user_proc_get_arguments(void);
|
char **user_team_get_arguments(void);
|
||||||
int user_proc_get_arg_count(void);
|
int user_team_get_arg_count(void);
|
||||||
|
|
||||||
// used in syscalls.c
|
// used in syscalls.c
|
||||||
int user_thread_wait_on_thread(thread_id id, int *uretcode);
|
int user_thread_wait_on_thread(thread_id id, int *uretcode);
|
||||||
proc_id user_proc_create_proc(const char *path, const char *name, char **args, int argc, char **envp, int envc, int priority);
|
team_id user_team_create_team(const char *path, const char *name, char **args, int argc, char **envp, int envc, int priority);
|
||||||
int user_proc_wait_on_proc(proc_id id, int *uretcode);
|
int user_team_wait_on_team(team_id id, int *uretcode);
|
||||||
|
|
||||||
thread_id user_thread_create_user_thread(addr, proc_id, const char*,
|
thread_id user_thread_create_user_thread(addr, team_id, const char*,
|
||||||
int, void *);
|
int, void *);
|
||||||
|
|
||||||
int user_thread_snooze(bigtime_t time);
|
int user_thread_snooze(bigtime_t time);
|
||||||
int user_proc_get_table(struct proc_info *pi, size_t len);
|
//int user_proc_get_table(struct proc_info *pi, size_t len);
|
||||||
int user_getrlimit(int resource, struct rlimit * rlp);
|
int user_getrlimit(int resource, struct rlimit * rlp);
|
||||||
int user_setrlimit(int resource, const struct rlimit * rlp);
|
int user_setrlimit(int resource, const struct rlimit * rlp);
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int i, rc;
|
int i, rc;
|
||||||
proc_id pid;
|
team_id pid;
|
||||||
char temp[16];
|
char temp[16];
|
||||||
char *var;
|
char *var;
|
||||||
|
|
||||||
@@ -47,8 +47,8 @@ int main(int argc, char **argv)
|
|||||||
if (val > 0) {
|
if (val > 0) {
|
||||||
printf("Spawning test (%d left)\n", val);
|
printf("Spawning test (%d left)\n", val);
|
||||||
sprintf(buffer, "%d", val);
|
sprintf(buffer, "%d", val);
|
||||||
pid = sys_proc_create_proc(_argv[0], _argv[0], _argv, 2, NULL, 0, 5);
|
pid = sys_create_team(_argv[0], _argv[0], _argv, 2, NULL, 0, 5);
|
||||||
sys_proc_wait_on_proc(pid, &rc);
|
sys_wait_on_team(pid, &rc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -43,20 +43,20 @@ main(int argc, char *argv[])
|
|||||||
if(num < 2) {
|
if(num < 2) {
|
||||||
result= 1;
|
result= 1;
|
||||||
} else {
|
} else {
|
||||||
proc_id pid;
|
team_id pid;
|
||||||
int retcode;
|
int retcode;
|
||||||
char buffer[64];
|
char buffer[64];
|
||||||
char *aaargv[]= { "/boot/bin/fibo", "-s", buffer, NULL };
|
char *aaargv[]= { "/boot/bin/fibo", "-s", buffer, NULL };
|
||||||
int aaargc= 3;
|
int aaargc= 3;
|
||||||
|
|
||||||
sprintf(buffer, "%d", num-1);
|
sprintf(buffer, "%d", num-1);
|
||||||
pid= sys_proc_create_proc(aaargv[0], aaargv[0], aaargv, aaargc, NULL, 0, 5);
|
pid= sys_create_team(aaargv[0], aaargv[0], aaargv, aaargc, NULL, 0, 5);
|
||||||
sys_proc_wait_on_proc(pid, &retcode);
|
sys_wait_on_team(pid, &retcode);
|
||||||
result= retcode;
|
result= retcode;
|
||||||
|
|
||||||
sprintf(buffer, "%d", num-2);
|
sprintf(buffer, "%d", num-2);
|
||||||
pid= sys_proc_create_proc(aaargv[0], aaargv[0], aaargv, aaargc, NULL, 0, 5);
|
pid= sys_create_team(aaargv[0], aaargv[0], aaargv, aaargc, NULL, 0, 5);
|
||||||
sys_proc_wait_on_proc(pid, &retcode);
|
sys_wait_on_team(pid, &retcode);
|
||||||
result+= retcode;
|
result+= retcode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -31,26 +31,26 @@ int main()
|
|||||||
printf("Welcome to OpenBeOS!\n");
|
printf("Welcome to OpenBeOS!\n");
|
||||||
|
|
||||||
if(1) {
|
if(1) {
|
||||||
proc_id pid;
|
team_id pid;
|
||||||
|
|
||||||
pid = sys_proc_create_proc("/boot/bin/fortune", "/boot/bin/fortune", NULL, 0, NULL, 0, 5);
|
pid = sys_create_team("/boot/bin/fortune", "/boot/bin/fortune", NULL, 0, NULL, 0, 5);
|
||||||
if (pid >= 0) {
|
if (pid >= 0) {
|
||||||
int retcode;
|
int retcode;
|
||||||
sys_proc_wait_on_proc(pid, &retcode);
|
sys_wait_on_team(pid, &retcode);
|
||||||
} else {
|
} else {
|
||||||
printf("Failed to create a proc for fortune.\n");
|
printf("Failed to create a team for fortune.\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
while(1) {
|
while(1) {
|
||||||
proc_id pid;
|
team_id pid;
|
||||||
|
|
||||||
pid = sys_proc_create_proc("/boot/bin/shell", "/boot/bin/shell", NULL, 0, NULL, 0, 5);
|
pid = sys_create_team("/boot/bin/shell", "/boot/bin/shell", NULL, 0, NULL, 0, 5);
|
||||||
if(pid >= 0) {
|
if(pid >= 0) {
|
||||||
int retcode;
|
int retcode;
|
||||||
printf("init: spawned shell, pid 0x%x\n", pid);
|
printf("init: spawned shell, pid 0x%x\n", pid);
|
||||||
sys_proc_wait_on_proc(pid, &retcode);
|
sys_wait_on_team(pid, &retcode);
|
||||||
printf("init: shell exited with return code %d\n", retcode);
|
printf("init: shell exited with return code %d\n", retcode);
|
||||||
} else {
|
} else {
|
||||||
printf("Failed to start a shell :(\n");
|
printf("Failed to start a shell :(\n");
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
|
||||||
#define MAX_PROCESSES 1024
|
#define MAX_PROCESSES 1024
|
||||||
|
|
||||||
@@ -72,3 +73,11 @@ main(int argc, char ** argv)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ void
|
|||||||
rldheap_init(void)
|
rldheap_init(void)
|
||||||
{
|
{
|
||||||
rld_region= sys_vm_create_anonymous_region(
|
rld_region= sys_vm_create_anonymous_region(
|
||||||
(char*)names[sys_get_current_proc_id()%(sizeof(names)/sizeof(names[0]))],
|
(char*)names[sys_get_current_team_id()%(sizeof(names)/sizeof(names[0]))],
|
||||||
(void**)&rld_base,
|
(void**)&rld_base,
|
||||||
REGION_ADDR_ANY_ADDRESS,
|
REGION_ADDR_ANY_ADDRESS,
|
||||||
RLD_SCRATCH_SIZE,
|
RLD_SCRATCH_SIZE,
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ int cmd_exec(int argc, char *argv[])
|
|||||||
int cmd_create_proc(int argc,char *argv[])
|
int cmd_create_proc(int argc,char *argv[])
|
||||||
{
|
{
|
||||||
bool must_wait=true;
|
bool must_wait=true;
|
||||||
proc_id pid;
|
team_id pid;
|
||||||
|
|
||||||
int arg_len;
|
int arg_len;
|
||||||
char *tmp;
|
char *tmp;
|
||||||
@@ -65,12 +65,12 @@ int cmd_create_proc(int argc,char *argv[])
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pid = sys_proc_create_proc(filename,filename, argv, argc, NULL, 0, 5);
|
pid = sys_create_team(filename,filename, argv, argc, NULL, 0, 5);
|
||||||
if(pid >= 0) {
|
if(pid >= 0) {
|
||||||
int retcode;
|
int retcode;
|
||||||
|
|
||||||
if(must_wait) {
|
if(must_wait) {
|
||||||
sys_proc_wait_on_proc(pid, &retcode);
|
sys_wait_on_team(pid, &retcode);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
printf("Error: cannot execute '%s'\n", filename);
|
printf("Error: cannot execute '%s'\n", filename);
|
||||||
|
|||||||
@@ -71,11 +71,11 @@ int exec_file(int argc,char *argv[],int *retcode)
|
|||||||
|
|
||||||
if( !find_file_in_path(argv[0],filename,SCAN_SIZE)) return SHE_FILE_NOT_FOUND;
|
if( !find_file_in_path(argv[0],filename,SCAN_SIZE)) return SHE_FILE_NOT_FOUND;
|
||||||
|
|
||||||
pid = sys_proc_create_proc(filename,filename, argv, argc, NULL, 0, 5);
|
pid = sys_create_team(filename,filename, argv, argc, NULL, 0, 5);
|
||||||
|
|
||||||
if(pid < 0) return SHE_CANT_EXECUTE;
|
if(pid < 0) return SHE_CANT_EXECUTE;
|
||||||
|
|
||||||
sys_proc_wait_on_proc(pid, retcode);
|
sys_wait_on_team(pid, retcode);
|
||||||
|
|
||||||
return SHE_NO_ERROR;
|
return SHE_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -155,7 +155,7 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
sys_snooze(5000000);
|
sys_snooze(5000000);
|
||||||
sys_proc_kill_proc(sys_get_current_proc_id());
|
sys_kill_team(sys_get_current_team_id());
|
||||||
/*
|
/*
|
||||||
sys_snooze(3000000);
|
sys_snooze(3000000);
|
||||||
for(i=0; i<10; i++) {
|
for(i=0; i<10; i++) {
|
||||||
@@ -169,7 +169,7 @@ int main(int argc, char **argv)
|
|||||||
#if 0
|
#if 0
|
||||||
{
|
{
|
||||||
for(;;)
|
for(;;)
|
||||||
sys_proc_create_proc("/boot/bin/true", "true", 32);
|
sys_create_team("/boot/bin/true", "true", 32);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if 0
|
#if 0
|
||||||
@@ -325,32 +325,32 @@ int main(int argc, char **argv)
|
|||||||
printf("%d\n", *((int *)ptr + 3));
|
printf("%d\n", *((int *)ptr + 3));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if 0
|
#if 1
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
// printf("spawning %d copies of true\n", 10000);
|
printf("spawning %d copies of true\n", 100);
|
||||||
|
|
||||||
for(i=0; ; i++) {
|
for(i=0; i<100; i++) {
|
||||||
proc_id id;
|
team_id id;
|
||||||
bigtime_t t;
|
bigtime_t t;
|
||||||
|
|
||||||
printf("%d...", i);
|
printf("%d...", i);
|
||||||
|
|
||||||
t = sys_system_time();
|
t = sys_system_time();
|
||||||
|
|
||||||
id = sys_proc_create_proc("/boot/bin/true", "true", NULL, 0, 20);
|
id = sys_create_team("/boot/bin/true", "true", NULL, 0, NULL, 0, 20);
|
||||||
if(id <= 0x2) {
|
if(id <= 0x2) {
|
||||||
printf("new proc returned 0x%x!\n", id);
|
printf("new team returned 0x%x!\n", id);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
sys_proc_wait_on_proc(id, NULL);
|
sys_wait_on_team(id, NULL);
|
||||||
|
|
||||||
printf("done (%Ld usecs)\n", sys_system_time() - t);
|
printf("done (%Ld usecs)\n", sys_system_time() - t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if 0
|
#if 1
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@@ -359,9 +359,9 @@ int main(int argc, char **argv)
|
|||||||
// resume_thread(spawn_thread("cpu eater 1", &cpu_eater_thread, 0));
|
// resume_thread(spawn_thread("cpu eater 1", &cpu_eater_thread, 0));
|
||||||
// resume_thread(spawn_thread(&cpu_eater_thread, "cpu eater 2", &cpu_eater_thread, 0));
|
// resume_thread(spawn_thread(&cpu_eater_thread, "cpu eater 2", &cpu_eater_thread, 0));
|
||||||
|
|
||||||
printf("spawning %d threads\n", 10000);
|
printf("spawning %d threads\n", 100);
|
||||||
|
|
||||||
for(i=0; i<10000; i++) {
|
for(i=0; i<100; i++) {
|
||||||
thread_id id;
|
thread_id id;
|
||||||
bigtime_t t;
|
bigtime_t t;
|
||||||
|
|
||||||
@@ -373,7 +373,7 @@ int main(int argc, char **argv)
|
|||||||
if (id > 0)
|
if (id > 0)
|
||||||
resume_thread(id);
|
resume_thread(id);
|
||||||
|
|
||||||
sys_thread_wait_on_thread(id, NULL);
|
sys_wait_on_thread(id, NULL);
|
||||||
|
|
||||||
printf("done (%Ld usecs)\n", sys_system_time() - t);
|
printf("done (%Ld usecs)\n", sys_system_time() - t);
|
||||||
}
|
}
|
||||||
@@ -466,7 +466,7 @@ static void port_test(void)
|
|||||||
sys_port_write(test_p1, 3, &testdata, sizeof(testdata));
|
sys_port_write(test_p1, 3, &testdata, sizeof(testdata));
|
||||||
|
|
||||||
printf("porttest: waiting on spawned thread\n");
|
printf("porttest: waiting on spawned thread\n");
|
||||||
sys_thread_wait_on_thread(t, NULL);
|
sys_wait_on_thread(t, NULL);
|
||||||
|
|
||||||
printf("porttest: close p1\n");
|
printf("porttest: close p1\n");
|
||||||
sys_port_close(test_p2);
|
sys_port_close(test_p2);
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sys_thread_wait_on_thread(t[THREADS - 1], NULL);
|
sys_wait_on_thread(t[THREADS - 1], NULL);
|
||||||
|
|
||||||
printf("Test value = %d vs expected of %d\n", current_val, expected);
|
printf("Test value = %d vs expected of %d\n", current_val, expected);
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
#include <int.h>
|
#include <int.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
int arch_proc_init_proc_struct(struct proc *p, bool kernel)
|
int arch_team_init_team_struct(struct team *p, bool kernel)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -87,7 +87,7 @@ void arch_thread_context_switch(struct thread *t_from, struct thread *t_to)
|
|||||||
|
|
||||||
dprintf("arch_thread_context_switch: cpu %d 0x%x -> 0x%x, aspace 0x%x -> 0x%x, old stack = 0x%x:0x%x, stack = 0x%x:0x%x\n",
|
dprintf("arch_thread_context_switch: cpu %d 0x%x -> 0x%x, aspace 0x%x -> 0x%x, old stack = 0x%x:0x%x, stack = 0x%x:0x%x\n",
|
||||||
smp_get_current_cpu(), t_from->id, t_to->id,
|
smp_get_current_cpu(), t_from->id, t_to->id,
|
||||||
t_from->proc->aspace, t_to->proc->aspace,
|
t_from->team->aspace, t_to->team->aspace,
|
||||||
t_from->arch_info.current_stack.ss, t_from->arch_info.current_stack.esp,
|
t_from->arch_info.current_stack.ss, t_from->arch_info.current_stack.esp,
|
||||||
t_to->arch_info.current_stack.ss, t_to->arch_info.current_stack.esp);
|
t_to->arch_info.current_stack.ss, t_to->arch_info.current_stack.esp);
|
||||||
#endif
|
#endif
|
||||||
@@ -103,23 +103,23 @@ void arch_thread_context_switch(struct thread *t_from, struct thread *t_to)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(t_from->proc->_aspace_id >= 0 && t_to->proc->_aspace_id >= 0) {
|
if(t_from->team->_aspace_id >= 0 && t_to->team->_aspace_id >= 0) {
|
||||||
// they are both uspace threads
|
// they are both uspace threads
|
||||||
if(t_from->proc->_aspace_id == t_to->proc->_aspace_id) {
|
if(t_from->team->_aspace_id == t_to->team->_aspace_id) {
|
||||||
// dont change the pgdir, same address space
|
// dont change the pgdir, same address space
|
||||||
new_pgdir = NULL;
|
new_pgdir = NULL;
|
||||||
} else {
|
} else {
|
||||||
// switching to a new address space
|
// switching to a new address space
|
||||||
new_pgdir = vm_translation_map_get_pgdir(&t_to->proc->aspace->translation_map);
|
new_pgdir = vm_translation_map_get_pgdir(&t_to->team->aspace->translation_map);
|
||||||
}
|
}
|
||||||
} else if(t_from->proc->_aspace_id < 0 && t_to->proc->_aspace_id < 0) {
|
} else if(t_from->team->_aspace_id < 0 && t_to->team->_aspace_id < 0) {
|
||||||
// they must both be kspace threads
|
// they must both be kspace threads
|
||||||
new_pgdir = NULL;
|
new_pgdir = NULL;
|
||||||
} else if(t_to->proc->_aspace_id < 0) {
|
} else if(t_to->team->_aspace_id < 0) {
|
||||||
// the one we're switching to is kspace
|
// the one we're switching to is kspace
|
||||||
new_pgdir = vm_translation_map_get_pgdir(&t_to->proc->kaspace->translation_map);
|
new_pgdir = vm_translation_map_get_pgdir(&t_to->team->kaspace->translation_map);
|
||||||
} else {
|
} else {
|
||||||
new_pgdir = vm_translation_map_get_pgdir(&t_to->proc->aspace->translation_map);
|
new_pgdir = vm_translation_map_get_pgdir(&t_to->team->aspace->translation_map);
|
||||||
}
|
}
|
||||||
#if 0
|
#if 0
|
||||||
dprintf("new_pgdir is 0x%x\n", new_pgdir);
|
dprintf("new_pgdir is 0x%x\n", new_pgdir);
|
||||||
|
|||||||
@@ -617,7 +617,7 @@ verify_eheader(struct Elf32_Ehdr *eheader)
|
|||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
elf_load_uspace(const char *path, struct proc *p, int flags, addr *entry)
|
elf_load_uspace(const char *path, struct team *p, int flags, addr *entry)
|
||||||
{
|
{
|
||||||
struct Elf32_Ehdr eheader;
|
struct Elf32_Ehdr eheader;
|
||||||
struct Elf32_Phdr *pheaders = NULL;
|
struct Elf32_Phdr *pheaders = NULL;
|
||||||
@@ -626,7 +626,7 @@ elf_load_uspace(const char *path, struct proc *p, int flags, addr *entry)
|
|||||||
int i;
|
int i;
|
||||||
ssize_t len;
|
ssize_t len;
|
||||||
|
|
||||||
dprintf("elf_load: entry path '%s', proc %p\n", path, p);
|
dprintf("elf_load: entry path '%s', team %p\n", path, p);
|
||||||
|
|
||||||
fd = sys_open(path, 0);
|
fd = sys_open(path, 0);
|
||||||
if(fd < 0)
|
if(fd < 0)
|
||||||
|
|||||||
@@ -147,8 +147,8 @@ static int main2(void *unused)
|
|||||||
#endif
|
#endif
|
||||||
// start the init process
|
// start the init process
|
||||||
{
|
{
|
||||||
proc_id pid;
|
team_id pid;
|
||||||
pid = proc_create_proc("/boot/bin/init", "init", NULL, 0, NULL, 0, 5);
|
pid = team_create_team("/boot/bin/init", "init", NULL, 0, NULL, 0, 5);
|
||||||
if(pid < 0)
|
if(pid < 0)
|
||||||
kprintf("error starting 'init' error = %d \n",pid);
|
kprintf("error starting 'init' error = %d \n",pid);
|
||||||
}
|
}
|
||||||
|
|||||||
+14
-14
@@ -25,7 +25,7 @@ struct port_msg {
|
|||||||
|
|
||||||
struct port_entry {
|
struct port_entry {
|
||||||
port_id id;
|
port_id id;
|
||||||
proc_id owner;
|
team_id owner;
|
||||||
int32 capacity;
|
int32 capacity;
|
||||||
int lock;
|
int lock;
|
||||||
char *name;
|
char *name;
|
||||||
@@ -163,7 +163,7 @@ create_port(int32 queue_length, const char *name)
|
|||||||
port_id retval;
|
port_id retval;
|
||||||
char *temp_name;
|
char *temp_name;
|
||||||
void *q;
|
void *q;
|
||||||
proc_id owner;
|
team_id owner;
|
||||||
|
|
||||||
if(ports_active == false)
|
if(ports_active == false)
|
||||||
return B_BAD_PORT_ID;
|
return B_BAD_PORT_ID;
|
||||||
@@ -213,7 +213,7 @@ create_port(int32 queue_length, const char *name)
|
|||||||
kfree(q);
|
kfree(q);
|
||||||
return sem_w;
|
return sem_w;
|
||||||
}
|
}
|
||||||
owner = proc_get_current_proc_id();
|
owner = team_get_current_team_id();
|
||||||
|
|
||||||
state = disable_interrupts();
|
state = disable_interrupts();
|
||||||
GRAB_PORT_LIST_LOCK();
|
GRAB_PORT_LIST_LOCK();
|
||||||
@@ -431,7 +431,7 @@ _get_port_info(port_id id, port_info *info, size_t size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
_get_next_port_info(team_id proc, int32 *cookie, struct port_info *info,
|
_get_next_port_info(team_id team, int32 *cookie, struct port_info *info,
|
||||||
size_t size)
|
size_t size)
|
||||||
{
|
{
|
||||||
int state;
|
int state;
|
||||||
@@ -460,7 +460,7 @@ _get_next_port_info(team_id proc, int32 *cookie, struct port_info *info,
|
|||||||
while (slot < MAX_PORTS) {
|
while (slot < MAX_PORTS) {
|
||||||
GRAB_PORT_LOCK(ports[slot]);
|
GRAB_PORT_LOCK(ports[slot]);
|
||||||
if (ports[slot].id != -1)
|
if (ports[slot].id != -1)
|
||||||
if (ports[slot].owner == proc) {
|
if (ports[slot].owner == team) {
|
||||||
// found one!
|
// found one!
|
||||||
// copy the info
|
// copy the info
|
||||||
info->port = ports[slot].id;
|
info->port = ports[slot].id;
|
||||||
@@ -727,7 +727,7 @@ read_port_etc(port_id id,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
set_port_owner(port_id id, proc_id proc)
|
set_port_owner(port_id id, team_id team)
|
||||||
{
|
{
|
||||||
int slot;
|
int slot;
|
||||||
int state;
|
int state;
|
||||||
@@ -749,8 +749,8 @@ set_port_owner(port_id id, proc_id proc)
|
|||||||
return B_BAD_PORT_ID;
|
return B_BAD_PORT_ID;
|
||||||
}
|
}
|
||||||
|
|
||||||
// transfer ownership to other process
|
// transfer ownership to other team
|
||||||
ports[slot].owner = proc;
|
ports[slot].owner = team;
|
||||||
|
|
||||||
// unlock port
|
// unlock port
|
||||||
RELEASE_PORT_LOCK(ports[slot]);
|
RELEASE_PORT_LOCK(ports[slot]);
|
||||||
@@ -896,8 +896,8 @@ write_port_etc(port_id id,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* this function cycles through the ports table, deleting all the ports that are owned by
|
/* this function cycles through the ports table, deleting all the ports that are owned by
|
||||||
the passed proc_id */
|
the passed team_id */
|
||||||
int delete_owned_ports(proc_id owner)
|
int delete_owned_ports(team_id owner)
|
||||||
{
|
{
|
||||||
int state;
|
int state;
|
||||||
int i;
|
int i;
|
||||||
@@ -1099,7 +1099,7 @@ int user_get_port_info(port_id id, struct port_info *uinfo)
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
int user_get_next_port_info(proc_id uproc,
|
int user_get_next_port_info(team_id uteam,
|
||||||
uint32 *ucookie,
|
uint32 *ucookie,
|
||||||
struct port_info *uinfo)
|
struct port_info *uinfo)
|
||||||
{
|
{
|
||||||
@@ -1122,7 +1122,7 @@ int user_get_next_port_info(proc_id uproc,
|
|||||||
if(rc < 0)
|
if(rc < 0)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
res = get_next_port_info(uproc, &cookie, &info);
|
res = get_next_port_info(uteam, &cookie, &info);
|
||||||
// copy to userspace
|
// copy to userspace
|
||||||
rc = user_memcpy(ucookie, &info, sizeof(uint32));
|
rc = user_memcpy(ucookie, &info, sizeof(uint32));
|
||||||
if(rc < 0)
|
if(rc < 0)
|
||||||
@@ -1170,9 +1170,9 @@ ssize_t user_read_port_etc(port_id uport, int32 *umsg_code, void *umsg_buffer,
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
int user_set_port_owner(port_id port, proc_id proc)
|
int user_set_port_owner(port_id port, team_id team)
|
||||||
{
|
{
|
||||||
return set_port_owner(port, proc);
|
return set_port_owner(port, team);
|
||||||
}
|
}
|
||||||
|
|
||||||
int user_write_port_etc(port_id uport, int32 umsg_code, void *umsg_buffer,
|
int user_write_port_etc(port_id uport, int32 umsg_code, void *umsg_buffer,
|
||||||
|
|||||||
+22
-22
@@ -28,7 +28,7 @@ struct sem_entry {
|
|||||||
struct thread_queue q;
|
struct thread_queue q;
|
||||||
char *name;
|
char *name;
|
||||||
int lock;
|
int lock;
|
||||||
proc_id owner; // if set to -1, means owned by a port
|
team_id owner; // if set to -1, means owned by a port
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MAX_SEMS 4096
|
#define MAX_SEMS 4096
|
||||||
@@ -142,7 +142,7 @@ int sem_init(kernel_args *ka)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
sem_id create_sem_etc(int count, const char *name, proc_id owner)
|
sem_id create_sem_etc(int count, const char *name, team_id owner)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int state;
|
int state;
|
||||||
@@ -208,7 +208,7 @@ out:
|
|||||||
|
|
||||||
sem_id create_sem(int count, const char *name)
|
sem_id create_sem(int count, const char *name)
|
||||||
{
|
{
|
||||||
return create_sem_etc(count, name, proc_get_kernel_proc_id());
|
return create_sem_etc(count, name, team_get_kernel_team_id());
|
||||||
}
|
}
|
||||||
|
|
||||||
int delete_sem(sem_id id)
|
int delete_sem(sem_id id)
|
||||||
@@ -581,7 +581,7 @@ int _get_sem_info(sem_id id, struct sem_info *info, size_t sz)
|
|||||||
}
|
}
|
||||||
|
|
||||||
info->sem = sems[slot].id;
|
info->sem = sems[slot].id;
|
||||||
info->proc = sems[slot].owner;
|
info->team = sems[slot].owner;
|
||||||
strncpy(info->name, sems[slot].name, SYS_MAX_OS_NAME_LEN-1);
|
strncpy(info->name, sems[slot].name, SYS_MAX_OS_NAME_LEN-1);
|
||||||
info->count = sems[slot].count;
|
info->count = sems[slot].count;
|
||||||
info->latest_holder = sems[slot].q.head->id; // XXX not sure if this is correct
|
info->latest_holder = sems[slot].q.head->id; // XXX not sure if this is correct
|
||||||
@@ -592,7 +592,7 @@ int _get_sem_info(sem_id id, struct sem_info *info, size_t sz)
|
|||||||
return B_NO_ERROR;
|
return B_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
int _get_next_sem_info(proc_id proc, uint32 *cookie, struct sem_info *info, size_t sz)
|
int _get_next_sem_info(team_id team, uint32 *cookie, struct sem_info *info, size_t sz)
|
||||||
{
|
{
|
||||||
int state;
|
int state;
|
||||||
int slot;
|
int slot;
|
||||||
@@ -602,7 +602,7 @@ int _get_next_sem_info(proc_id proc, uint32 *cookie, struct sem_info *info, size
|
|||||||
if (cookie == NULL)
|
if (cookie == NULL)
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
/* prevents sems[].owner == -1 >= means owned by a port */
|
/* prevents sems[].owner == -1 >= means owned by a port */
|
||||||
if (proc < 0)
|
if (team < 0)
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
|
|
||||||
if (*cookie == NULL) {
|
if (*cookie == NULL) {
|
||||||
@@ -622,10 +622,10 @@ int _get_next_sem_info(proc_id proc, uint32 *cookie, struct sem_info *info, size
|
|||||||
while (slot < MAX_SEMS) {
|
while (slot < MAX_SEMS) {
|
||||||
GRAB_SEM_LOCK(sems[slot]);
|
GRAB_SEM_LOCK(sems[slot]);
|
||||||
if (sems[slot].id != -1)
|
if (sems[slot].id != -1)
|
||||||
if (sems[slot].owner == proc) {
|
if (sems[slot].owner == team) {
|
||||||
// found one!
|
// found one!
|
||||||
info->sem = sems[slot].id;
|
info->sem = sems[slot].id;
|
||||||
info->proc = sems[slot].owner;
|
info->team = sems[slot].owner;
|
||||||
strncpy(info->name, sems[slot].name, SYS_MAX_OS_NAME_LEN-1);
|
strncpy(info->name, sems[slot].name, SYS_MAX_OS_NAME_LEN-1);
|
||||||
info->count = sems[slot].count;
|
info->count = sems[slot].count;
|
||||||
info->latest_holder = sems[slot].q.head->id; // XXX not sure if this is the latest holder, or the next holder...
|
info->latest_holder = sems[slot].q.head->id; // XXX not sure if this is the latest holder, or the next holder...
|
||||||
@@ -646,7 +646,7 @@ int _get_next_sem_info(proc_id proc, uint32 *cookie, struct sem_info *info, size
|
|||||||
return B_NO_ERROR;
|
return B_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
int set_sem_owner(sem_id id, proc_id proc)
|
int set_sem_owner(sem_id id, team_id team)
|
||||||
{
|
{
|
||||||
int state;
|
int state;
|
||||||
int slot;
|
int slot;
|
||||||
@@ -655,12 +655,12 @@ int set_sem_owner(sem_id id, proc_id proc)
|
|||||||
return B_NO_MORE_SEMS;
|
return B_NO_MORE_SEMS;
|
||||||
if (id < 0)
|
if (id < 0)
|
||||||
return B_BAD_SEM_ID;
|
return B_BAD_SEM_ID;
|
||||||
if (proc < 0)
|
if (team < 0)
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
|
|
||||||
// XXX: todo check if proc exists
|
// XXX: todo check if team exists
|
||||||
// if (proc_get_proc_struct(proc) == NULL)
|
// if (team_get_team_struct(team) == NULL)
|
||||||
// return B_BAD_SEM_ID; // proc_id doesn't exist right now
|
// return B_BAD_SEM_ID; // team_id doesn't exist right now
|
||||||
|
|
||||||
slot = id % MAX_SEMS;
|
slot = id % MAX_SEMS;
|
||||||
|
|
||||||
@@ -674,7 +674,7 @@ int set_sem_owner(sem_id id, proc_id proc)
|
|||||||
return B_BAD_SEM_ID;
|
return B_BAD_SEM_ID;
|
||||||
}
|
}
|
||||||
|
|
||||||
sems[slot].owner = proc;
|
sems[slot].owner = team;
|
||||||
|
|
||||||
RELEASE_SEM_LOCK(sems[slot]);
|
RELEASE_SEM_LOCK(sems[slot]);
|
||||||
restore_interrupts(state);
|
restore_interrupts(state);
|
||||||
@@ -749,8 +749,8 @@ static int remove_thread_from_sem(struct thread *t, struct sem_entry *sem, struc
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* this function cycles through the sem table, deleting all the sems that are owned by
|
/* this function cycles through the sem table, deleting all the sems that are owned by
|
||||||
the passed proc_id */
|
the passed team_id */
|
||||||
int sem_delete_owned_sems(proc_id owner)
|
int sem_delete_owned_sems(team_id owner)
|
||||||
{
|
{
|
||||||
int state;
|
int state;
|
||||||
int i;
|
int i;
|
||||||
@@ -797,10 +797,10 @@ sem_id user_create_sem(int count, const char *uname)
|
|||||||
return rc;
|
return rc;
|
||||||
name[SYS_MAX_OS_NAME_LEN-1] = 0;
|
name[SYS_MAX_OS_NAME_LEN-1] = 0;
|
||||||
|
|
||||||
return create_sem_etc(count, name, proc_get_current_proc_id());
|
return create_sem_etc(count, name, team_get_current_team_id());
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return create_sem_etc(count, NULL, proc_get_current_proc_id());
|
return create_sem_etc(count, NULL, team_get_current_team_id());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -862,7 +862,7 @@ int user_get_sem_info(sem_id uid, struct sem_info *uinfo, size_t sz)
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
int user_get_next_sem_info(proc_id uproc, uint32 *ucookie, struct sem_info *uinfo, size_t sz)
|
int user_get_next_sem_info(team_id uteam, uint32 *ucookie, struct sem_info *uinfo, size_t sz)
|
||||||
{
|
{
|
||||||
struct sem_info info;
|
struct sem_info info;
|
||||||
uint32 cookie;
|
uint32 cookie;
|
||||||
@@ -874,7 +874,7 @@ int user_get_next_sem_info(proc_id uproc, uint32 *ucookie, struct sem_info *uinf
|
|||||||
rc2 = user_memcpy(&cookie, ucookie, sizeof(uint32));
|
rc2 = user_memcpy(&cookie, ucookie, sizeof(uint32));
|
||||||
if (rc2 < 0)
|
if (rc2 < 0)
|
||||||
return rc2;
|
return rc2;
|
||||||
rc = _get_next_sem_info(uproc, &cookie, &info, sz);
|
rc = _get_next_sem_info(uteam, &cookie, &info, sz);
|
||||||
rc2 = user_memcpy(uinfo, &info, sz);
|
rc2 = user_memcpy(uinfo, &info, sz);
|
||||||
if (rc2 < 0)
|
if (rc2 < 0)
|
||||||
return rc2;
|
return rc2;
|
||||||
@@ -884,7 +884,7 @@ int user_get_next_sem_info(proc_id uproc, uint32 *ucookie, struct sem_info *uinf
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
int user_set_sem_owner(sem_id uid, proc_id uproc)
|
int user_set_sem_owner(sem_id uid, team_id uteam)
|
||||||
{
|
{
|
||||||
return set_sem_owner(uid, uproc);
|
return set_sem_owner(uid, uteam);
|
||||||
}
|
}
|
||||||
|
|||||||
+14
-14
@@ -157,14 +157,14 @@ int syscall_dispatcher(unsigned long call_num, void *arg_buffer, uint64 *call_re
|
|||||||
thread_exit((int)arg0);
|
thread_exit((int)arg0);
|
||||||
*call_ret = 0;
|
*call_ret = 0;
|
||||||
break;
|
break;
|
||||||
case SYSCALL_PROC_CREATE_PROC:
|
case SYSCALL_CREATE_TEAM:
|
||||||
*call_ret = user_proc_create_proc((const char *)arg0, (const char *)arg1, (char **)arg2, (int)arg3, (char **)arg4, (int)arg5, (int)arg6);
|
*call_ret = user_team_create_team((const char *)arg0, (const char *)arg1, (char **)arg2, (int)arg3, (char **)arg4, (int)arg5, (int)arg6);
|
||||||
break;
|
break;
|
||||||
case SYSCALL_THREAD_WAIT_ON_THREAD:
|
case SYSCALL_WAIT_ON_THREAD:
|
||||||
*call_ret = user_thread_wait_on_thread((thread_id)arg0, (int *)arg1);
|
*call_ret = user_thread_wait_on_thread((thread_id)arg0, (int *)arg1);
|
||||||
break;
|
break;
|
||||||
case SYSCALL_PROC_WAIT_ON_PROC:
|
case SYSCALL_WAIT_ON_TEAM:
|
||||||
*call_ret = user_proc_wait_on_proc((proc_id)arg0, (int *)arg1);
|
*call_ret = user_team_wait_on_team((team_id)arg0, (int *)arg1);
|
||||||
break;
|
break;
|
||||||
case SYSCALL_VM_CREATE_ANONYMOUS_REGION:
|
case SYSCALL_VM_CREATE_ANONYMOUS_REGION:
|
||||||
*call_ret = user_vm_create_anonymous_region(
|
*call_ret = user_vm_create_anonymous_region(
|
||||||
@@ -192,7 +192,7 @@ int syscall_dispatcher(unsigned long call_num, void *arg_buffer, uint64 *call_re
|
|||||||
*call_ret = user_vm_get_region_info((region_id)arg0, (vm_region_info *)arg1);
|
*call_ret = user_vm_get_region_info((region_id)arg0, (vm_region_info *)arg1);
|
||||||
break;
|
break;
|
||||||
case SYSCALL_SPAWN_THREAD:
|
case SYSCALL_SPAWN_THREAD:
|
||||||
*call_ret = user_thread_create_user_thread((addr)arg0, thread_get_current_thread()->proc->id,
|
*call_ret = user_thread_create_user_thread((addr)arg0, thread_get_current_thread()->team->id,
|
||||||
(const char*)arg1, (int)arg2, (void *)arg3);
|
(const char*)arg1, (int)arg2, (void *)arg3);
|
||||||
break;
|
break;
|
||||||
case SYSCALL_KILL_THREAD:
|
case SYSCALL_KILL_THREAD:
|
||||||
@@ -204,11 +204,11 @@ int syscall_dispatcher(unsigned long call_num, void *arg_buffer, uint64 *call_re
|
|||||||
case SYSCALL_RESUME_THREAD:
|
case SYSCALL_RESUME_THREAD:
|
||||||
*call_ret = thread_resume_thread((thread_id)arg0);
|
*call_ret = thread_resume_thread((thread_id)arg0);
|
||||||
break;
|
break;
|
||||||
case SYSCALL_PROC_KILL_PROC:
|
case SYSCALL_KILL_TEAM:
|
||||||
*call_ret = proc_kill_proc((proc_id)arg0);
|
*call_ret = team_kill_team((team_id)arg0);
|
||||||
break;
|
break;
|
||||||
case SYSCALL_GET_CURRENT_PROC_ID:
|
case SYSCALL_GET_CURRENT_TEAM_ID:
|
||||||
*call_ret = proc_get_current_proc_id();
|
*call_ret = team_get_current_team_id();
|
||||||
break;
|
break;
|
||||||
case SYSCALL_GETCWD:
|
case SYSCALL_GETCWD:
|
||||||
*call_ret = user_getcwd((char*)arg0, (size_t)arg1);
|
*call_ret = user_getcwd((char*)arg0, (size_t)arg1);
|
||||||
@@ -250,7 +250,7 @@ int syscall_dispatcher(unsigned long call_num, void *arg_buffer, uint64 *call_re
|
|||||||
*call_ret = user_read_port_etc((port_id)arg0, (int32*)arg1, (void*)arg2, (size_t)arg3, (uint32)arg4 | B_CAN_INTERRUPT, (bigtime_t)INT32TOINT64(arg5, arg6));
|
*call_ret = user_read_port_etc((port_id)arg0, (int32*)arg1, (void*)arg2, (size_t)arg3, (uint32)arg4 | B_CAN_INTERRUPT, (bigtime_t)INT32TOINT64(arg5, arg6));
|
||||||
break;
|
break;
|
||||||
case SYSCALL_PORT_SET_OWNER:
|
case SYSCALL_PORT_SET_OWNER:
|
||||||
*call_ret = user_set_port_owner((port_id)arg0, (proc_id)arg1);
|
*call_ret = user_set_port_owner((port_id)arg0, (team_id)arg1);
|
||||||
break;
|
break;
|
||||||
case SYSCALL_PORT_WRITE:
|
case SYSCALL_PORT_WRITE:
|
||||||
*call_ret = user_write_port_etc((port_id)arg0, (int32)arg1, (void *)arg2, (size_t)arg3, B_CAN_INTERRUPT, 0);
|
*call_ret = user_write_port_etc((port_id)arg0, (int32)arg1, (void *)arg2, (size_t)arg3, B_CAN_INTERRUPT, 0);
|
||||||
@@ -265,11 +265,11 @@ int syscall_dispatcher(unsigned long call_num, void *arg_buffer, uint64 *call_re
|
|||||||
*call_ret = user_get_sem_info((sem_id)arg0, (struct sem_info *)arg1, (size_t)arg2);
|
*call_ret = user_get_sem_info((sem_id)arg0, (struct sem_info *)arg1, (size_t)arg2);
|
||||||
break;
|
break;
|
||||||
case SYSCALL_SEM_GET_NEXT_SEM_INFO:
|
case SYSCALL_SEM_GET_NEXT_SEM_INFO:
|
||||||
*call_ret = user_get_next_sem_info((proc_id)arg0, (uint32 *)arg1, (struct sem_info *)arg2,
|
*call_ret = user_get_next_sem_info((team_id)arg0, (uint32 *)arg1, (struct sem_info *)arg2,
|
||||||
(size_t)arg3);
|
(size_t)arg3);
|
||||||
break;
|
break;
|
||||||
case SYSCALL_SEM_SET_SEM_OWNER:
|
case SYSCALL_SEM_SET_SEM_OWNER:
|
||||||
*call_ret = user_set_sem_owner((sem_id)arg0, (proc_id)arg1);
|
*call_ret = user_set_sem_owner((sem_id)arg0, (team_id)arg1);
|
||||||
break;
|
break;
|
||||||
case SYSCALL_FDDUP:
|
case SYSCALL_FDDUP:
|
||||||
*call_ret = user_dup(arg0);
|
*call_ret = user_dup(arg0);
|
||||||
@@ -278,7 +278,7 @@ int syscall_dispatcher(unsigned long call_num, void *arg_buffer, uint64 *call_re
|
|||||||
*call_ret = user_dup2(arg0, arg1);
|
*call_ret = user_dup2(arg0, arg1);
|
||||||
break;
|
break;
|
||||||
case SYSCALL_GET_PROC_TABLE:
|
case SYSCALL_GET_PROC_TABLE:
|
||||||
*call_ret = user_proc_get_table((struct proc_info *)arg0, (size_t)arg1);
|
*call_ret = user_team_get_table((struct team_info *)arg0, (size_t)arg1);
|
||||||
break;
|
break;
|
||||||
case SYSCALL_GETRLIMIT:
|
case SYSCALL_GETRLIMIT:
|
||||||
*call_ret = user_getrlimit((int)arg0, (struct rlimit *)arg1);
|
*call_ret = user_getrlimit((int)arg0, (struct rlimit *)arg1);
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ int sysctl(int *name, uint namelen, void *oldp, size_t *oldlenp,
|
|||||||
|
|
||||||
switch (name[0]) {
|
switch (name[0]) {
|
||||||
case CTL_KERN:
|
case CTL_KERN:
|
||||||
fn = kern_sysctl;
|
fn = sys_sysctl;
|
||||||
break;
|
break;
|
||||||
case CTL_HW:
|
case CTL_HW:
|
||||||
fn = hw_sysctl;
|
fn = hw_sysctl;
|
||||||
@@ -61,7 +61,7 @@ int sysctl(int *name, uint namelen, void *oldp, size_t *oldlenp,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int kern_sysctl(int *name, uint namelen, void *oldp, size_t *oldlenp,
|
int sys_sysctl(int *name, uint namelen, void *oldp, size_t *oldlenp,
|
||||||
void *newp, size_t newlen)
|
void *newp, size_t newlen)
|
||||||
{
|
{
|
||||||
int error = 0;
|
int error = 0;
|
||||||
|
|||||||
+197
-194
@@ -1,4 +1,4 @@
|
|||||||
/* Threading and process information */
|
/* Threading and team information */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Copyright 2001-2002, Travis Geiselbrecht. All rights reserved.
|
** Copyright 2001-2002, Travis Geiselbrecht. All rights reserved.
|
||||||
@@ -36,15 +36,15 @@
|
|||||||
#include <syscalls.h>
|
#include <syscalls.h>
|
||||||
|
|
||||||
|
|
||||||
struct proc_key {
|
struct team_key {
|
||||||
proc_id id;
|
team_id id;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct thread_key {
|
struct thread_key {
|
||||||
thread_id id;
|
thread_id id;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct proc_arg {
|
struct team_arg {
|
||||||
char *path;
|
char *path;
|
||||||
char **args;
|
char **args;
|
||||||
char **envp;
|
char **envp;
|
||||||
@@ -52,22 +52,22 @@ struct proc_arg {
|
|||||||
unsigned int envc;
|
unsigned int envc;
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct proc *create_proc_struct(const char *name, bool kernel);
|
static struct team *create_team_struct(const char *name, bool kernel);
|
||||||
static int proc_struct_compare(void *_p, const void *_key);
|
static int team_struct_compare(void *_p, const void *_key);
|
||||||
static unsigned int proc_struct_hash(void *_p, const void *_key, unsigned int range);
|
static unsigned int team_struct_hash(void *_p, const void *_key, unsigned int range);
|
||||||
|
|
||||||
// global
|
// global
|
||||||
spinlock_t thread_spinlock = 0;
|
spinlock_t thread_spinlock = 0;
|
||||||
|
|
||||||
// proc list
|
// team list
|
||||||
static void *proc_hash = NULL;
|
static void *team_hash = NULL;
|
||||||
static struct proc *kernel_proc = NULL;
|
static struct team *kernel_team = NULL;
|
||||||
static proc_id next_proc_id = 0;
|
static team_id next_team_id = 0;
|
||||||
static spinlock_t proc_spinlock = 0;
|
static spinlock_t team_spinlock = 0;
|
||||||
// NOTE: PROC lock can be held over a THREAD lock acquisition,
|
// NOTE: TEAM lock can be held over a THREAD lock acquisition,
|
||||||
// but not the other way (to avoid deadlock)
|
// but not the other way (to avoid deadlock)
|
||||||
#define GRAB_PROC_LOCK() acquire_spinlock(&proc_spinlock)
|
#define GRAB_TEAM_LOCK() acquire_spinlock(&team_spinlock)
|
||||||
#define RELEASE_PROC_LOCK() release_spinlock(&proc_spinlock)
|
#define RELEASE_TEAM_LOCK() release_spinlock(&team_spinlock)
|
||||||
|
|
||||||
// thread list
|
// thread list
|
||||||
static struct thread *idle_threads[MAX_BOOT_CPUS];
|
static struct thread *idle_threads[MAX_BOOT_CPUS];
|
||||||
@@ -95,9 +95,9 @@ static int _rand(void);
|
|||||||
static void thread_entry(void);
|
static void thread_entry(void);
|
||||||
static struct thread *thread_get_thread_struct_locked(thread_id id);
|
static struct thread *thread_get_thread_struct_locked(thread_id id);
|
||||||
/* XXX - not currently used, so commented out
|
/* XXX - not currently used, so commented out
|
||||||
static struct proc *proc_get_proc_struct(proc_id id);
|
static struct team *team_get_team_struct(team_id id);
|
||||||
*/
|
*/
|
||||||
static struct proc *proc_get_proc_struct_locked(proc_id id);
|
static struct team *team_get_team_struct_locked(team_id id);
|
||||||
static void thread_kthread_exit(void);
|
static void thread_kthread_exit(void);
|
||||||
static void deliver_signal(struct thread *t, int signal);
|
static void deliver_signal(struct thread *t, int signal);
|
||||||
|
|
||||||
@@ -176,28 +176,28 @@ struct thread *thread_dequeue_run_q(int priority)
|
|||||||
return thread_dequeue(&run_q[priority]);
|
return thread_dequeue(&run_q[priority]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void insert_thread_into_proc(struct proc *p, struct thread *t)
|
static void insert_thread_into_team(struct team *p, struct thread *t)
|
||||||
{
|
{
|
||||||
t->proc_next = p->thread_list;
|
t->team_next = p->thread_list;
|
||||||
p->thread_list = t;
|
p->thread_list = t;
|
||||||
p->num_threads++;
|
p->num_threads++;
|
||||||
if(p->num_threads == 1) {
|
if(p->num_threads == 1) {
|
||||||
// this was the first thread
|
// this was the first thread
|
||||||
p->main_thread = t;
|
p->main_thread = t;
|
||||||
}
|
}
|
||||||
t->proc = p;
|
t->team = p;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void remove_thread_from_proc(struct proc *p, struct thread *t)
|
static void remove_thread_from_team(struct team *p, struct thread *t)
|
||||||
{
|
{
|
||||||
struct thread *temp, *last = NULL;
|
struct thread *temp, *last = NULL;
|
||||||
|
|
||||||
for(temp = p->thread_list; temp != NULL; temp = temp->proc_next) {
|
for(temp = p->thread_list; temp != NULL; temp = temp->team_next) {
|
||||||
if(temp == t) {
|
if(temp == t) {
|
||||||
if(last == NULL) {
|
if(last == NULL) {
|
||||||
p->thread_list = temp->proc_next;
|
p->thread_list = temp->team_next;
|
||||||
} else {
|
} else {
|
||||||
last->proc_next = temp->proc_next;
|
last->team_next = temp->team_next;
|
||||||
}
|
}
|
||||||
p->num_threads--;
|
p->num_threads--;
|
||||||
break;
|
break;
|
||||||
@@ -322,7 +322,7 @@ static struct thread *create_thread_struct(const char *name)
|
|||||||
t->name[SYS_MAX_OS_NAME_LEN-1] = 0;
|
t->name[SYS_MAX_OS_NAME_LEN-1] = 0;
|
||||||
|
|
||||||
t->id = atomic_add(&next_thread_id, 1);
|
t->id = atomic_add(&next_thread_id, 1);
|
||||||
t->proc = NULL;
|
t->team = NULL;
|
||||||
t->cpu = NULL;
|
t->cpu = NULL;
|
||||||
t->sem_blocking = -1;
|
t->sem_blocking = -1;
|
||||||
t->fault_handler = 0;
|
t->fault_handler = 0;
|
||||||
@@ -330,7 +330,7 @@ static struct thread *create_thread_struct(const char *name)
|
|||||||
t->kernel_stack_base = 0;
|
t->kernel_stack_base = 0;
|
||||||
t->user_stack_region_id = -1;
|
t->user_stack_region_id = -1;
|
||||||
t->user_stack_base = 0;
|
t->user_stack_base = 0;
|
||||||
t->proc_next = NULL;
|
t->team_next = NULL;
|
||||||
t->q_next = NULL;
|
t->q_next = NULL;
|
||||||
t->priority = -1;
|
t->priority = -1;
|
||||||
t->args = NULL;
|
t->args = NULL;
|
||||||
@@ -397,11 +397,11 @@ static int _create_kernel_thread_kentry(void)
|
|||||||
return func(t->args);
|
return func(t->args);
|
||||||
}
|
}
|
||||||
|
|
||||||
static thread_id _create_thread(const char *name, proc_id pid, addr entry, void *args,
|
static thread_id _create_thread(const char *name, team_id pid, addr entry, void *args,
|
||||||
int priority, bool kernel)
|
int priority, bool kernel)
|
||||||
{
|
{
|
||||||
struct thread *t;
|
struct thread *t;
|
||||||
struct proc *p;
|
struct team *p;
|
||||||
int state;
|
int state;
|
||||||
char stack_name[64];
|
char stack_name[64];
|
||||||
bool abort = false;
|
bool abort = false;
|
||||||
@@ -421,15 +421,15 @@ static thread_id _create_thread(const char *name, proc_id pid, addr entry, void
|
|||||||
hash_insert(thread_hash, t);
|
hash_insert(thread_hash, t);
|
||||||
RELEASE_THREAD_LOCK();
|
RELEASE_THREAD_LOCK();
|
||||||
|
|
||||||
GRAB_PROC_LOCK();
|
GRAB_TEAM_LOCK();
|
||||||
// look at the proc, make sure it's not being deleted
|
// look at the team, make sure it's not being deleted
|
||||||
p = proc_get_proc_struct_locked(pid);
|
p = team_get_team_struct_locked(pid);
|
||||||
if(p != NULL && p->state != PROC_STATE_DEATH) {
|
if(p != NULL && p->state != TEAM_STATE_DEATH) {
|
||||||
insert_thread_into_proc(p, t);
|
insert_thread_into_team(p, t);
|
||||||
} else {
|
} else {
|
||||||
abort = true;
|
abort = true;
|
||||||
}
|
}
|
||||||
RELEASE_PROC_LOCK();
|
RELEASE_TEAM_LOCK();
|
||||||
if(abort) {
|
if(abort) {
|
||||||
GRAB_THREAD_LOCK();
|
GRAB_THREAD_LOCK();
|
||||||
hash_remove(thread_hash, t);
|
hash_remove(thread_hash, t);
|
||||||
@@ -485,7 +485,7 @@ static thread_id _create_thread(const char *name, proc_id pid, addr entry, void
|
|||||||
return t->id;
|
return t->id;
|
||||||
}
|
}
|
||||||
|
|
||||||
thread_id user_thread_create_user_thread(addr entry, proc_id pid, const char *uname, int priority,
|
thread_id user_thread_create_user_thread(addr entry, team_id pid, const char *uname, int priority,
|
||||||
void *args)
|
void *args)
|
||||||
{
|
{
|
||||||
char name[SYS_MAX_OS_NAME_LEN];
|
char name[SYS_MAX_OS_NAME_LEN];
|
||||||
@@ -504,17 +504,17 @@ thread_id user_thread_create_user_thread(addr entry, proc_id pid, const char *un
|
|||||||
return _create_thread(name, pid, entry, args, priority, false);
|
return _create_thread(name, pid, entry, args, priority, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
thread_id thread_create_user_thread(char *name, proc_id pid, addr entry, void *args)
|
thread_id thread_create_user_thread(char *name, team_id pid, addr entry, void *args)
|
||||||
{
|
{
|
||||||
return _create_thread(name, pid, entry, args, -1, false);
|
return _create_thread(name, pid, entry, args, -1, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
thread_id thread_create_kernel_thread(const char *name, int (*func)(void *), void *args)
|
thread_id thread_create_kernel_thread(const char *name, int (*func)(void *), void *args)
|
||||||
{
|
{
|
||||||
return _create_thread(name, proc_get_kernel_proc()->id, (addr)func, args, -1, true);
|
return _create_thread(name, team_get_kernel_team()->id, (addr)func, args, -1, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
static thread_id thread_create_kernel_thread_etc(const char *name, int (*func)(void *), void *args, struct proc *p)
|
static thread_id thread_create_kernel_thread_etc(const char *name, int (*func)(void *), void *args, struct team *p)
|
||||||
{
|
{
|
||||||
return _create_thread(name, p->id, (addr)func, args, -1, true);
|
return _create_thread(name, p->id, (addr)func, args, -1, true);
|
||||||
}
|
}
|
||||||
@@ -535,7 +535,7 @@ int thread_suspend_thread(thread_id id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (t != NULL) {
|
if (t != NULL) {
|
||||||
if (t->proc == kernel_proc) {
|
if (t->team == kernel_team) {
|
||||||
// no way
|
// no way
|
||||||
retval = EPERM;
|
retval = EPERM;
|
||||||
} else if (t->in_kernel == true) {
|
} else if (t->in_kernel == true) {
|
||||||
@@ -629,9 +629,9 @@ int thread_set_priority(thread_id id, int priority)
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _dump_proc_info(struct proc *p)
|
static void _dump_team_info(struct team *p)
|
||||||
{
|
{
|
||||||
dprintf("PROC: %p\n", p);
|
dprintf("TEAM: %p\n", p);
|
||||||
dprintf("id: 0x%x\n", p->id);
|
dprintf("id: 0x%x\n", p->id);
|
||||||
dprintf("name: '%s'\n", p->name);
|
dprintf("name: '%s'\n", p->name);
|
||||||
dprintf("next: %p\n", p->next);
|
dprintf("next: %p\n", p->next);
|
||||||
@@ -647,15 +647,15 @@ static void _dump_proc_info(struct proc *p)
|
|||||||
dprintf("thread_list: %p\n", p->thread_list);
|
dprintf("thread_list: %p\n", p->thread_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dump_proc_info(int argc, char **argv)
|
static int dump_team_info(int argc, char **argv)
|
||||||
{
|
{
|
||||||
struct proc *p;
|
struct team *p;
|
||||||
int id = -1;
|
int id = -1;
|
||||||
unsigned long num;
|
unsigned long num;
|
||||||
struct hash_iterator i;
|
struct hash_iterator i;
|
||||||
|
|
||||||
if(argc < 2) {
|
if(argc < 2) {
|
||||||
dprintf("proc: not enough arguments\n");
|
dprintf("team: not enough arguments\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -664,7 +664,7 @@ static int dump_proc_info(int argc, char **argv)
|
|||||||
num = atoul(argv[1]);
|
num = atoul(argv[1]);
|
||||||
if(num > vm_get_kernel_aspace()->virtual_map.base) {
|
if(num > vm_get_kernel_aspace()->virtual_map.base) {
|
||||||
// XXX semi-hack
|
// XXX semi-hack
|
||||||
_dump_proc_info((struct proc*)num);
|
_dump_team_info((struct team*)num);
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
id = num;
|
id = num;
|
||||||
@@ -672,14 +672,14 @@ static int dump_proc_info(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// walk through the thread list, trying to match name or id
|
// walk through the thread list, trying to match name or id
|
||||||
hash_open(proc_hash, &i);
|
hash_open(team_hash, &i);
|
||||||
while((p = hash_next(proc_hash, &i)) != NULL) {
|
while((p = hash_next(team_hash, &i)) != NULL) {
|
||||||
if((p->name && strcmp(argv[1], p->name) == 0) || p->id == id) {
|
if((p->name && strcmp(argv[1], p->name) == 0) || p->id == id) {
|
||||||
_dump_proc_info(p);
|
_dump_team_info(p);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
hash_close(proc_hash, &i, false);
|
hash_close(team_hash, &i, false);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -711,8 +711,8 @@ static void _dump_thread_info(struct thread *t)
|
|||||||
dprintf("THREAD: %p\n", t);
|
dprintf("THREAD: %p\n", t);
|
||||||
dprintf("id: 0x%x\n", t->id);
|
dprintf("id: 0x%x\n", t->id);
|
||||||
dprintf("name: '%s'\n", t->name);
|
dprintf("name: '%s'\n", t->name);
|
||||||
dprintf("all_next: %p\nproc_next: %p\nq_next: %p\n",
|
dprintf("all_next: %p\nteam_next: %p\nq_next: %p\n",
|
||||||
t->all_next, t->proc_next, t->q_next);
|
t->all_next, t->team_next, t->q_next);
|
||||||
dprintf("priority: 0x%x\n", t->priority);
|
dprintf("priority: 0x%x\n", t->priority);
|
||||||
dprintf("state: %s\n", state_to_text(t->state));
|
dprintf("state: %s\n", state_to_text(t->state));
|
||||||
dprintf("next_state: %s\n", state_to_text(t->next_state));
|
dprintf("next_state: %s\n", state_to_text(t->next_state));
|
||||||
@@ -731,7 +731,7 @@ static void _dump_thread_info(struct thread *t)
|
|||||||
dprintf("fault_handler: 0x%lx\n", t->fault_handler);
|
dprintf("fault_handler: 0x%lx\n", t->fault_handler);
|
||||||
dprintf("args: %p\n", t->args);
|
dprintf("args: %p\n", t->args);
|
||||||
dprintf("entry: 0x%lx\n", t->entry);
|
dprintf("entry: 0x%lx\n", t->entry);
|
||||||
dprintf("proc: %p\n", t->proc);
|
dprintf("team: %p\n", t->team);
|
||||||
dprintf("return_code_sem: 0x%x\n", t->return_code_sem);
|
dprintf("return_code_sem: 0x%x\n", t->return_code_sem);
|
||||||
dprintf("kernel_stack_region_id: 0x%x\n", t->kernel_stack_region_id);
|
dprintf("kernel_stack_region_id: 0x%x\n", t->kernel_stack_region_id);
|
||||||
dprintf("kernel_stack_base: 0x%lx\n", t->kernel_stack_base);
|
dprintf("kernel_stack_base: 0x%lx\n", t->kernel_stack_base);
|
||||||
@@ -841,7 +841,7 @@ static int dump_next_thread_in_all_list(int argc, char **argv)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dump_next_thread_in_proc(int argc, char **argv)
|
static int dump_next_thread_in_team(int argc, char **argv)
|
||||||
{
|
{
|
||||||
struct thread *t = last_thread_dumped;
|
struct thread *t = last_thread_dumped;
|
||||||
|
|
||||||
@@ -850,9 +850,9 @@ static int dump_next_thread_in_proc(int argc, char **argv)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
dprintf("next thread in proc after thread @ %p\n", t);
|
dprintf("next thread in team after thread @ %p\n", t);
|
||||||
if(t->proc_next != NULL) {
|
if(t->team_next != NULL) {
|
||||||
_dump_thread_info(t->proc_next);
|
_dump_thread_info(t->team_next);
|
||||||
} else {
|
} else {
|
||||||
dprintf("NULL\n");
|
dprintf("NULL\n");
|
||||||
}
|
}
|
||||||
@@ -924,24 +924,24 @@ int thread_init(kernel_args *ka)
|
|||||||
|
|
||||||
// dprintf("thread_init: entry\n");
|
// dprintf("thread_init: entry\n");
|
||||||
|
|
||||||
// create the process hash table
|
// create the team hash table
|
||||||
proc_hash = hash_init(15, (addr)&kernel_proc->next - (addr)kernel_proc,
|
team_hash = hash_init(15, (addr)&kernel_team->next - (addr)kernel_team,
|
||||||
&proc_struct_compare, &proc_struct_hash);
|
&team_struct_compare, &team_struct_hash);
|
||||||
|
|
||||||
// create the kernel process
|
// create the kernel team
|
||||||
kernel_proc = create_proc_struct("kernel_proc", true);
|
kernel_team = create_team_struct("kernel_team", true);
|
||||||
if(kernel_proc == NULL)
|
if(kernel_team == NULL)
|
||||||
panic("could not create kernel proc!\n");
|
panic("could not create kernel team!\n");
|
||||||
kernel_proc->state = PROC_STATE_NORMAL;
|
kernel_team->state = TEAM_STATE_NORMAL;
|
||||||
|
|
||||||
kernel_proc->ioctx = vfs_new_io_context(NULL);
|
kernel_team->ioctx = vfs_new_io_context(NULL);
|
||||||
if(kernel_proc->ioctx == NULL)
|
if(kernel_team->ioctx == NULL)
|
||||||
panic("could not create ioctx for kernel proc!\n");
|
panic("could not create ioctx for kernel team!\n");
|
||||||
|
|
||||||
//XXX should initialize kernel_proc->path here. Set it to "/"?
|
//XXX should initialize kernel_team->path here. Set it to "/"?
|
||||||
|
|
||||||
// stick it in the process hash
|
// stick it in the team hash
|
||||||
hash_insert(proc_hash, kernel_proc);
|
hash_insert(team_hash, kernel_team);
|
||||||
|
|
||||||
// create the thread hash table
|
// create the thread hash table
|
||||||
thread_hash = hash_init(15, (addr)&t->all_next - (addr)t,
|
thread_hash = hash_init(15, (addr)&t->all_next - (addr)t,
|
||||||
@@ -971,7 +971,7 @@ int thread_init(kernel_args *ka)
|
|||||||
panic("error creating idle thread struct\n");
|
panic("error creating idle thread struct\n");
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
}
|
}
|
||||||
t->proc = proc_get_kernel_proc();
|
t->team = team_get_kernel_team();
|
||||||
t->priority = THREAD_IDLE_PRIORITY;
|
t->priority = THREAD_IDLE_PRIORITY;
|
||||||
t->state = THREAD_STATE_RUNNING;
|
t->state = THREAD_STATE_RUNNING;
|
||||||
t->next_state = THREAD_STATE_READY;
|
t->next_state = THREAD_STATE_READY;
|
||||||
@@ -984,7 +984,7 @@ int thread_init(kernel_args *ka)
|
|||||||
t->kernel_stack_base = region->base;
|
t->kernel_stack_base = region->base;
|
||||||
vm_put_region(region);
|
vm_put_region(region);
|
||||||
hash_insert(thread_hash, t);
|
hash_insert(thread_hash, t);
|
||||||
insert_thread_into_proc(t->proc, t);
|
insert_thread_into_team(t->team, t);
|
||||||
idle_threads[i] = t;
|
idle_threads[i] = t;
|
||||||
if(i == 0)
|
if(i == 0)
|
||||||
arch_thread_set_current_thread(t);
|
arch_thread_set_current_thread(t);
|
||||||
@@ -1027,8 +1027,8 @@ int thread_init(kernel_args *ka)
|
|||||||
add_debugger_command("thread", &dump_thread_info, "list info about a particular thread");
|
add_debugger_command("thread", &dump_thread_info, "list info about a particular thread");
|
||||||
add_debugger_command("next_q", &dump_next_thread_in_q, "dump the next thread in the queue of last thread viewed");
|
add_debugger_command("next_q", &dump_next_thread_in_q, "dump the next thread in the queue of last thread viewed");
|
||||||
add_debugger_command("next_all", &dump_next_thread_in_all_list, "dump the next thread in the global list of the last thread viewed");
|
add_debugger_command("next_all", &dump_next_thread_in_all_list, "dump the next thread in the global list of the last thread viewed");
|
||||||
add_debugger_command("next_proc", &dump_next_thread_in_proc, "dump the next thread in the process of the last thread viewed");
|
add_debugger_command("next_team", &dump_next_thread_in_team, "dump the next thread in the team of the last thread viewed");
|
||||||
add_debugger_command("proc", &dump_proc_info, "list info about a particular process");
|
add_debugger_command("team", &dump_team_info, "list info about a particular team");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -1120,9 +1120,9 @@ static void thread_exit2(void *_args)
|
|||||||
|
|
||||||
// remove this thread from all of the global lists
|
// remove this thread from all of the global lists
|
||||||
disable_interrupts();
|
disable_interrupts();
|
||||||
GRAB_PROC_LOCK();
|
GRAB_TEAM_LOCK();
|
||||||
remove_thread_from_proc(kernel_proc, args.t);
|
remove_thread_from_team(kernel_team, args.t);
|
||||||
RELEASE_PROC_LOCK();
|
RELEASE_TEAM_LOCK();
|
||||||
GRAB_THREAD_LOCK();
|
GRAB_THREAD_LOCK();
|
||||||
hash_remove(thread_hash, args.t);
|
hash_remove(thread_hash, args.t);
|
||||||
RELEASE_THREAD_LOCK();
|
RELEASE_THREAD_LOCK();
|
||||||
@@ -1145,8 +1145,8 @@ void thread_exit(int retcode)
|
|||||||
{
|
{
|
||||||
int state;
|
int state;
|
||||||
struct thread *t = thread_get_current_thread();
|
struct thread *t = thread_get_current_thread();
|
||||||
struct proc *p = t->proc;
|
struct team *p = t->team;
|
||||||
bool delete_proc = false;
|
bool delete_team = false;
|
||||||
unsigned int death_stack;
|
unsigned int death_stack;
|
||||||
sem_id cached_death_sem;
|
sem_id cached_death_sem;
|
||||||
|
|
||||||
@@ -1162,22 +1162,22 @@ void thread_exit(int retcode)
|
|||||||
vm_delete_region(p->_aspace_id, rid);
|
vm_delete_region(p->_aspace_id, rid);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(p != kernel_proc) {
|
if(p != kernel_team) {
|
||||||
// remove this thread from the current process and add it to the kernel
|
// remove this thread from the current team and add it to the kernel
|
||||||
// put the thread into the kernel proc until it dies
|
// put the thread into the kernel team until it dies
|
||||||
state = disable_interrupts();
|
state = disable_interrupts();
|
||||||
GRAB_PROC_LOCK();
|
GRAB_TEAM_LOCK();
|
||||||
remove_thread_from_proc(p, t);
|
remove_thread_from_team(p, t);
|
||||||
insert_thread_into_proc(kernel_proc, t);
|
insert_thread_into_team(kernel_team, t);
|
||||||
if(p->main_thread == t) {
|
if(p->main_thread == t) {
|
||||||
// this was main thread in this process
|
// this was main thread in this team
|
||||||
delete_proc = true;
|
delete_team = true;
|
||||||
hash_remove(proc_hash, p);
|
hash_remove(team_hash, p);
|
||||||
p->state = PROC_STATE_DEATH;
|
p->state = TEAM_STATE_DEATH;
|
||||||
}
|
}
|
||||||
RELEASE_PROC_LOCK();
|
RELEASE_TEAM_LOCK();
|
||||||
// swap address spaces, to make sure we're running on the kernel's pgdir
|
// swap address spaces, to make sure we're running on the kernel's pgdir
|
||||||
vm_aspace_swap(kernel_proc->kaspace);
|
vm_aspace_swap(kernel_team->kaspace);
|
||||||
restore_interrupts(state);
|
restore_interrupts(state);
|
||||||
|
|
||||||
// dprintf("thread_exit: thread 0x%x now a kernel thread!\n", t->id);
|
// dprintf("thread_exit: thread 0x%x now a kernel thread!\n", t->id);
|
||||||
@@ -1185,10 +1185,10 @@ void thread_exit(int retcode)
|
|||||||
|
|
||||||
cached_death_sem = p->death_sem;
|
cached_death_sem = p->death_sem;
|
||||||
|
|
||||||
// delete the process
|
// delete the team
|
||||||
if(delete_proc) {
|
if(delete_team) {
|
||||||
if(p->num_threads > 0) {
|
if(p->num_threads > 0) {
|
||||||
// there are other threads still in this process,
|
// there are other threads still in this team,
|
||||||
// cycle through and signal kill on each of the threads
|
// cycle through and signal kill on each of the threads
|
||||||
// XXX this can be optimized. There's got to be a better solution.
|
// XXX this can be optimized. There's got to be a better solution.
|
||||||
struct thread *temp_thread;
|
struct thread *temp_thread;
|
||||||
@@ -1200,16 +1200,16 @@ void thread_exit(int retcode)
|
|||||||
panic("thread_exit: cannot init death sem for team %d\n", p->id);
|
panic("thread_exit: cannot init death sem for team %d\n", p->id);
|
||||||
|
|
||||||
state = disable_interrupts();
|
state = disable_interrupts();
|
||||||
GRAB_PROC_LOCK();
|
GRAB_TEAM_LOCK();
|
||||||
// we can safely walk the list because of the lock. no new threads can be created
|
// we can safely walk the list because of the lock. no new threads can be created
|
||||||
// because of the PROC_STATE_DEATH flag on the process
|
// because of the TEAM_STATE_DEATH flag on the team
|
||||||
temp_thread = p->thread_list;
|
temp_thread = p->thread_list;
|
||||||
while(temp_thread) {
|
while(temp_thread) {
|
||||||
struct thread *next = temp_thread->proc_next;
|
struct thread *next = temp_thread->team_next;
|
||||||
thread_kill_thread_nowait(temp_thread->id);
|
thread_kill_thread_nowait(temp_thread->id);
|
||||||
temp_thread = next;
|
temp_thread = next;
|
||||||
}
|
}
|
||||||
RELEASE_PROC_LOCK();
|
RELEASE_TEAM_LOCK();
|
||||||
restore_interrupts(state);
|
restore_interrupts(state);
|
||||||
#if 0
|
#if 0
|
||||||
// Now wait for all of the threads to die
|
// Now wait for all of the threads to die
|
||||||
@@ -1276,7 +1276,7 @@ static int _thread_kill_thread(thread_id id, bool wait_on)
|
|||||||
|
|
||||||
t = thread_get_thread_struct_locked(id);
|
t = thread_get_thread_struct_locked(id);
|
||||||
if(t != NULL) {
|
if(t != NULL) {
|
||||||
if(t->proc == kernel_proc) {
|
if(t->team == kernel_team) {
|
||||||
// can't touch this
|
// can't touch this
|
||||||
rc = EPERM;
|
rc = EPERM;
|
||||||
} else {
|
} else {
|
||||||
@@ -1373,7 +1373,7 @@ int thread_wait_on_thread(thread_id id, int *retcode)
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
int user_proc_wait_on_proc(proc_id id, int *uretcode)
|
int user_team_wait_on_team(team_id id, int *uretcode)
|
||||||
{
|
{
|
||||||
int retcode;
|
int retcode;
|
||||||
int rc, rc2;
|
int rc, rc2;
|
||||||
@@ -1381,7 +1381,7 @@ int user_proc_wait_on_proc(proc_id id, int *uretcode)
|
|||||||
if((addr)uretcode >= KERNEL_BASE && (addr)uretcode <= KERNEL_TOP)
|
if((addr)uretcode >= KERNEL_BASE && (addr)uretcode <= KERNEL_TOP)
|
||||||
return ERR_VM_BAD_USER_MEMORY;
|
return ERR_VM_BAD_USER_MEMORY;
|
||||||
|
|
||||||
rc = proc_wait_on_proc(id, &retcode);
|
rc = team_wait_on_team(id, &retcode);
|
||||||
if(rc < 0)
|
if(rc < 0)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
@@ -1392,21 +1392,21 @@ int user_proc_wait_on_proc(proc_id id, int *uretcode)
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
int proc_wait_on_proc(proc_id id, int *retcode)
|
int team_wait_on_team(team_id id, int *retcode)
|
||||||
{
|
{
|
||||||
struct proc *p;
|
struct team *p;
|
||||||
thread_id tid;
|
thread_id tid;
|
||||||
int state;
|
int state;
|
||||||
|
|
||||||
state = disable_interrupts();
|
state = disable_interrupts();
|
||||||
GRAB_PROC_LOCK();
|
GRAB_TEAM_LOCK();
|
||||||
p = proc_get_proc_struct_locked(id);
|
p = team_get_team_struct_locked(id);
|
||||||
if(p && p->main_thread) {
|
if(p && p->main_thread) {
|
||||||
tid = p->main_thread->id;
|
tid = p->main_thread->id;
|
||||||
} else {
|
} else {
|
||||||
tid = ERR_INVALID_HANDLE;
|
tid = ERR_INVALID_HANDLE;
|
||||||
}
|
}
|
||||||
RELEASE_PROC_LOCK();
|
RELEASE_TEAM_LOCK();
|
||||||
restore_interrupts(state);
|
restore_interrupts(state);
|
||||||
|
|
||||||
if(tid < 0)
|
if(tid < 0)
|
||||||
@@ -1441,30 +1441,30 @@ static struct thread *thread_get_thread_struct_locked(thread_id id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* XXX - static but unused
|
/* XXX - static but unused
|
||||||
static struct proc *proc_get_proc_struct(proc_id id)
|
static struct team *team_get_team_struct(team_id id)
|
||||||
{
|
{
|
||||||
struct proc *p;
|
struct team *p;
|
||||||
int state;
|
int state;
|
||||||
|
|
||||||
state = disable_interrupts();
|
state = disable_interrupts();
|
||||||
GRAB_PROC_LOCK();
|
GRAB_TEAM_LOCK();
|
||||||
|
|
||||||
p = proc_get_proc_struct_locked(id);
|
p = team_get_team_struct_locked(id);
|
||||||
|
|
||||||
RELEASE_PROC_LOCK();
|
RELEASE_TEAM_LOCK();
|
||||||
restore_interrupts(state);
|
restore_interrupts(state);
|
||||||
|
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static struct proc *proc_get_proc_struct_locked(proc_id id)
|
static struct team *team_get_team_struct_locked(team_id id)
|
||||||
{
|
{
|
||||||
struct proc_key key;
|
struct team_key key;
|
||||||
|
|
||||||
key.id = id;
|
key.id = id;
|
||||||
|
|
||||||
return hash_lookup(proc_hash, &key);
|
return hash_lookup(team_hash, &key);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void thread_context_switch(struct thread *t_from, struct thread *t_to)
|
static void thread_context_switch(struct thread *t_from, struct thread *t_to)
|
||||||
@@ -1602,19 +1602,19 @@ found_thread:
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static int proc_struct_compare(void *_p, const void *_key)
|
static int team_struct_compare(void *_p, const void *_key)
|
||||||
{
|
{
|
||||||
struct proc *p = _p;
|
struct team *p = _p;
|
||||||
const struct proc_key *key = _key;
|
const struct team_key *key = _key;
|
||||||
|
|
||||||
if(p->id == key->id) return 0;
|
if(p->id == key->id) return 0;
|
||||||
else return 1;
|
else return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int proc_struct_hash(void *_p, const void *_key, unsigned int range)
|
static unsigned int team_struct_hash(void *_p, const void *_key, unsigned int range)
|
||||||
{
|
{
|
||||||
struct proc *p = _p;
|
struct team *p = _p;
|
||||||
const struct proc_key *key = _key;
|
const struct team_key *key = _key;
|
||||||
|
|
||||||
if(p != NULL)
|
if(p != NULL)
|
||||||
return (p->id % range);
|
return (p->id % range);
|
||||||
@@ -1622,32 +1622,32 @@ static unsigned int proc_struct_hash(void *_p, const void *_key, unsigned int ra
|
|||||||
return (key->id % range);
|
return (key->id % range);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct proc *proc_get_kernel_proc(void)
|
struct team *team_get_kernel_team(void)
|
||||||
{
|
{
|
||||||
return kernel_proc;
|
return kernel_team;
|
||||||
}
|
}
|
||||||
|
|
||||||
proc_id proc_get_kernel_proc_id(void)
|
team_id team_get_kernel_team_id(void)
|
||||||
{
|
{
|
||||||
if(!kernel_proc)
|
if(!kernel_team)
|
||||||
return 0;
|
return 0;
|
||||||
else
|
else
|
||||||
return kernel_proc->id;
|
return kernel_team->id;
|
||||||
}
|
}
|
||||||
|
|
||||||
proc_id proc_get_current_proc_id(void)
|
team_id team_get_current_team_id(void)
|
||||||
{
|
{
|
||||||
return thread_get_current_thread()->proc->id;
|
return thread_get_current_thread()->team->id;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct proc *create_proc_struct(const char *name, bool kernel)
|
static struct team *create_team_struct(const char *name, bool kernel)
|
||||||
{
|
{
|
||||||
struct proc *p;
|
struct team *p;
|
||||||
|
|
||||||
p = (struct proc *)kmalloc(sizeof(struct proc));
|
p = (struct team *)kmalloc(sizeof(struct team));
|
||||||
if(p == NULL)
|
if(p == NULL)
|
||||||
goto error;
|
goto error;
|
||||||
p->id = atomic_add(&next_proc_id, 1);
|
p->id = atomic_add(&next_team_id, 1);
|
||||||
strncpy(&p->name[0], name, SYS_MAX_OS_NAME_LEN-1);
|
strncpy(&p->name[0], name, SYS_MAX_OS_NAME_LEN-1);
|
||||||
p->name[SYS_MAX_OS_NAME_LEN-1] = 0;
|
p->name[SYS_MAX_OS_NAME_LEN-1] = 0;
|
||||||
p->num_threads = 0;
|
p->num_threads = 0;
|
||||||
@@ -1659,12 +1659,12 @@ static struct proc *create_proc_struct(const char *name, bool kernel)
|
|||||||
vm_put_aspace(p->kaspace);
|
vm_put_aspace(p->kaspace);
|
||||||
p->thread_list = NULL;
|
p->thread_list = NULL;
|
||||||
p->main_thread = NULL;
|
p->main_thread = NULL;
|
||||||
p->state = PROC_STATE_BIRTH;
|
p->state = TEAM_STATE_BIRTH;
|
||||||
p->pending_signals = SIG_NONE;
|
p->pending_signals = SIG_NONE;
|
||||||
p->death_sem = -1;
|
p->death_sem = -1;
|
||||||
p->user_env_base = NULL;
|
p->user_env_base = NULL;
|
||||||
|
|
||||||
if(arch_proc_init_proc_struct(p, kernel) < 0)
|
if(arch_team_init_team_struct(p, kernel) < 0)
|
||||||
goto error1;
|
goto error1;
|
||||||
|
|
||||||
return p;
|
return p;
|
||||||
@@ -1675,7 +1675,7 @@ error:
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void delete_proc_struct(struct proc *p)
|
static void delete_team_struct(struct team *p)
|
||||||
{
|
{
|
||||||
kfree(p);
|
kfree(p);
|
||||||
}
|
}
|
||||||
@@ -1692,12 +1692,12 @@ static int get_arguments_data_size(char **args,int argc)
|
|||||||
return tot_size + sizeof(struct uspace_prog_args_t);
|
return tot_size + sizeof(struct uspace_prog_args_t);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int proc_create_proc2(void *args)
|
static int team_create_team2(void *args)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
struct thread *t;
|
struct thread *t;
|
||||||
struct proc *p;
|
struct team *p;
|
||||||
struct proc_arg *pargs = args;
|
struct team_arg *pargs = args;
|
||||||
char *path;
|
char *path;
|
||||||
addr entry;
|
addr entry;
|
||||||
char ustack_name[128];
|
char ustack_name[128];
|
||||||
@@ -1710,9 +1710,9 @@ static int proc_create_proc2(void *args)
|
|||||||
unsigned int env_cnt;
|
unsigned int env_cnt;
|
||||||
|
|
||||||
t = thread_get_current_thread();
|
t = thread_get_current_thread();
|
||||||
p = t->proc;
|
p = t->team;
|
||||||
|
|
||||||
dprintf("proc_create_proc2: entry thread %d\n", t->id);
|
dprintf("team_create_team2: entry thread %d\n", t->id);
|
||||||
|
|
||||||
// create an initial primary stack region
|
// create an initial primary stack region
|
||||||
|
|
||||||
@@ -1722,7 +1722,7 @@ static int proc_create_proc2(void *args)
|
|||||||
t->user_stack_region_id = vm_create_anonymous_region(p->_aspace_id, ustack_name, (void **)&t->user_stack_base,
|
t->user_stack_region_id = vm_create_anonymous_region(p->_aspace_id, ustack_name, (void **)&t->user_stack_base,
|
||||||
REGION_ADDR_EXACT_ADDRESS, tot_top_size, REGION_WIRING_LAZY, LOCK_RW);
|
REGION_ADDR_EXACT_ADDRESS, tot_top_size, REGION_WIRING_LAZY, LOCK_RW);
|
||||||
if(t->user_stack_region_id < 0) {
|
if(t->user_stack_region_id < 0) {
|
||||||
panic("proc_create_proc2: could not create default user stack region\n");
|
panic("team_create_team2: could not create default user stack region\n");
|
||||||
return t->user_stack_region_id;
|
return t->user_stack_region_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1741,7 +1741,7 @@ static int proc_create_proc2(void *args)
|
|||||||
p->user_env_base = t->user_stack_base + STACK_SIZE;
|
p->user_env_base = t->user_stack_base + STACK_SIZE;
|
||||||
uenv = (char **)p->user_env_base;
|
uenv = (char **)p->user_env_base;
|
||||||
udest = (char *)p->user_env_base + ENV_SIZE - 1;
|
udest = (char *)p->user_env_base + ENV_SIZE - 1;
|
||||||
// dprintf("proc_create_proc2: envc: %d, envp: 0x%p\n", pargs->envc, (void *)pargs->envp);
|
// dprintf("team_create_team2: envc: %d, envp: 0x%p\n", pargs->envc, (void *)pargs->envp);
|
||||||
for (env_cnt=0; env_cnt<pargs->envc; env_cnt++) {
|
for (env_cnt=0; env_cnt<pargs->envc; env_cnt++) {
|
||||||
udest -= (strlen(pargs->envp[env_cnt]) + 1);
|
udest -= (strlen(pargs->envp[env_cnt]) + 1);
|
||||||
uenv[env_cnt] = udest;
|
uenv[env_cnt] = udest;
|
||||||
@@ -1762,11 +1762,11 @@ static int proc_create_proc2(void *args)
|
|||||||
kfree_strings_array(pargs->envp, pargs->envc);
|
kfree_strings_array(pargs->envp, pargs->envc);
|
||||||
|
|
||||||
path = pargs->path;
|
path = pargs->path;
|
||||||
dprintf("proc_create_proc2: loading elf binary '%s'\n", path);
|
dprintf("team_create_team2: loading elf binary '%s'\n", path);
|
||||||
|
|
||||||
err = elf_load_uspace("/boot/libexec/rld.so", p, 0, &entry);
|
err = elf_load_uspace("/boot/libexec/rld.so", p, 0, &entry);
|
||||||
if(err < 0){
|
if(err < 0){
|
||||||
// XXX clean up proc
|
// XXX clean up team
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1774,9 +1774,9 @@ static int proc_create_proc2(void *args)
|
|||||||
kfree(pargs->path);
|
kfree(pargs->path);
|
||||||
kfree(pargs);
|
kfree(pargs);
|
||||||
|
|
||||||
dprintf("proc_create_proc2: loaded elf. entry = 0x%lx\n", entry);
|
dprintf("team_create_team2: loaded elf. entry = 0x%lx\n", entry);
|
||||||
|
|
||||||
p->state = PROC_STATE_NORMAL;
|
p->state = TEAM_STATE_NORMAL;
|
||||||
|
|
||||||
// jump to the entry point in user space
|
// jump to the entry point in user space
|
||||||
arch_thread_enter_uspace(entry, uspa, t->user_stack_base + STACK_SIZE);
|
arch_thread_enter_uspace(entry, uspa, t->user_stack_base + STACK_SIZE);
|
||||||
@@ -1785,32 +1785,32 @@ static int proc_create_proc2(void *args)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
proc_id proc_create_proc(const char *path, const char *name, char **args, int argc, char **envp, int envc, int priority)
|
team_id team_create_team(const char *path, const char *name, char **args, int argc, char **envp, int envc, int priority)
|
||||||
{
|
{
|
||||||
struct proc *p;
|
struct team *p;
|
||||||
thread_id tid;
|
thread_id tid;
|
||||||
proc_id pid;
|
team_id pid;
|
||||||
int err;
|
int err;
|
||||||
unsigned int state;
|
unsigned int state;
|
||||||
// int sem_retcode;
|
// int sem_retcode;
|
||||||
struct proc_arg *pargs;
|
struct team_arg *pargs;
|
||||||
|
|
||||||
dprintf("proc_create_proc: entry '%s', name '%s' args = %p argc = %d\n", path, name, args, argc);
|
dprintf("team_create_team: entry '%s', name '%s' args = %p argc = %d\n", path, name, args, argc);
|
||||||
|
|
||||||
p = create_proc_struct(name, false);
|
p = create_team_struct(name, false);
|
||||||
if(p == NULL)
|
if(p == NULL)
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
|
|
||||||
pid = p->id;
|
pid = p->id;
|
||||||
|
|
||||||
state = disable_interrupts();
|
state = disable_interrupts();
|
||||||
GRAB_PROC_LOCK();
|
GRAB_TEAM_LOCK();
|
||||||
hash_insert(proc_hash, p);
|
hash_insert(team_hash, p);
|
||||||
RELEASE_PROC_LOCK();
|
RELEASE_TEAM_LOCK();
|
||||||
restore_interrupts(state);
|
restore_interrupts(state);
|
||||||
|
|
||||||
// copy the args over
|
// copy the args over
|
||||||
pargs = (struct proc_arg *)kmalloc(sizeof(struct proc_arg));
|
pargs = (struct team_arg *)kmalloc(sizeof(struct team_arg));
|
||||||
if(pargs == NULL){
|
if(pargs == NULL){
|
||||||
err = ENOMEM;
|
err = ENOMEM;
|
||||||
goto err1;
|
goto err1;
|
||||||
@@ -1825,8 +1825,8 @@ proc_id proc_create_proc(const char *path, const char *name, char **args, int ar
|
|||||||
pargs->envp = envp;
|
pargs->envp = envp;
|
||||||
pargs->envc = envc;
|
pargs->envc = envc;
|
||||||
|
|
||||||
// create a new ioctx for this process
|
// create a new ioctx for this team
|
||||||
p->ioctx = vfs_new_io_context(thread_get_current_thread()->proc->ioctx);
|
p->ioctx = vfs_new_io_context(thread_get_current_thread()->team->ioctx);
|
||||||
if(!p->ioctx) {
|
if(!p->ioctx) {
|
||||||
err = ENOMEM;
|
err = ENOMEM;
|
||||||
goto err3;
|
goto err3;
|
||||||
@@ -1834,7 +1834,7 @@ proc_id proc_create_proc(const char *path, const char *name, char **args, int ar
|
|||||||
|
|
||||||
//XXX should set p->path to path(?) here.
|
//XXX should set p->path to path(?) here.
|
||||||
|
|
||||||
// create an address space for this process
|
// create an address space for this team
|
||||||
p->_aspace_id = vm_create_aspace(p->name, USER_BASE, USER_SIZE, false);
|
p->_aspace_id = vm_create_aspace(p->name, USER_BASE, USER_SIZE, false);
|
||||||
if (p->_aspace_id < 0) {
|
if (p->_aspace_id < 0) {
|
||||||
err = p->_aspace_id;
|
err = p->_aspace_id;
|
||||||
@@ -1842,8 +1842,8 @@ proc_id proc_create_proc(const char *path, const char *name, char **args, int ar
|
|||||||
}
|
}
|
||||||
p->aspace = vm_get_aspace_by_id(p->_aspace_id);
|
p->aspace = vm_get_aspace_by_id(p->_aspace_id);
|
||||||
|
|
||||||
// create a kernel thread, but under the context of the new process
|
// create a kernel thread, but under the context of the new team
|
||||||
tid = thread_create_kernel_thread_etc(name, proc_create_proc2, pargs, p);
|
tid = thread_create_kernel_thread_etc(name, team_create_team2, pargs, p);
|
||||||
if (tid < 0) {
|
if (tid < 0) {
|
||||||
err = tid;
|
err = tid;
|
||||||
goto err5;
|
goto err5;
|
||||||
@@ -1863,18 +1863,18 @@ err3:
|
|||||||
err2:
|
err2:
|
||||||
kfree(pargs);
|
kfree(pargs);
|
||||||
err1:
|
err1:
|
||||||
// remove the proc structure from the proc hash table and delete the proc structure
|
// remove the team structure from the team hash table and delete the team structure
|
||||||
state = disable_interrupts();
|
state = disable_interrupts();
|
||||||
GRAB_PROC_LOCK();
|
GRAB_TEAM_LOCK();
|
||||||
hash_remove(proc_hash, p);
|
hash_remove(team_hash, p);
|
||||||
RELEASE_PROC_LOCK();
|
RELEASE_TEAM_LOCK();
|
||||||
restore_interrupts(state);
|
restore_interrupts(state);
|
||||||
delete_proc_struct(p);
|
delete_team_struct(p);
|
||||||
//err:
|
//err:
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
proc_id user_proc_create_proc(const char *upath, const char *uname, char **args, int argc, char **envp, int envc, int priority)
|
team_id user_team_create_team(const char *upath, const char *uname, char **args, int argc, char **envp, int envc, int priority)
|
||||||
{
|
{
|
||||||
char path[SYS_MAX_PATH_LEN];
|
char path[SYS_MAX_PATH_LEN];
|
||||||
char name[SYS_MAX_OS_NAME_LEN];
|
char name[SYS_MAX_OS_NAME_LEN];
|
||||||
@@ -1882,7 +1882,7 @@ proc_id user_proc_create_proc(const char *upath, const char *uname, char **args,
|
|||||||
char **kenv;
|
char **kenv;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
dprintf("user_proc_create_proc : argc=%d \n",argc);
|
dprintf("user_team_create_team : argc=%d \n",argc);
|
||||||
|
|
||||||
if ((addr)upath >= KERNEL_BASE && (addr)upath <= KERNEL_TOP)
|
if ((addr)upath >= KERNEL_BASE && (addr)upath <= KERNEL_TOP)
|
||||||
return ERR_VM_BAD_USER_MEMORY;
|
return ERR_VM_BAD_USER_MEMORY;
|
||||||
@@ -1894,7 +1894,7 @@ proc_id user_proc_create_proc(const char *upath, const char *uname, char **args,
|
|||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
if (envp == NULL) {
|
if (envp == NULL) {
|
||||||
envp = (char **)thread_get_current_thread()->proc->user_env_base;
|
envp = (char **)thread_get_current_thread()->team->user_env_base;
|
||||||
for (envc = 0; envp && (envp[envc]); envc++);
|
for (envc = 0; envp && (envp[envc]); envc++);
|
||||||
}
|
}
|
||||||
rc = user_copy_strings_array(envp, envc, &kenv);
|
rc = user_copy_strings_array(envp, envc, &kenv);
|
||||||
@@ -1913,7 +1913,7 @@ proc_id user_proc_create_proc(const char *upath, const char *uname, char **args,
|
|||||||
|
|
||||||
name[SYS_MAX_OS_NAME_LEN-1] = 0;
|
name[SYS_MAX_OS_NAME_LEN-1] = 0;
|
||||||
|
|
||||||
return proc_create_proc(path, name, kargs, argc, kenv, envc, priority);
|
return team_create_team(path, name, kargs, argc, kenv, envc, priority);
|
||||||
error:
|
error:
|
||||||
kfree_strings_array(kargs, argc);
|
kfree_strings_array(kargs, argc);
|
||||||
kfree_strings_array(kenv, envc);
|
kfree_strings_array(kenv, envc);
|
||||||
@@ -1921,69 +1921,72 @@ error:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// used by PS command and anything else interested in a process list
|
// used by PS command and anything else interested in a team list
|
||||||
int user_proc_get_table(struct proc_info *pbuf, size_t len)
|
int user_team_get_table(team_info *pbuf, size_t len)
|
||||||
{
|
{
|
||||||
struct proc *p;
|
#if 0
|
||||||
|
struct team *p;
|
||||||
struct hash_iterator i;
|
struct hash_iterator i;
|
||||||
struct proc_info pi;
|
struct team_info pi;
|
||||||
int state;
|
int state;
|
||||||
int count=0;
|
int count=0;
|
||||||
int max = (len / sizeof(struct proc_info));
|
int max = (len / sizeof(struct team_info));
|
||||||
|
|
||||||
if((addr)pbuf >= KERNEL_BASE && (addr)pbuf <= KERNEL_TOP)
|
if((addr)pbuf >= KERNEL_BASE && (addr)pbuf <= KERNEL_TOP)
|
||||||
return ERR_VM_BAD_USER_MEMORY;
|
return ERR_VM_BAD_USER_MEMORY;
|
||||||
|
|
||||||
state = disable_interrupts();
|
state = disable_interrupts();
|
||||||
GRAB_PROC_LOCK();
|
GRAB_TEAM_LOCK();
|
||||||
|
|
||||||
hash_open(proc_hash, &i);
|
hash_open(team_hash, &i);
|
||||||
while(((p = hash_next(proc_hash, &i)) != NULL) && (count < max)) {
|
while(((p = hash_next(team_hash, &i)) != NULL) && (count < max)) {
|
||||||
pi.id = p->id;
|
pi.id = p->id;
|
||||||
strcpy(pi.name, p->name);
|
strcpy(pi.name, p->name);
|
||||||
pi.state = p->state;
|
pi.state = p->state;
|
||||||
pi.num_threads = p->num_threads;
|
pi.num_threads = p->num_threads;
|
||||||
count++;
|
count++;
|
||||||
user_memcpy(pbuf, &pi, sizeof(struct proc_info));
|
user_memcpy(pbuf, &pi, sizeof(struct team_info));
|
||||||
pbuf=pbuf + sizeof(struct proc_info);
|
pbuf=pbuf + sizeof(struct team_info);
|
||||||
}
|
}
|
||||||
hash_close(proc_hash, &i, false);
|
hash_close(team_hash, &i, false);
|
||||||
|
|
||||||
RELEASE_PROC_LOCK();
|
RELEASE_TEAM_LOCK();
|
||||||
restore_interrupts(state);
|
restore_interrupts(state);
|
||||||
|
|
||||||
if (count < max)
|
if (count < max)
|
||||||
return count;
|
return count;
|
||||||
else
|
else
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int proc_kill_proc(proc_id id)
|
int team_kill_team(team_id id)
|
||||||
{
|
{
|
||||||
int state;
|
int state;
|
||||||
struct proc *p;
|
struct team *p;
|
||||||
// struct thread *t;
|
// struct thread *t;
|
||||||
thread_id tid = -1;
|
thread_id tid = -1;
|
||||||
int retval = 0;
|
int retval = 0;
|
||||||
|
|
||||||
state = disable_interrupts();
|
state = disable_interrupts();
|
||||||
GRAB_PROC_LOCK();
|
GRAB_TEAM_LOCK();
|
||||||
|
|
||||||
p = proc_get_proc_struct_locked(id);
|
p = team_get_team_struct_locked(id);
|
||||||
if(p != NULL) {
|
if(p != NULL) {
|
||||||
tid = p->main_thread->id;
|
tid = p->main_thread->id;
|
||||||
} else {
|
} else {
|
||||||
retval = ERR_INVALID_HANDLE;
|
retval = ERR_INVALID_HANDLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
RELEASE_PROC_LOCK();
|
RELEASE_TEAM_LOCK();
|
||||||
restore_interrupts(state);
|
restore_interrupts(state);
|
||||||
if(retval < 0)
|
if(retval < 0)
|
||||||
return retval;
|
return retval;
|
||||||
|
|
||||||
// just kill the main thread in the process. The cleanup code there will
|
// just kill the main thread in the team. The cleanup code there will
|
||||||
// take care of the process
|
// take care of the team
|
||||||
return thread_kill_thread(tid);
|
return thread_kill_thread(tid);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2217,14 +2220,14 @@ int sys_setenv(const char *name, const char *value, int overwrite)
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
state = disable_interrupts();
|
state = disable_interrupts();
|
||||||
GRAB_PROC_LOCK();
|
GRAB_TEAM_LOCK();
|
||||||
|
|
||||||
strcpy(var, name);
|
strcpy(var, name);
|
||||||
strncat(var, "=", SYS_THREAD_STRING_LENGTH_MAX-1);
|
strncat(var, "=", SYS_THREAD_STRING_LENGTH_MAX-1);
|
||||||
name_size = strlen(var);
|
name_size = strlen(var);
|
||||||
strncat(var, value, SYS_THREAD_STRING_LENGTH_MAX-1);
|
strncat(var, value, SYS_THREAD_STRING_LENGTH_MAX-1);
|
||||||
|
|
||||||
env_space = (addr)thread_get_current_thread()->proc->user_env_base;
|
env_space = (addr)thread_get_current_thread()->team->user_env_base;
|
||||||
envp = (char **)env_space;
|
envp = (char **)env_space;
|
||||||
for (envc=0; envp[envc]; envc++) {
|
for (envc=0; envp[envc]; envc++) {
|
||||||
if (!strncmp(envp[envc], var, name_size)) {
|
if (!strncmp(envp[envc], var, name_size)) {
|
||||||
@@ -2273,7 +2276,7 @@ int sys_setenv(const char *name, const char *value, int overwrite)
|
|||||||
}
|
}
|
||||||
dprintf("sys_setenv: variable set.\n");
|
dprintf("sys_setenv: variable set.\n");
|
||||||
|
|
||||||
RELEASE_PROC_LOCK();
|
RELEASE_TEAM_LOCK();
|
||||||
restore_interrupts(state);
|
restore_interrupts(state);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
@@ -2317,9 +2320,9 @@ int sys_getenv(const char *name, char **value)
|
|||||||
int rc = -1;
|
int rc = -1;
|
||||||
|
|
||||||
state = disable_interrupts();
|
state = disable_interrupts();
|
||||||
GRAB_PROC_LOCK();
|
GRAB_TEAM_LOCK();
|
||||||
|
|
||||||
envp = (char **)thread_get_current_thread()->proc->user_env_base;
|
envp = (char **)thread_get_current_thread()->team->user_env_base;
|
||||||
for (i=0; envp[i]; i++) {
|
for (i=0; envp[i]; i++) {
|
||||||
if (!strncmp(envp[i], name, len)) {
|
if (!strncmp(envp[i], name, len)) {
|
||||||
p = envp[i] + len;
|
p = envp[i] + len;
|
||||||
@@ -2331,7 +2334,7 @@ int sys_getenv(const char *name, char **value)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
RELEASE_PROC_LOCK();
|
RELEASE_TEAM_LOCK();
|
||||||
restore_interrupts(state);
|
restore_interrupts(state);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
|
|||||||
@@ -1440,7 +1440,7 @@ aspace_id vm_get_current_user_aspace_id(void)
|
|||||||
struct thread *t = thread_get_current_thread();
|
struct thread *t = thread_get_current_thread();
|
||||||
|
|
||||||
if(t)
|
if(t)
|
||||||
return t->proc->_aspace_id;
|
return t->team->_aspace_id;
|
||||||
else
|
else
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -1813,8 +1813,8 @@ int vm_page_fault(addr address, addr fault_address, bool is_write, bool is_user,
|
|||||||
address, fault_address);
|
address, fault_address);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
dprintf("vm_page_fault: killing process 0x%x\n", thread_get_current_thread()->proc->id);
|
dprintf("vm_page_fault: killing team 0x%x\n", thread_get_current_thread()->team->id);
|
||||||
proc_kill_proc(thread_get_current_thread()->proc->id);
|
team_kill_team(thread_get_current_thread()->team->id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -102,27 +102,27 @@ status_t _get_port_info(port_id port, port_info *info, size_t size) { return sys
|
|||||||
|
|
||||||
// OK
|
// OK
|
||||||
sem_id create_sem(int32 count, const char *name)
|
sem_id create_sem(int32 count, const char *name)
|
||||||
{ return kern_create_sem(count,name); }
|
{ return sys_create_sem(count,name); }
|
||||||
|
|
||||||
// OK
|
// OK
|
||||||
status_t delete_sem(sem_id sem)
|
status_t delete_sem(sem_id sem)
|
||||||
{ return kern_delete_sem(sem); }
|
{ return sys_delete_sem(sem); }
|
||||||
|
|
||||||
// OK
|
// OK
|
||||||
status_t acquire_sem(sem_id sem)
|
status_t acquire_sem(sem_id sem)
|
||||||
{ return kern_acquire_sem(sem); }
|
{ return sys_acquire_sem(sem); }
|
||||||
|
|
||||||
// Have to modify flags ???
|
// Have to modify flags ???
|
||||||
int acquire_sem_etc(sem_id sem, int32 count, int32 flags, bigtime_t timeout)
|
int acquire_sem_etc(sem_id sem, int32 count, int32 flags, bigtime_t timeout)
|
||||||
{ return kern_acquire_sem_etc(sem, count, flags, timeout); }
|
{ return sys_acquire_sem_etc(sem, count, flags, timeout); }
|
||||||
|
|
||||||
// OK
|
// OK
|
||||||
status_t release_sem(sem_id sem)
|
status_t release_sem(sem_id sem)
|
||||||
{ return kern_release_sem(sem); }
|
{ return sys_release_sem(sem); }
|
||||||
|
|
||||||
// Have to modify flags ???
|
// Have to modify flags ???
|
||||||
status_t release_sem_etc(sem_id sem, int32 count, int32 flags)
|
status_t release_sem_etc(sem_id sem, int32 count, int32 flags)
|
||||||
{ return kern_release_sem_etc(sem, count, flags); }
|
{ return sys_release_sem_etc(sem, count, flags); }
|
||||||
|
|
||||||
// OK
|
// OK
|
||||||
status_t get_sem_count(sem_id sem, int32 *count)
|
status_t get_sem_count(sem_id sem, int32 *count)
|
||||||
@@ -134,32 +134,32 @@ status_t set_sem_owner(sem_id sem, team_id team)
|
|||||||
|
|
||||||
// OK
|
// OK
|
||||||
status_t _get_sem_info(sem_id sem, sem_info *info, size_t size)
|
status_t _get_sem_info(sem_id sem, sem_info *info, size_t size)
|
||||||
{ return kern_get_sem_info(sem,info, size); }
|
{ return sys_get_sem_info(sem,info, size); }
|
||||||
|
|
||||||
// OK
|
// OK
|
||||||
int _get_next_sem_info(proc_id team, uint32 *cookie, sem_info *info, size_t size)
|
int _get_next_sem_info(team_id team, uint32 *cookie, sem_info *info, size_t size)
|
||||||
{ return kern_get_next_sem_info(team,cookie,info, size); }
|
{ return sys_get_next_sem_info(team,cookie,info, size); }
|
||||||
|
|
||||||
// TO DO
|
// TO DO
|
||||||
bigtime_t set_alarm(bigtime_t when, uint32 flags);
|
bigtime_t set_alarm(bigtime_t when, uint32 flags);
|
||||||
|
|
||||||
// case SYSCALL_GET_CURRENT_THREAD_ID: *call_ret = thread_get_current_thread_id(); break;
|
// case SYSCALL_GET_CURRENT_THREAD_ID: *call_ret = thread_get_current_thread_id(); break;
|
||||||
// case SYSCALL_THREAD_CREATE_THREAD: *call_ret = user_thread_create_user_thread((char *)arg0, thread_get_current_thread()->proc->id, (addr)arg1, (void *)arg2); break;
|
// case SYSCALL_THREAD_CREATE_THREAD: *call_ret = user_thread_create_user_thread((char *)arg0, thread_get_current_thread()->team->id, (addr)arg1, (void *)arg2); break;
|
||||||
// case SYSCALL_PROC_CREATE_PROC: *call_ret = user_proc_create_proc((const char *)arg0, (const char *)arg1, (char **)arg2, (int )arg3, (int)arg4); break;
|
// case SYSCALL_PROC_CREATE_PROC: *call_ret = user_proc_create_proc((const char *)arg0, (const char *)arg1, (char **)arg2, (int )arg3, (int)arg4); break;
|
||||||
// case SYSCALL_GET_CURRENT_PROC_ID: *call_ret = proc_get_current_proc_id(); break;
|
// case SYSCALL_GET_CURRENT_PROC_ID: *call_ret = proc_get_current_proc_id(); break;
|
||||||
// case SYSCALL_PROC_WAIT_ON_PROC: *call_ret = user_proc_wait_on_proc((proc_id)arg0, (int *)arg1); break;
|
// case SYSCALL_PROC_WAIT_ON_PROC: *call_ret = user_proc_wait_on_proc((proc_id)arg0, (int *)arg1); break;
|
||||||
|
|
||||||
// OK
|
// OK
|
||||||
status_t kill_thread(thread_id thread)
|
status_t kill_thread(thread_id thread)
|
||||||
{ return kern_kill_thread(thread); }
|
{ return sys_kill_thread(thread); }
|
||||||
|
|
||||||
// OK
|
// OK
|
||||||
status_t resume_thread(thread_id thread)
|
status_t resume_thread(thread_id thread)
|
||||||
{ return kern_resume_thread(thread); }
|
{ return sys_resume_thread(thread); }
|
||||||
|
|
||||||
// OK
|
// OK
|
||||||
status_t suspend_thread(thread_id thread)
|
status_t suspend_thread(thread_id thread)
|
||||||
{ return kern_suspend_thread(thread); }
|
{ return sys_suspend_thread(thread); }
|
||||||
|
|
||||||
// TO DO
|
// TO DO
|
||||||
status_t rename_thread(thread_id thread, const char *new_name);
|
status_t rename_thread(thread_id thread, const char *new_name);
|
||||||
@@ -172,7 +172,7 @@ void exit_thread(status_t status)
|
|||||||
|
|
||||||
// OK
|
// OK
|
||||||
status_t wait_for_thread (thread_id thread, status_t *thread_return_value)
|
status_t wait_for_thread (thread_id thread, status_t *thread_return_value)
|
||||||
{ return sys_thread_wait_on_thread(thread,thread_return_value); }
|
{ return sys_wait_on_thread(thread,thread_return_value); }
|
||||||
|
|
||||||
// TO DO
|
// TO DO
|
||||||
status_t on_exit_thread(void (*callback)(void *), void *data);
|
status_t on_exit_thread(void (*callback)(void *), void *data);
|
||||||
@@ -202,7 +202,7 @@ status_t snooze_until(bigtime_t time, int timebase);
|
|||||||
|
|
||||||
// OK
|
// OK
|
||||||
status_t kill_team(team_id team)
|
status_t kill_team(team_id team)
|
||||||
{ return sys_proc_kill_proc(team); }
|
{ return sys_kill_team(team); }
|
||||||
|
|
||||||
// TO DO
|
// TO DO
|
||||||
status_t _get_team_info(team_id team, team_info *info, size_t size);
|
status_t _get_team_info(team_id team, team_info *info, size_t size);
|
||||||
|
|||||||
@@ -47,20 +47,6 @@ enum {
|
|||||||
#define B_SYSTEM_TIMEBASE (0)
|
#define B_SYSTEM_TIMEBASE (0)
|
||||||
#define B_SYSTEM_TEAM 2
|
#define B_SYSTEM_TEAM 2
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
team_id team;
|
|
||||||
int32 image_count;
|
|
||||||
int32 thread_count;
|
|
||||||
int32 area_count;
|
|
||||||
thread_id debugger_nub_thread;
|
|
||||||
port_id debugger_nub_port;
|
|
||||||
|
|
||||||
int32 argc; /* number of args on the command line */
|
|
||||||
char args[64]; /* abbreviated command line args */
|
|
||||||
uid_t uid;
|
|
||||||
gid_t gid;
|
|
||||||
} team_info;
|
|
||||||
|
|
||||||
#if __INTEL__
|
#if __INTEL__
|
||||||
#define B_MAX_CPU_COUNT 8
|
#define B_MAX_CPU_COUNT 8
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user