forked from xuos/xiuos
Support smp for imx6q-sabrelite.
This commit is contained in:
parent
620965dc2c
commit
0f5527d73a
|
@ -193,4 +193,6 @@ __attribute__((__always_inline__)) static inline void arch_set_return(struct tra
|
||||||
tf->r0 = (uint32_t)ret;
|
tf->r0 = (uint32_t)ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cpu_start_secondary(uint8_t cpu_id);
|
||||||
|
void start_smp_cache_broadcast(int cpu_id);
|
||||||
#endif
|
#endif
|
|
@ -1,3 +1,8 @@
|
||||||
SRC_FILES := ivt.c dcd.c imx6q_lowlevel_init.S cortexA9.S boot.S
|
SRC_FILES := ivt.c \
|
||||||
|
dcd.c \
|
||||||
|
boot.S \
|
||||||
|
imx6q_lowlevel_init.S \
|
||||||
|
cortexA9.S \
|
||||||
|
smp.c
|
||||||
|
|
||||||
include $(KERNEL_ROOT)/compiler.mk
|
include $(KERNEL_ROOT)/compiler.mk
|
|
@ -0,0 +1,81 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2012, Freescale Semiconductor, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* o Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
* of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* o Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer in the documentation and/or
|
||||||
|
* other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* o Neither the name of Freescale Semiconductor, Inc. nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
||||||
|
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||||
|
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file smp.c
|
||||||
|
* @brief start multicore
|
||||||
|
* @version 3.0
|
||||||
|
* @author AIIT XUOS Lab
|
||||||
|
* @date 2024.03.10
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*************************************************
|
||||||
|
File name: smp.c
|
||||||
|
Description:
|
||||||
|
Others:
|
||||||
|
History:
|
||||||
|
1. Date: 2024-03-10
|
||||||
|
Author: AIIT XUOS Lab
|
||||||
|
Modification:
|
||||||
|
1. No modifications
|
||||||
|
*************************************************/
|
||||||
|
#include "cortex_a9.h"
|
||||||
|
#include "regssrc.h"
|
||||||
|
|
||||||
|
extern void _boot_start();
|
||||||
|
void cpu_start_secondary(uint8_t cpu_id)
|
||||||
|
{
|
||||||
|
// Prepare pointers for ROM code. The entry point is always _start, which does some
|
||||||
|
// basic preparatory work and then calls the common_cpu_entry function, which itself
|
||||||
|
// calls the entry point saved in s_core_info.
|
||||||
|
switch (cpu_id) {
|
||||||
|
case 1:
|
||||||
|
HW_SRC_GPR3_WR((uint32_t)&_boot_start);
|
||||||
|
HW_SRC_SCR.B.CORE1_ENABLE = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
HW_SRC_GPR5_WR((uint32_t)&_boot_start);
|
||||||
|
HW_SRC_SCR.B.CORE2_ENABLE = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
HW_SRC_GPR7_WR((uint32_t)&_boot_start);
|
||||||
|
HW_SRC_SCR.B.CORE3_ENABLE = 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void start_smp_cache_broadcast(int cpu_id)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
|
@ -1,3 +1,3 @@
|
||||||
SRC_FILES := boot.S cpu_init.S xil-crt0.S cortexA9.S
|
SRC_FILES := boot.S cpu_init.S xil-crt0.S cortexA9.S smp.c
|
||||||
|
|
||||||
include $(KERNEL_ROOT)/compiler.mk
|
include $(KERNEL_ROOT)/compiler.mk
|
|
@ -0,0 +1,60 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2012, Freescale Semiconductor, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* o Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
* of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* o Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer in the documentation and/or
|
||||||
|
* other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* o Neither the name of Freescale Semiconductor, Inc. nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
||||||
|
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||||
|
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file smp.c
|
||||||
|
* @brief start multicore
|
||||||
|
* @version 3.0
|
||||||
|
* @author AIIT XUOS Lab
|
||||||
|
* @date 2024.03.10
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*************************************************
|
||||||
|
File name: smp.c
|
||||||
|
Description:
|
||||||
|
Others:
|
||||||
|
History:
|
||||||
|
1. Date: 2024-03-10
|
||||||
|
Author: AIIT XUOS Lab
|
||||||
|
Modification:
|
||||||
|
1. No modifications
|
||||||
|
*************************************************/
|
||||||
|
#include "cortex_a9.h"
|
||||||
|
|
||||||
|
extern void _boot_start();
|
||||||
|
void cpu_start_secondary(uint8_t cpu_id)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void start_smp_cache_broadcast(int cpu_id)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
|
@ -109,7 +109,7 @@ void dabort_handler(struct trapframe* r)
|
||||||
LOG("data abort at 0x%x, status 0x%x\n", dfa, dfs);
|
LOG("data abort at 0x%x, status 0x%x\n", dfa, dfs);
|
||||||
_abort_reason(dfs);
|
_abort_reason(dfs);
|
||||||
dump_tf(r);
|
dump_tf(r);
|
||||||
sys_exit();
|
sys_exit(cur_cpu()->task);
|
||||||
context_switch(&cur_cpu()->task->main_thread.context, cur_cpu()->scheduler);
|
context_switch(&cur_cpu()->task->main_thread.context, cur_cpu()->scheduler);
|
||||||
} else { // Exception occured in Kernel space: panic
|
} else { // Exception occured in Kernel space: panic
|
||||||
LOG("program counter: 0x%x caused\n", r->pc);
|
LOG("program counter: 0x%x caused\n", r->pc);
|
||||||
|
@ -136,7 +136,7 @@ void iabort_handler(struct trapframe* r)
|
||||||
LOG("prefetch abort at 0x%x, status 0x%x\n", ifa, ifs);
|
LOG("prefetch abort at 0x%x, status 0x%x\n", ifa, ifs);
|
||||||
_abort_reason(ifs);
|
_abort_reason(ifs);
|
||||||
dump_tf(r);
|
dump_tf(r);
|
||||||
sys_exit();
|
sys_exit(cur_cpu()->task);
|
||||||
context_switch(&cur_cpu()->task->main_thread.context, cur_cpu()->scheduler);
|
context_switch(&cur_cpu()->task->main_thread.context, cur_cpu()->scheduler);
|
||||||
} else { // Exception occured in Kernel space: panic
|
} else { // Exception occured in Kernel space: panic
|
||||||
LOG("program counter: 0x%x(%s) caused\n", r->pc, cur_cpu()->task);
|
LOG("program counter: 0x%x(%s) caused\n", r->pc, cur_cpu()->task);
|
||||||
|
|
|
@ -87,6 +87,8 @@ void handle_fiq(void)
|
||||||
|
|
||||||
static void _sys_irq_init(int cpu_id)
|
static void _sys_irq_init(int cpu_id)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
init_cpu_mode_stacks(cpu_id);
|
||||||
if (cpu_id == 0) {
|
if (cpu_id == 0) {
|
||||||
/* load exception vectors */
|
/* load exception vectors */
|
||||||
volatile uint32_t* vector_base = &_vector_start;
|
volatile uint32_t* vector_base = &_vector_start;
|
||||||
|
@ -101,8 +103,6 @@ static void _sys_irq_init(int cpu_id)
|
||||||
vector_base[7] = (uint32_t)handle_fiq; // FIQ
|
vector_base[7] = (uint32_t)handle_fiq; // FIQ
|
||||||
}
|
}
|
||||||
|
|
||||||
init_cpu_mode_stacks(cpu_id);
|
|
||||||
|
|
||||||
/* active hardware irq responser */
|
/* active hardware irq responser */
|
||||||
XScuGic_Config* gic_config = XScuGic_LookupConfig(XPAR_PS7_SCUGIC_0_DEVICE_ID);
|
XScuGic_Config* gic_config = XScuGic_LookupConfig(XPAR_PS7_SCUGIC_0_DEVICE_ID);
|
||||||
if (NULL == gic_config) {
|
if (NULL == gic_config) {
|
||||||
|
@ -244,7 +244,7 @@ static struct XiziTrapDriver xizi_trap_driver = {
|
||||||
|
|
||||||
struct XiziTrapDriver* hardkernel_intr_init(struct TraceTag* hardkernel_tag)
|
struct XiziTrapDriver* hardkernel_intr_init(struct TraceTag* hardkernel_tag)
|
||||||
{
|
{
|
||||||
xizi_trap_driver.sys_irq_init();
|
xizi_trap_driver.sys_irq_init(0);
|
||||||
xizi_trap_driver.cpu_irq_enable();
|
xizi_trap_driver.cpu_irq_enable();
|
||||||
return &xizi_trap_driver;
|
return &xizi_trap_driver;
|
||||||
}
|
}
|
|
@ -58,6 +58,11 @@ int yield()
|
||||||
return syscall(SYSCALL_YIELD, 0, 0, 0, 0);
|
return syscall(SYSCALL_YIELD, 0, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int kill(int pid)
|
||||||
|
{
|
||||||
|
return syscall(SYSCALL_KILL, (intptr_t)pid, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
int register_server(char* name)
|
int register_server(char* name)
|
||||||
{
|
{
|
||||||
return syscall(SYSCALL_SERVER, (intptr_t)name, 0, 0, 0);
|
return syscall(SYSCALL_SERVER, (intptr_t)name, 0, 0, 0);
|
||||||
|
|
|
@ -30,6 +30,8 @@
|
||||||
#define SYSCALL_EXEC 9 // run elf using current task
|
#define SYSCALL_EXEC 9 // run elf using current task
|
||||||
#define SYSCALL_SYS_STATE 10 // run system state
|
#define SYSCALL_SYS_STATE 10 // run system state
|
||||||
#define SYSCALL_REGISTER_IRQ 11 //
|
#define SYSCALL_REGISTER_IRQ 11 //
|
||||||
|
|
||||||
|
#define SYSCALL_KILL 12 // kill the task by id
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
@ -57,6 +59,7 @@ typedef int (*ipc_write_fn)(struct Session* session, int fd, char* src, int offs
|
||||||
int spawn(struct Session* session, int fd, ipc_read_fn ipc_read, ipc_fsize_fn ipc_fsize, char* name, char** argv);
|
int spawn(struct Session* session, int fd, ipc_read_fn ipc_read, ipc_fsize_fn ipc_fsize, char* name, char** argv);
|
||||||
int exit();
|
int exit();
|
||||||
int yield();
|
int yield();
|
||||||
|
int kill(int pid);
|
||||||
int register_server(char* name);
|
int register_server(char* name);
|
||||||
int session(char* path, int capacity, struct Session* user_session);
|
int session(char* path, int capacity, struct Session* user_session);
|
||||||
int poll_session(struct Session* userland_session_arr, int arr_capacity);
|
int poll_session(struct Session* userland_session_arr, int arr_capacity);
|
||||||
|
|
|
@ -58,6 +58,11 @@ int yield()
|
||||||
return syscall(SYSCALL_YIELD, 0, 0, 0, 0);
|
return syscall(SYSCALL_YIELD, 0, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int kill(int pid)
|
||||||
|
{
|
||||||
|
return syscall(SYSCALL_KILL, (intptr_t)pid, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
int register_server(char* name)
|
int register_server(char* name)
|
||||||
{
|
{
|
||||||
return syscall(SYSCALL_SERVER, (intptr_t)name, 0, 0, 0);
|
return syscall(SYSCALL_SERVER, (intptr_t)name, 0, 0, 0);
|
||||||
|
|
|
@ -30,6 +30,8 @@
|
||||||
#define SYSCALL_EXEC 9 // run elf using current task
|
#define SYSCALL_EXEC 9 // run elf using current task
|
||||||
#define SYSCALL_SYS_STATE 10 // run system state
|
#define SYSCALL_SYS_STATE 10 // run system state
|
||||||
#define SYSCALL_REGISTER_IRQ 11 //
|
#define SYSCALL_REGISTER_IRQ 11 //
|
||||||
|
|
||||||
|
#define SYSCALL_KILL 12 // kill the task by id
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
@ -57,6 +59,7 @@ typedef int (*ipc_write_fn)(struct Session* session, int fd, char* src, int offs
|
||||||
int spawn(struct Session* session, int fd, ipc_read_fn ipc_read, ipc_fsize_fn ipc_fsize, char* name, char** argv);
|
int spawn(struct Session* session, int fd, ipc_read_fn ipc_read, ipc_fsize_fn ipc_fsize, char* name, char** argv);
|
||||||
int exit();
|
int exit();
|
||||||
int yield();
|
int yield();
|
||||||
|
int kill(int pid);
|
||||||
int register_server(char* name);
|
int register_server(char* name);
|
||||||
int session(char* path, int capacity, struct Session* user_session);
|
int session(char* path, int capacity, struct Session* user_session);
|
||||||
int poll_session(struct Session* userland_session_arr, int arr_capacity);
|
int poll_session(struct Session* userland_session_arr, int arr_capacity);
|
||||||
|
|
|
@ -1725,6 +1725,11 @@ int shellRun(Shell* shell, const char* cmd)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void shellKill(int pid)
|
||||||
|
{
|
||||||
|
kill(pid);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief ls 打印当前路径下所有文件(文件系统调用)
|
* @brief ls 打印当前路径下所有文件(文件系统调用)
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -36,6 +36,7 @@ extern void shellMkdir(const char* path);
|
||||||
extern void shellRm(const char* path);
|
extern void shellRm(const char* path);
|
||||||
extern void shellCat(const char* path);
|
extern void shellCat(const char* path);
|
||||||
|
|
||||||
|
extern void shellKill(int pid);
|
||||||
extern void shellShowTasks();
|
extern void shellShowTasks();
|
||||||
extern void shellShowMemInfo();
|
extern void shellShowMemInfo();
|
||||||
extern void shellShowCpusInfo();
|
extern void shellShowCpusInfo();
|
||||||
|
@ -97,8 +98,11 @@ const ShellCommand shellCommandList[] = {
|
||||||
SHELL_CMD_ITEM(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC) | SHELL_CMD_DISABLE_RETURN,
|
SHELL_CMD_ITEM(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC) | SHELL_CMD_DISABLE_RETURN,
|
||||||
sh, SHELL_AGENCY_FUNC_NAME(shellRun), run command directly),
|
sh, SHELL_AGENCY_FUNC_NAME(shellRun), run command directly),
|
||||||
|
|
||||||
|
SHELL_CMD_ITEM(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC) | SHELL_CMD_DISABLE_RETURN,
|
||||||
|
kill, shellKill, kill task by id),
|
||||||
SHELL_CMD_ITEM(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC) | SHELL_CMD_DISABLE_RETURN,
|
SHELL_CMD_ITEM(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC) | SHELL_CMD_DISABLE_RETURN,
|
||||||
ls, shellLs, ls files),
|
ls, shellLs, ls files),
|
||||||
|
|
||||||
SHELL_CMD_ITEM(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC) | SHELL_CMD_DISABLE_RETURN,
|
SHELL_CMD_ITEM(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC) | SHELL_CMD_DISABLE_RETURN,
|
||||||
cd, shellCd, go to target path),
|
cd, shellCd, go to target path),
|
||||||
SHELL_CMD_ITEM(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC) | SHELL_CMD_DISABLE_RETURN,
|
SHELL_CMD_ITEM(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC) | SHELL_CMD_DISABLE_RETURN,
|
||||||
|
|
|
@ -44,6 +44,8 @@ Modification:
|
||||||
#define SYSCALL_EXEC 9 // run elf using current task
|
#define SYSCALL_EXEC 9 // run elf using current task
|
||||||
#define SYSCALL_SYS_STATE 10 // run system state
|
#define SYSCALL_SYS_STATE 10 // run system state
|
||||||
#define SYSCALL_REGISTER_IRQ 11 //
|
#define SYSCALL_REGISTER_IRQ 11 //
|
||||||
|
|
||||||
|
#define SYSCALL_KILL 12 // kill the task by id
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
#ifndef __ASSEMBLER__
|
#ifndef __ASSEMBLER__
|
||||||
|
@ -77,8 +79,9 @@ typedef int (*ipc_write_fn)(struct Session* session, int fd, char* src, int offs
|
||||||
int syscall(int sys_num, uintptr_t param1, uintptr_t param2, uintptr_t param3, uintptr_t param4);
|
int syscall(int sys_num, uintptr_t param1, uintptr_t param2, uintptr_t param3, uintptr_t param4);
|
||||||
|
|
||||||
int sys_spawn(char* img_start, char* name, char** argv);
|
int sys_spawn(char* img_start, char* name, char** argv);
|
||||||
int sys_exit();
|
int sys_exit(struct TaskMicroDescriptor* ptask);
|
||||||
int sys_yield();
|
int sys_yield();
|
||||||
|
int sys_kill(int id);
|
||||||
|
|
||||||
int sys_register_as_server(char* name);
|
int sys_register_as_server(char* name);
|
||||||
int sys_connect_session(char* path, int capacity, struct Session* user_session);
|
int sys_connect_session(char* path, int capacity, struct Session* user_session);
|
||||||
|
|
|
@ -28,8 +28,6 @@ Modification:
|
||||||
1. first version
|
1. first version
|
||||||
*************************************************/
|
*************************************************/
|
||||||
/// @todo use hardkernel
|
/// @todo use hardkernel
|
||||||
#include "cortex_a9.h"
|
|
||||||
#include "regssrc.h"
|
|
||||||
|
|
||||||
#include "kern_init.h"
|
#include "kern_init.h"
|
||||||
#include "multicores.h"
|
#include "multicores.h"
|
||||||
|
@ -37,37 +35,9 @@ Modification:
|
||||||
#include "assert.h"
|
#include "assert.h"
|
||||||
#include "task.h"
|
#include "task.h"
|
||||||
|
|
||||||
#include "cache_common_ope.h"
|
|
||||||
|
|
||||||
extern uint32_t _binary_init_start[], _binary_default_fs_start[];
|
extern uint32_t _binary_init_start[], _binary_default_fs_start[];
|
||||||
static struct TraceTag hardkernel_tag, softkernel_tag;
|
static struct TraceTag hardkernel_tag, softkernel_tag;
|
||||||
|
|
||||||
extern void _boot_start();
|
|
||||||
void cpu_start_secondary(uint8_t coreNumber)
|
|
||||||
{
|
|
||||||
// Prepare pointers for ROM code. The entry point is always _start, which does some
|
|
||||||
// basic preparatory work and then calls the common_cpu_entry function, which itself
|
|
||||||
// calls the entry point saved in s_core_info.
|
|
||||||
switch (coreNumber) {
|
|
||||||
case 1:
|
|
||||||
HW_SRC_GPR3_WR((uint32_t)&_boot_start);
|
|
||||||
HW_SRC_SCR.B.CORE1_ENABLE = 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 2:
|
|
||||||
HW_SRC_GPR5_WR((uint32_t)&_boot_start);
|
|
||||||
HW_SRC_SCR.B.CORE2_ENABLE = 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 3:
|
|
||||||
HW_SRC_GPR7_WR((uint32_t)&_boot_start);
|
|
||||||
HW_SRC_SCR.B.CORE3_ENABLE = 1;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int core_init_done = 0;
|
static int core_init_done = 0;
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
|
@ -126,6 +96,7 @@ int main(void)
|
||||||
|
|
||||||
while (core_init_done != (1 << NR_CPU) - 1)
|
while (core_init_done != (1 << NR_CPU) - 1)
|
||||||
;
|
;
|
||||||
|
start_smp_cache_broadcast(cpu_id);
|
||||||
xizi_task_manager.task_scheduler(scheduler_rights);
|
xizi_task_manager.task_scheduler(scheduler_rights);
|
||||||
|
|
||||||
// never reached
|
// never reached
|
||||||
|
|
|
@ -9,6 +9,7 @@ SRC_FILES := syscall.c \
|
||||||
sys_register_irq.c \
|
sys_register_irq.c \
|
||||||
sys_exit.c \
|
sys_exit.c \
|
||||||
sys_state.c \
|
sys_state.c \
|
||||||
sys_mmap.c
|
sys_mmap.c \
|
||||||
|
sys_kill.c
|
||||||
|
|
||||||
include $(KERNEL_ROOT)/compiler.mk
|
include $(KERNEL_ROOT)/compiler.mk
|
||||||
|
|
|
@ -36,20 +36,18 @@ Modification:
|
||||||
#include "syscall.h"
|
#include "syscall.h"
|
||||||
#include "task.h"
|
#include "task.h"
|
||||||
|
|
||||||
int sys_exit()
|
int sys_exit(struct TaskMicroDescriptor* ptask)
|
||||||
{
|
{
|
||||||
|
assert(ptask != NULL);
|
||||||
struct TaskMicroDescriptor* cur_task = cur_cpu()->task;
|
|
||||||
assert(cur_task != NULL);
|
|
||||||
|
|
||||||
/* handle sessions for condition 1, ref. delete_share_pages() */
|
/* handle sessions for condition 1, ref. delete_share_pages() */
|
||||||
// close all server_sessions
|
// close all server_sessions
|
||||||
struct server_session* server_session = NULL;
|
struct server_session* server_session = NULL;
|
||||||
while (!IS_DOUBLE_LIST_EMPTY(&cur_task->svr_sess_listhead)) {
|
while (!IS_DOUBLE_LIST_EMPTY(&ptask->svr_sess_listhead)) {
|
||||||
server_session = CONTAINER_OF(cur_task->svr_sess_listhead.next, struct server_session, node);
|
server_session = CONTAINER_OF(ptask->svr_sess_listhead.next, struct server_session, node);
|
||||||
// cut the connection from task to session
|
// cut the connection from task to session
|
||||||
if (!server_session->closed) {
|
if (!server_session->closed) {
|
||||||
xizi_share_page_manager.unmap_task_share_pages(cur_task, server_session->buf_addr, CLIENT_SESSION_BACKEND(server_session)->nr_pages);
|
xizi_share_page_manager.unmap_task_share_pages(ptask, server_session->buf_addr, CLIENT_SESSION_BACKEND(server_session)->nr_pages);
|
||||||
server_session->closed = true;
|
server_session->closed = true;
|
||||||
}
|
}
|
||||||
doubleListDel(&server_session->node);
|
doubleListDel(&server_session->node);
|
||||||
|
@ -61,11 +59,11 @@ int sys_exit()
|
||||||
}
|
}
|
||||||
// close all client_sessions
|
// close all client_sessions
|
||||||
struct client_session* client_session = NULL;
|
struct client_session* client_session = NULL;
|
||||||
while (!IS_DOUBLE_LIST_EMPTY(&cur_task->cli_sess_listhead)) {
|
while (!IS_DOUBLE_LIST_EMPTY(&ptask->cli_sess_listhead)) {
|
||||||
client_session = CONTAINER_OF(cur_task->cli_sess_listhead.next, struct client_session, node);
|
client_session = CONTAINER_OF(ptask->cli_sess_listhead.next, struct client_session, node);
|
||||||
// cut the connection from task to session
|
// cut the connection from task to session
|
||||||
if (!client_session->closed) {
|
if (!client_session->closed) {
|
||||||
xizi_share_page_manager.unmap_task_share_pages(cur_task, client_session->buf_addr, CLIENT_SESSION_BACKEND(client_session)->nr_pages);
|
xizi_share_page_manager.unmap_task_share_pages(ptask, client_session->buf_addr, CLIENT_SESSION_BACKEND(client_session)->nr_pages);
|
||||||
client_session->closed = true;
|
client_session->closed = true;
|
||||||
}
|
}
|
||||||
doubleListDel(&client_session->node);
|
doubleListDel(&client_session->node);
|
||||||
|
@ -76,16 +74,16 @@ int sys_exit()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cur_task->server_identifier.meta != NULL) {
|
if (ptask->server_identifier.meta != NULL) {
|
||||||
struct TraceTag server_identifier_owner;
|
struct TraceTag server_identifier_owner;
|
||||||
AchieveResourceTag(&server_identifier_owner, RequireRootTag(), "softkernel/server-identifier");
|
AchieveResourceTag(&server_identifier_owner, RequireRootTag(), "softkernel/server-identifier");
|
||||||
assert(server_identifier_owner.meta != NULL);
|
assert(server_identifier_owner.meta != NULL);
|
||||||
DeleteResource(&cur_task->server_identifier, &server_identifier_owner);
|
DeleteResource(&ptask->server_identifier, &server_identifier_owner);
|
||||||
}
|
}
|
||||||
|
|
||||||
// delete task for pcb_list
|
// delete task for pcb_list
|
||||||
xizi_task_manager.cur_task_yield_noschedule();
|
xizi_task_manager.cur_task_yield_noschedule();
|
||||||
cur_task->state = DEAD;
|
ptask->state = DEAD;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
|
@ -0,0 +1,50 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2020 AIIT XUOS Lab
|
||||||
|
* XiUOS is licensed under Mulan PSL v2.
|
||||||
|
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||||
|
* You may obtain a copy of Mulan PSL v2 at:
|
||||||
|
* http://license.coscl.org.cn/MulanPSL2
|
||||||
|
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||||
|
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||||
|
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||||
|
* See the Mulan PSL v2 for more details.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @file sys_kill.c
|
||||||
|
* @brief task exit syscall
|
||||||
|
* @version 3.0
|
||||||
|
* @author AIIT XUOS Lab
|
||||||
|
* @date 2024.03.19
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*************************************************
|
||||||
|
File name: sys_kill.c
|
||||||
|
Description: task kill syscall
|
||||||
|
Others:
|
||||||
|
History:
|
||||||
|
1. Date: 2023-03-19
|
||||||
|
Author: AIIT XUOS Lab
|
||||||
|
Modification:
|
||||||
|
1. first version
|
||||||
|
*************************************************/
|
||||||
|
#include "trap_common.h"
|
||||||
|
|
||||||
|
#include "task.h"
|
||||||
|
|
||||||
|
extern int sys_exit(struct TaskMicroDescriptor* task);
|
||||||
|
int sys_kill(int id)
|
||||||
|
{
|
||||||
|
struct TaskMicroDescriptor* task = NULL;
|
||||||
|
|
||||||
|
for (int prio = 0; prio < TASK_MAX_PRIORITY; prio++) {
|
||||||
|
DOUBLE_LIST_FOR_EACH_ENTRY(task, &xizi_task_manager.task_list_head[prio], node)
|
||||||
|
{
|
||||||
|
if (task->pid == id) {
|
||||||
|
sys_exit(task);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
|
@ -28,6 +28,7 @@ Modification:
|
||||||
1. first version
|
1. first version
|
||||||
*************************************************/
|
*************************************************/
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
#include "multicores.h"
|
||||||
#include "trap_common.h"
|
#include "trap_common.h"
|
||||||
|
|
||||||
#include "syscall.h"
|
#include "syscall.h"
|
||||||
|
@ -44,7 +45,7 @@ int syscall(int sys_num, uintptr_t param1, uintptr_t param2, uintptr_t param3, u
|
||||||
ret = sys_spawn((char*)param1, (char*)param2, (char**)param3);
|
ret = sys_spawn((char*)param1, (char*)param2, (char**)param3);
|
||||||
break;
|
break;
|
||||||
case SYSCALL_EXIT:
|
case SYSCALL_EXIT:
|
||||||
ret = sys_exit();
|
ret = sys_exit(cur_cpu()->task);
|
||||||
break;
|
break;
|
||||||
case SYSCALL_YIELD:
|
case SYSCALL_YIELD:
|
||||||
ret = sys_yield();
|
ret = sys_yield();
|
||||||
|
@ -73,6 +74,9 @@ int syscall(int sys_num, uintptr_t param1, uintptr_t param2, uintptr_t param3, u
|
||||||
case SYSCALL_REGISTER_IRQ:
|
case SYSCALL_REGISTER_IRQ:
|
||||||
ret = sys_register_irq((int)param1, (int)param2);
|
ret = sys_register_irq((int)param1, (int)param2);
|
||||||
break;
|
break;
|
||||||
|
case SYSCALL_KILL:
|
||||||
|
ret = sys_kill((int)param1);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
ERROR("Unsurport syscall(%d) right now\n", sys_num);
|
ERROR("Unsurport syscall(%d) right now\n", sys_num);
|
||||||
|
|
|
@ -88,7 +88,8 @@ void intr_irq_dispatch(struct trapframe* tf)
|
||||||
p_intr_driver->curr_int[cpu] = 0;
|
p_intr_driver->curr_int[cpu] = 0;
|
||||||
p_intr_driver->hw_after_irq(int_info);
|
p_intr_driver->hw_after_irq(int_info);
|
||||||
|
|
||||||
if (UNLIKELY(cur_cpu()->task == NULL && current_task != NULL)) {
|
if ((cur_cpu()->task == NULL && current_task != NULL) || current_task->state != RUNNING) {
|
||||||
|
cur_cpu()->task = NULL;
|
||||||
context_switch(¤t_task->main_thread.context, cur_cpu()->scheduler);
|
context_switch(¤t_task->main_thread.context, cur_cpu()->scheduler);
|
||||||
}
|
}
|
||||||
assert(current_task == cur_cpu()->task);
|
assert(current_task == cur_cpu()->task);
|
||||||
|
|
|
@ -68,11 +68,10 @@ void software_irq_dispatch(struct trapframe* tf)
|
||||||
if (syscall_num != SYSCALL_EXEC) {
|
if (syscall_num != SYSCALL_EXEC) {
|
||||||
arch_set_return(tf, ret);
|
arch_set_return(tf, ret);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
ERROR("syscall by killed task.\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cur_cpu()->task == NULL && cur_task != NULL) {
|
if ((cur_cpu()->task == NULL && cur_task != NULL) || cur_task->state != RUNNING) {
|
||||||
|
cur_cpu()->task = NULL;
|
||||||
context_switch(&cur_task->main_thread.context, cur_cpu()->scheduler);
|
context_switch(&cur_task->main_thread.context, cur_cpu()->scheduler);
|
||||||
}
|
}
|
||||||
assert(cur_task == cur_cpu()->task);
|
assert(cur_task == cur_cpu()->task);
|
||||||
|
|
Loading…
Reference in New Issue