Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion so3/arch/arm32/context.S
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@
.global __exec_prologue_user

.globl __get_syscall_args_ext
.globl __get_syscall_arg

.global __mmu_switch_ttbr0
.global __exec
Expand Down
6 changes: 3 additions & 3 deletions so3/arch/arm32/thread.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,15 +46,15 @@ void arch_prepare_cpu_regs(tcb_t *tcb, clone_args_t *args)
BUG_ON(args->stack == 0);
arch_restart_user_thread(tcb, args->fn, args->stack);
} else {
/* Copy userspace registers */
*user_regs = *(cpu_regs_t *) arch_get_kernel_stack_frame(current());

/* Normal userspace that will copy userspace registers */
if (args->stack)
user_regs->sp_usr = args->stack;

if (args->flags & CLONE_SETTLS)
user_regs->tls_usr = args->tls;

/* Copy userspace registers */
*user_regs = *(cpu_regs_t *) arch_get_kernel_stack_frame(current());
}

tcb->cpu_regs.lr = (unsigned long) ret_from_fork;
Expand Down
1 change: 0 additions & 1 deletion so3/arch/arm64/context.S
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@
.global __exec_prologue_user

.globl __get_syscall_args_ext
.globl __get_syscall_arg

.global __mmu_switch
.global __exec
Expand Down
7 changes: 4 additions & 3 deletions so3/arch/arm64/exception.S
Original file line number Diff line number Diff line change
Expand Up @@ -495,13 +495,14 @@ __prepare_sig_handler:
ldr x1, [x0, #OFFSET_SYS_SIGNUM]
str x1, [sp, #OFFSET_X0]

// Set the handler to the PC
ldr x1, [x0, #OFFSET_SYS_SA]
ldr x2, [x1, #OFFSET_SA_HANDLER]
str x2, [sp, #OFFSET_X1]
str x2, [sp, #OFFSET_PC]

// Set the handler to the PC
// Set restorer to LR so the handler return to it.
ldr x2, [x1, #OFFSET_SA_RESTORER]
str x2, [sp, #OFFSET_PC]
str x2, [sp, #OFFSET_LR]

ret

Expand Down
6 changes: 3 additions & 3 deletions so3/arch/arm64/thread.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,15 +45,15 @@ void arch_prepare_cpu_regs(tcb_t *tcb, clone_args_t *args)
BUG_ON(args->stack == 0);
arch_restart_user_thread(tcb, args->fn, args->stack);
} else {
/* Copy userspace registers */
*user_regs = *(cpu_regs_t *) arch_get_kernel_stack_frame(current());

/* Normal userspace that will copy userspace registers */
if (args->stack)
user_regs->sp_usr = args->stack;

if (args->flags & CLONE_SETTLS)
user_regs->tls_usr = args->tls;

/* Copy userspace registers */
*user_regs = *(cpu_regs_t *) arch_get_kernel_stack_frame(current());
}

tcb->cpu_regs.lr = (unsigned long) ret_from_fork;
Expand Down
23 changes: 13 additions & 10 deletions so3/fs/vfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -467,7 +467,7 @@ static int do_write(int fd, const void *buffer, size_t count)
}

/* Low Level mmap */
static int do_mmap(int fd, addr_t virt_addr, uint32_t page_count, off_t offset)
static long do_mmap(int fd, addr_t virt_addr, uint32_t page_count, off_t offset)
{
int gfd;
struct file_operations *fops;
Expand Down Expand Up @@ -499,7 +499,7 @@ static int do_mmap(int fd, addr_t virt_addr, uint32_t page_count, off_t offset)
}

/* Low Level mmap - Anonymous case */
static int do_mmap_anon(int fd, addr_t virt_addr, uint32_t page_count, off_t offset)
static long do_mmap_anon(int fd, addr_t virt_addr, uint32_t page_count, off_t offset)
{
uint32_t page;
pcb_t *pcb;
Expand All @@ -526,7 +526,7 @@ static int do_mmap_anon(int fd, addr_t virt_addr, uint32_t page_count, off_t off

memset((void *) virt_addr, 0, page_count * PAGE_SIZE);

/* WARNIMG - This is a simple/basic way to set the start virtual address:
/* WARNING - This is a simple/basic way to set the start virtual address:
It only increment the start address after each mmap call, no algorithm
to search for available spaces.
*/
Expand Down Expand Up @@ -1045,15 +1045,18 @@ SYSCALL_DEFINE3(writev, unsigned long, fd, const struct iovec *, vec, unsigned l
int total = 0;

for (i = 0; i < vlen; i++) {
ret = do_write(fd, (const void *) vec[i].iov_base, vec[i].iov_len);
if (ret < 0) {
break;
} else if ((ret >= 0) && (ret < vec[i].iov_len)) {
/* Do nothing for empty buffer */
if (vec[i].iov_len != 0) {
ret = do_write(fd, (const void *) vec[i].iov_base, vec[i].iov_len);
if (ret < 0) {
break;
} else if ((ret >= 0) && (ret < vec[i].iov_len)) {
total += ret;
break;
}

total += ret;
break;
}

total += ret;
}

if (total == 0)
Expand Down
2 changes: 1 addition & 1 deletion so3/include/thread.h
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ tcb_t *user_thread(clone_args_t *args);
int thread_join(tcb_t *tcb);
void thread_exit(int exit_status);
void clean_thread(tcb_t *tcb);
SYSCALL_DECLARE(thread_yield, void);
SYSCALL_DECLARE(sched_yield, void);

void *thread_idle(void *dummy);

Expand Down
2 changes: 1 addition & 1 deletion so3/include/vfs.h
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@
#define DT_SOCK 12 /* Socket device */

/* mmap flags options */
#define MAP_ANONYMOUS 0x10 /* don't use a file */
#define MAP_ANONYMOUS 0x20 /* don't use a file */

/* Special value for dirfd used to indicate openat
should use the current working directory. */
Expand Down
12 changes: 6 additions & 6 deletions so3/kernel/futex.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,17 @@
* @param val expected value of the futex word
* @return 0 on success or error value
*/
static int do_futex_wait(uint32_t *futex_w, uint32_t val)
static int do_futex_wait(uint32_t *futex_w, uint32_t val, const struct timespec *utime)
{
unsigned long flags;
pcb_t *pcb = current()->pcb;
struct list_head *pos;
futex_t *futex;
queue_thread_t f_element;

if (utime)
printk("[futex] utime parameter is not used in current implementation\n");

flags = spin_lock_irqsave(&pcb->futex_lock);

if (*futex_w != val) {
Expand Down Expand Up @@ -116,7 +119,7 @@ static int do_futex_wake(uint32_t *futex_w, uint32_t nr_wake)
}

/* wakes at most nr_wake of the waiters that are waiting */
list_for_each_safe(pos, p, &futex->list) {
list_for_each_safe(pos, p, &futex->f_element) {
f_element = list_entry(pos, queue_thread_t, list);

if (idx == nr_wake)
Expand All @@ -138,12 +141,9 @@ SYSCALL_DEFINE6(futex, uint32_t *, uaddr, int, op, uint32_t, val, const struct t
{
int cmd = op & FUTEX_CMD_MASK;

if (utime)
printk("[futex] utime parameter is not used in current implementation\n");

switch (cmd) {
case FUTEX_WAIT:
return do_futex_wait(uaddr, val);
return do_futex_wait(uaddr, val, utime);
case FUTEX_WAKE:
return do_futex_wake(uaddr, val);
case FUTEX_FD:
Expand Down
17 changes: 10 additions & 7 deletions so3/kernel/process.c
Original file line number Diff line number Diff line change
Expand Up @@ -74,9 +74,9 @@ static uint32_t pid_current = 1;
static pcb_t *root_process = NULL; /* root process */

/* only the following sections are supported */
#define SUPPORTED_SECTION_COUNT 6
#define SUPPORTED_SECTION_COUNT 8
static const char *supported_section_names[SUPPORTED_SECTION_COUNT] = {
".text", ".rodata", ".data", ".sbss", ".bss", ".scommon",
".init", ".text", ".rodata", ".data", ".sbss", ".bss", ".scommon", ".fini",
};

/*
Expand Down Expand Up @@ -446,7 +446,7 @@ addr_t preserve_args_and_env(int argc, char **argv, char **envp)
/* Save env strings and count how many there are */
saved->envc = 0;
if (envp) {
do {
while (envp[saved->envc]) {
str_len = strlen(envp[saved->envc]) + 1;

/* Ensure the newly copied string will not exceed the buffer size. */
Expand All @@ -459,7 +459,9 @@ addr_t preserve_args_and_env(int argc, char **argv, char **envp)

strcpy(&saved->arg_env[saved->strings_size], envp[saved->envc]);
saved->strings_size += str_len;
} while (envp[saved->envc++]);

saved->envc++;
}
}

return (addr_t) saved;
Expand All @@ -477,11 +479,12 @@ void post_setup_image(args_env_t *args_env, elf_img_info_t *elf_img_info)
args_base = (char *) arch_get_args_base();

/* Save argc as first arguments */
*((int *) args_base) = args_env->argc;
*((long *) args_base) = args_env->argc;

/* Get the base address for the array of pointer for args, env and aux */
argv_p_base = (char **) (args_base + sizeof(int));
env_p_base = (char **) ((addr_t) argv_p_base + args_env->argc * sizeof(char *));
argv_p_base = (char **) (args_base + sizeof(long));
/* Add one to account for the null termination of env */
env_p_base = (char **) ((addr_t) argv_p_base + (args_env->argc + 1) * sizeof(char *));
/* Add one to account for the null termination of env */
aux_elf = (elf_addr_t *) ((addr_t) env_p_base + (args_env->envc + 1) * sizeof(char *));

Expand Down
5 changes: 2 additions & 3 deletions so3/kernel/syscalls.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,7 @@
#include <futex.h>
#include <syscall.h>

extern void __get_syscall_args_ext(uint32_t *syscall_no);
extern uint32_t __get_syscall_stack_arg(uint32_t nr);
extern void __get_syscall_args_ext(long *syscall_no);

extern void test_malloc(int test_no);

Expand All @@ -49,7 +48,7 @@ static const syscall_fn_t syscall_table[NR_SYSCALLS] = {

long syscall_handle(syscall_args_t *syscall_args)
{
uint32_t syscall_no;
long syscall_no;

/* Get addtional args of the syscall according to the ARM & SO3 ABI */
__get_syscall_args_ext(&syscall_no);
Expand Down
2 changes: 1 addition & 1 deletion so3/kernel/thread.c
Original file line number Diff line number Diff line change
Expand Up @@ -339,7 +339,7 @@ void *thread_idle(void *dummy)
/*
* Yield to another thread, i.e. simply invoke a call to schedule()
*/
SYSCALL_DEFINE0(thread_yield)
SYSCALL_DEFINE0(sched_yield)
{
schedule();
return 0;
Expand Down
8 changes: 4 additions & 4 deletions so3/kernel/timer.c
Original file line number Diff line number Diff line change
Expand Up @@ -436,8 +436,8 @@ SYSCALL_DEFINE2(gettimeofday, struct timeval *, ts, void *, tz)

time = NOW();

ts->tv_sec = time / (time_t) 1000000000;
ts->tv_usec = time / (time_t) 1000;
ts->tv_sec = time / SECONDS(1);
ts->tv_usec = (time % SECONDS(1)) / MICROSECS(1);

return 0;
}
Expand Down Expand Up @@ -475,8 +475,8 @@ SYSCALL_DEFINE2(clock_gettime, int, clk_id, struct timespec *, ts)

time = NOW();

ts->tv_sec = time / (time_t) 1000000000;
ts->tv_nsec = time;
ts->tv_sec = time / SECONDS(1);
ts->tv_nsec = time % SECONDS(1);

return 0;
}
3 changes: 2 additions & 1 deletion so3/syscall.tbl
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,11 @@ mmap
mmap2
nanosleep
futex
sched_yield
pipe IPC_PIPE
pipe2 IPC_PIPE
rt_sigaction IPC_SIGNAL
rt_kill IPC_SIGNAL
kill IPC_SIGNAL
sigreturn IPC_SIGNAL
rt_sigreturn IPC_SIGNAL
rt_sigprocmask IPC_SIGNAL
Expand Down
8 changes: 1 addition & 7 deletions usr/src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,14 @@ add_executable(sh.elf sh.c)
add_executable(ls.elf ls.c)
add_executable(more.elf more.c)
add_executable(time.elf time.c)
add_executable(thread_example.elf thread_example.c)
add_executable(ping.elf ping.c)
add_executable(mydev_test.elf mydev_test.c)
add_executable(lvgl_demo.elf lvgl_demo.c)
add_executable(lvgl_perf.elf lvgl_perf.c)
add_executable(lvgl_benchmark.elf lvgl_benchmark.c)
add_executable(logs_example.elf logs_example.c)

target_link_libraries(init.elf)
target_link_libraries(sh.elf)
target_link_libraries(ls.elf)
target_link_libraries(more.elf)
target_link_libraries(time.elf)
target_link_libraries(ping.elf)
target_link_libraries(mydev_test.elf)
target_link_libraries(lvgl_demo.elf slv lvgl lvgl_demos)
target_link_libraries(lvgl_perf.elf slv lvgl lvgl_demos)
target_link_libraries(lvgl_benchmark.elf slv lvgl lvgl_demos)
Expand Down
Loading