finish lab4

This commit is contained in:
KAAAsS 2021-05-18 21:49:48 +08:00
parent 0512b0d497
commit 83e83abf39
Signed by: KAAAsS
GPG Key ID: D56625F3E671882F
6 changed files with 30 additions and 12 deletions

View File

@ -13,4 +13,4 @@ define add-symbol-file-auto
end end
add-symbol-file-auto ./build/kernel.img add-symbol-file-auto ./build/kernel.img
add-symbol-file-auto ./user/build/ramdisk/spawn_info.bin add-symbol-file-auto ./user/build/ramdisk/ipc_reg.bin

View File

@ -2,7 +2,7 @@ cmake_minimum_required (VERSION 3.14)
set(CMAKE_VERBOSE_MAKEFILE on) set(CMAKE_VERBOSE_MAKEFILE on)
set(CMAKE_BUILD_TYPE "Debug") # "Release" or "Debug" set(CMAKE_BUILD_TYPE "Release") # "Release" or "Debug"
set(CHCORE_PLAT "raspi3") set(CHCORE_PLAT "raspi3")
set(CHCORE_ARCH "aarch64") set(CHCORE_ARCH "aarch64")

View File

@ -114,19 +114,19 @@ static u64 thread_migrate_to_server(struct ipc_connection *conn, u64 arg)
* This command set the sp register, read the file to find which field * This command set the sp register, read the file to find which field
* of the ipc_connection stores the stack of the server thread? * of the ipc_connection stores the stack of the server thread?
* */ * */
arch_set_thread_stack(target, LAB4_IPC_BLANK); arch_set_thread_stack(target, conn->server_stack_top);
/** /**
* Lab4 * Lab4
* This command set the ip register, read the file to find which field * This command set the ip register, read the file to find which field
* of the ipc_connection stores the instruction to be called when switch * of the ipc_connection stores the instruction to be called when switch
* to the server? * to the server?
* */ * */
arch_set_thread_next_ip(target, LAB4_IPC_BLANK); arch_set_thread_next_ip(target, conn->target->server_ipc_config->callback);
/** /**
* Lab4 * Lab4
* The argument set by sys_ipc_call; * The argument set by sys_ipc_call;
*/ */
arch_set_thread_arg(target, LAB4_IPC_BLANK); arch_set_thread_arg(target, arg);
/** /**
* Passing the scheduling context of the current thread to thread of * Passing the scheduling context of the current thread to thread of
@ -166,9 +166,10 @@ u64 sys_ipc_call(u32 conn_cap, ipc_msg_t * ipc_msg)
/** /**
* Lab4 * Lab4
* Here, you need to transfer all the capbiliies of client thread to * Here, you need to transfer all the capabilities of client thread to
* capbilities in server thread in the ipc_msg. * capabilities in server thread in the ipc_msg.
*/ */
ipc_send_cap(conn, ipc_msg);
r = copy_to_user((char *)&ipc_msg->server_conn_cap, r = copy_to_user((char *)&ipc_msg->server_conn_cap,
(char *)&conn->server_conn_cap, sizeof(u64)); (char *)&conn->server_conn_cap, sizeof(u64));
@ -180,7 +181,8 @@ u64 sys_ipc_call(u32 conn_cap, ipc_msg_t * ipc_msg)
* The arg is actually the 64-bit arg for ipc_dispatcher * The arg is actually the 64-bit arg for ipc_dispatcher
* Then what value should the arg be? * Then what value should the arg be?
* */ * */
arg = LAB4_IPC_BLANK; arg = (u64) ipc_msg;
arg = arg - conn->buf.client_user_addr + conn->buf.server_user_addr;
thread_migrate_to_server(conn, arg); thread_migrate_to_server(conn, arg);
BUG("This function should never\n"); BUG("This function should never\n");
@ -196,5 +198,19 @@ u64 sys_ipc_call(u32 conn_cap, ipc_msg_t * ipc_msg)
* */ * */
u64 sys_ipc_reg_call(u32 conn_cap, u64 arg0) u64 sys_ipc_reg_call(u32 conn_cap, u64 arg0)
{ {
return -1; struct ipc_connection *conn = NULL;
int r;
conn = obj_get(current_thread->process, conn_cap, TYPE_CONNECTION);
if (!conn) {
r = -ECAPBILITY;
goto out_fail;
}
thread_migrate_to_server(conn, arg0);
BUG("This function should never\n");
out_fail:
return r;
} }

View File

@ -40,7 +40,7 @@ static int thread_migrate_to_client(struct ipc_connection *conn, u64 ret_value)
* Lab4 * Lab4
* The return value returned by server thread; * The return value returned by server thread;
*/ */
arch_set_thread_return(source, LAB4_IPC_BLANK); arch_set_thread_return(source, ret_value);
/** /**
* Switch to the client * Switch to the client
*/ */

View File

@ -90,6 +90,8 @@ const void *syscall_table[NR_SYSCALL] = {
[SYS_read_pmo] = sys_read_pmo, [SYS_read_pmo] = sys_read_pmo,
[SYS_transfer_caps] = sys_transfer_caps, [SYS_transfer_caps] = sys_transfer_caps,
[SYS_ipc_reg_call] = sys_ipc_reg_call,
/* TMP FS */ /* TMP FS */
[SYS_fs_load_cpio] = sys_fs_load_cpio, [SYS_fs_load_cpio] = sys_fs_load_cpio,

View File

@ -399,10 +399,10 @@ int launch_process_with_pmos_caps(struct user_elf *user_elf,
{ {
/* Step C: Output the child process & thread capabilities */ /* Step C: Output the child process & thread capabilities */
if (child_process_cap != NULL) { if (child_process_cap != NULL) {
*child_process_cap = new_process_cap;
} }
if (child_main_thread_cap != NULL) { if (child_main_thread_cap != NULL) {
*child_main_thread_cap = main_thread_cap;
} }
} }