From 41c7689dfa49c52fb15705ce15ef22a278fbf2ef Mon Sep 17 00:00:00 2001 From: Guangyao Ma Date: Fri, 9 Apr 2021 16:53:10 +0800 Subject: [PATCH] feat: introduce mksh toybox to rootfs Change-Id: I0a6e6f2962ca6904c858898eb93a5b2f93e85b69 --- apps/Makefile | 5 +- apps/config.mk | 6 +- apps/init/src/init.c | 7 +- apps/mksh/Makefile | 67 +++++++++ apps/module.mk | 8 +- apps/shell/src/shmsg.c | 5 + apps/toybox/Makefile | 59 ++++++++ kernel/common/console.c | 141 ++++++++++++++---- kernel/common/console.h | 4 +- kernel/common/los_magickey.c | 14 +- .../config/qemu_arm_virt_debug_shell.config | 2 +- tools/build/mk/los_config.mk | 2 + 12 files changed, 283 insertions(+), 37 deletions(-) create mode 100755 apps/mksh/Makefile create mode 100644 apps/toybox/Makefile diff --git a/apps/Makefile b/apps/Makefile index 631b955c..e2254341 100644 --- a/apps/Makefile +++ b/apps/Makefile @@ -27,7 +27,10 @@ # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -include ../.config +LITEOSTOPDIR = $(shell pwd)/../ + +include $(LITEOSTOPDIR)/.config +include ./config.mk include ./module.mk HIDE := @ diff --git a/apps/config.mk b/apps/config.mk index 5f6efe06..6f08d019 100644 --- a/apps/config.mk +++ b/apps/config.mk @@ -55,6 +55,6 @@ COMMON_INCLUDE := -I $(LITEOSTHIRDPARTY)/bounds_checking_function/include # alias variable config HIDE := @ MAKE := make -RM := -rm -rf -CP := -cp -rf -MV := -mv +RM := rm -rf +CP := cp -rf +MV := mv -f diff --git a/apps/init/src/init.c b/apps/init/src/init.c index 7cab38a8..c13f24a2 100644 --- a/apps/init/src/init.c +++ b/apps/init/src/init.c @@ -49,7 +49,7 @@ int main(int argc, char * const *argv) { int ret; - const char *shellPath = "/bin/shell"; + const char *shellPath = "/bin/mksh"; #ifdef LOSCFG_QUICK_START const char *samplePath = "/dev/shm/sample_quickstart"; @@ -74,6 +74,11 @@ int main(int argc, char * const *argv) if (ret < 0) { printf("Failed to fork for shell\n"); } else if (ret == 0) { + ret = tcsetpgrp(STDIN_FILENO, getpgrp()); + if (ret != 0) { + printf("tcsetpgrp failed, pgrpid %d, errno %d\n", getpgrp(), errno); + exit(0); + } (void)execve(shellPath, NULL, NULL); exit(0); } diff --git a/apps/mksh/Makefile b/apps/mksh/Makefile new file mode 100755 index 00000000..a468a046 --- /dev/null +++ b/apps/mksh/Makefile @@ -0,0 +1,67 @@ +# Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved. +# Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of +# conditions and the following disclaimer. +# +# 2. 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. +# +# 3. Neither the name of the copyright holder 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. + +MKSH := mksh + +MKSH_DIR := $(shell pwd)/ +LITEOSTOPDIR = $(MKSH_DIR)/../../ +include $(MKSH_DIR)/../config.mk + +APPS_OUT := $(OUT)/bin +BUILD_DIR := $(MKSH_DIR)/build +BUILD_LOG := $(MKSH_DIR)/build.log +TARGET_OS := OpenHarmony + +LOCAL_CFLAGS := -flto -fdata-sections -ffunction-sections -Oz -fstack-protector-strong -D_FORTIFY_SOURCE=2 -mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4 +LOCAL_CFLAGS += --target=arm-liteos --sysroot=$(LITEOSTOPDIR)/../../prebuilts/lite/sysroot/ +LOCAL_CFLAGS += -DMKSH_DISABLE_TTY_WARNING -DMKSH_SMALL=1 -DMKSH_ASSUME_UTF8=1 -DMKSH_SMALL_BUT_FAST=0 -DMKSH_S_NOVI=1 -DHAVE_CAN_FSTACKPROTECTORSTRONG=1 +LOCAL_CFLAGS += -DMKSH_LESS_CMDLINE_EDITING -DMKSH_LESS_BUILDINS -DMKSH_NO_INITCOMS -DADAPT_FOR_LITEOS_A + +all:$(MKSH) + +$(MKSH): +ifneq ($(wildcard $(BUILD_DIR)),) + $(HIDE)echo "not clean, rebuilding now" + $(HIDE)chmod +x $(BUILD_DIR)/Rebuild.sh + $(HIDE)cd $(BUILD_DIR) && ./Rebuild.sh > $(BUILD_LOG) 2>&1 +else + $(HIDE)mkdir $(BUILD_DIR) + $(HIDE)$(CP) $(LITEOSTHIRDPARTY)/$(MKSH)/. $(BUILD_DIR) + $(HIDE)chmod +x $(BUILD_DIR)/Build.sh + $(HIDE)cd $(BUILD_DIR) && CC=$(CC) TARGET_OS=$(TARGET_OS) CFLAGS="$(LOCAL_CFLAGS)" LDFLAGS="$(LDFLAGS)" ./Build.sh -r > $(BUILD_LOG) 2>&1 +endif + $(HIDE)$(CP) -rf $(BUILD_DIR)/$(MKSH) . + $(HIDE)$(STRIP) $(MKSH) + $(HIDE)mkdir -p $(APPS_OUT) + $(HIDE)$(CP) $(MKSH) $(APPS_OUT) + +clean: + $(HIDE)$(RM) $(MKSH) $(BUILD_DIR) $(BUILD_LOG) + +.PHONY: all $(MKSH) clean diff --git a/apps/module.mk b/apps/module.mk index 520f3393..e2d014d6 100644 --- a/apps/module.mk +++ b/apps/module.mk @@ -29,7 +29,7 @@ APP_SUBDIRS := -##compile modules config## +##build modules config## ifeq ($(LOSCFG_SHELL), y) APP_SUBDIRS += shell @@ -42,3 +42,9 @@ endif ifeq ($(LOSCFG_NET_LWIP_SACK_TFTP), y) APP_SUBDIRS += tftp endif + +#only enable for qemu now +ifeq ($(LOSCFG_PLATFORM_QEMU_ARM_VIRT_CA7), y) +APP_SUBDIRS += mksh +APP_SUBDIRS += toybox +endif diff --git a/apps/shell/src/shmsg.c b/apps/shell/src/shmsg.c index a7276526..1640810d 100644 --- a/apps/shell/src/shmsg.c +++ b/apps/shell/src/shmsg.c @@ -345,6 +345,11 @@ static void DoCmdExec(const char *cmdName, const char *cmdline, unsigned int len exit(1); } + ret = tcsetpgrp(STDIN_FILENO, getpgrp()); + if (ret != 0) { + printf("tcsetpgrp failed, pgrpid %d, errno %d\n", getpgrp(), errno); + } + ret = execve((const char *)cmdParsed->paramArray[0], (char * const *)cmdParsed->paramArray, NULL); if (ret == -1) { perror("execve"); diff --git a/apps/toybox/Makefile b/apps/toybox/Makefile new file mode 100644 index 00000000..501bdeab --- /dev/null +++ b/apps/toybox/Makefile @@ -0,0 +1,59 @@ +# Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved. +# Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of +# conditions and the following disclaimer. +# +# 2. 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. +# +# 3. Neither the name of the copyright holder 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. + +TOYBOX:= toybox + +TOYBOX_DIR := $(shell pwd) +LITEOSTOPDIR = $(TOYBOX_DIR)/../../ +include $(TOYBOX_DIR)/../config.mk + +APPS_OUT := $(OUT)/bin +BUILD_DIR := $(TOYBOX_DIR)/build +BUILD_LOG := $(TOYBOX_DIR)/build.log +OUTNAME := $(TOYBOX) + +$(TOYBOX): +ifneq ($(wildcard $(BUILD_DIR)),) + $(HIDE)echo "not clean, rebuilding now"; +else + $(HIDE)mkdir $(BUILD_DIR) + $(HIDE)$(CP) $(LITEOSTHIRDPARTY)/$(TOYBOX)/. $(BUILD_DIR) +endif + $(HIDE)CFLAGS="-D_FORTIFY_SOURCE=2 -fstack-protector-strong --target=arm-liteos \ + --sysroot=$(LITEOSTOPDIR)/../../prebuilts/lite/sysroot/" CC="$(CC)" OUTNAME=$(OUTNAME) \ + make -C $(BUILD_DIR) toybox -j> $(BUILD_LOG) 2>&1 + $(HIDE)$(CP) $(BUILD_DIR)/$(TOYBOX) . + $(HIDE)$(STRIP) $(TOYBOX) + $(HIDE)mkdir -p $(APPS_OUT) + $(HIDE)$(CP) $(TOYBOX) $(APPS_OUT) + +clean: + $(HIDE)$(RM) $(TOYBOX) $(BUILD_DIR) $(BUILD_LOG) + +.PHONY: all $(TOYBOX) clean diff --git a/kernel/common/console.c b/kernel/common/console.c index 3c929b57..9583fbc5 100644 --- a/kernel/common/console.c +++ b/kernel/common/console.c @@ -111,14 +111,7 @@ INT32 ConsoleTcGetAttr(INT32 fd, struct termios *termios) struct file *filep = NULL; CONSOLE_CB *consoleCB = NULL; - if ((fd >= STDIN_FILENO) && (fd <= STDERR_FILENO)) { - fd = ConsoleUpdateFd(); - if (fd < STDIN_FILENO) { - return -EBADF; - } - } - - int ret = fs_getfilep(fd, &filep); + INT32 ret = fs_getfilep(fd, &filep); if (ret < 0) { return -EPERM; } @@ -128,7 +121,7 @@ INT32 ConsoleTcGetAttr(INT32 fd, struct termios *termios) return -EFAULT; } - termios->c_lflag = consoleCB->consoleTermios.c_lflag; + (VOID)memcpy_s(termios, sizeof(struct termios), &consoleCB->consoleTermios, sizeof(struct termios)); return LOS_OK; } @@ -138,14 +131,8 @@ INT32 ConsoleTcSetAttr(INT32 fd, INT32 actions, const struct termios *termios) CONSOLE_CB *consoleCB = NULL; (VOID)actions; - if ((fd >= STDIN_FILENO) && (fd <= STDERR_FILENO)) { - fd = ConsoleUpdateFd(); - if (fd < STDIN_FILENO) { - return -EBADF; - } - } - int ret = fs_getfilep(fd, &filep); + INT32 ret = fs_getfilep(fd, &filep); if (ret < 0) { return -EPERM; } @@ -154,7 +141,8 @@ INT32 ConsoleTcSetAttr(INT32 fd, INT32 actions, const struct termios *termios) if (consoleCB == NULL) { return -EFAULT; } - consoleCB->consoleTermios.c_lflag = termios->c_lflag; + + (VOID)memcpy_s(&consoleCB->consoleTermios, sizeof(struct termios), termios, sizeof(struct termios)); return LOS_OK; } @@ -183,14 +171,13 @@ BOOL IsConsoleOccupied(const CONSOLE_CB *consoleCB) STATIC INT32 ConsoleCtrlCaptureLine(CONSOLE_CB *consoleCB) { - struct termios *consoleTermios = NULL; + struct termios consoleTermios; UINT32 intSave; LOS_SpinLockSave(&g_consoleSpin, &intSave); - consoleTermios = &consoleCB->consoleTermios; - (VOID)ConsoleTcGetAttr(consoleCB->fd, consoleTermios); - consoleTermios->c_lflag |= ICANON | ECHO; - (VOID)ConsoleTcSetAttr(consoleCB->fd, 0, consoleTermios); + (VOID)ConsoleTcGetAttr(consoleCB->fd, &consoleTermios); + consoleTermios.c_lflag |= ICANON | ECHO; + (VOID)ConsoleTcSetAttr(consoleCB->fd, 0, &consoleTermios); LOS_SpinUnlockRestore(&g_consoleSpin, intSave); return LOS_OK; @@ -198,14 +185,13 @@ STATIC INT32 ConsoleCtrlCaptureLine(CONSOLE_CB *consoleCB) STATIC INT32 ConsoleCtrlCaptureChar(CONSOLE_CB *consoleCB) { - struct termios *consoleTermios = NULL; + struct termios consoleTermios; UINT32 intSave; LOS_SpinLockSave(&g_consoleSpin, &intSave); - consoleTermios = &consoleCB->consoleTermios; - (VOID)ConsoleTcGetAttr(consoleCB->fd, consoleTermios); - consoleTermios->c_lflag &= ~(ICANON | ECHO); - (VOID)ConsoleTcSetAttr(consoleCB->fd, 0, consoleTermios); + (VOID)ConsoleTcGetAttr(consoleCB->fd, &consoleTermios); + consoleTermios.c_lflag &= ~(ICANON | ECHO); + (VOID)ConsoleTcSetAttr(consoleCB->fd, 0, &consoleTermios); LOS_SpinUnlockRestore(&g_consoleSpin, intSave); return LOS_OK; @@ -451,6 +437,20 @@ STATIC VOID StoreReadChar(CONSOLE_CB *consoleCB, char ch, INT32 readcount) } } +VOID KillPgrp() +{ + INT32 consoleId = -1; + LosProcessCB *process = OsCurrProcessGet(); + + if ((process->consoleID > CONSOLE_NUM -1 ) || (process->consoleID < 0)) { + return; + } + + consoleId = process->consoleID; + CONSOLE_CB *consoleCB = g_console[consoleId]; + (VOID)OsKillLock(consoleCB->pgrpId, SIGINT); +} + STATIC INT32 UserFilepRead(CONSOLE_CB *consoleCB, struct file *filep, const struct file_operations_vfs *fops, CHAR *buffer, size_t bufLen) { @@ -829,6 +829,75 @@ ERROUT: return VFS_ERROR; } +STATIC INT32 ConsoleSetSW(CONSOLE_CB *consoleCB, unsigned long arg) +{ + struct termios kerTermios; + UINT32 intSave; + + if (LOS_ArchCopyFromUser(&kerTermios, (struct termios *)arg, sizeof(struct termios)) != 0) { + return -EFAULT; + } + + LOS_SpinLockSave(&g_consoleSpin, &intSave); + (VOID)ConsoleTcSetAttr(consoleCB->fd, 0, &kerTermios); + LOS_SpinUnlockRestore(&g_consoleSpin, intSave); + return LOS_OK; +} + +#define DEFAULT_WINDOW_SIZE_COL 80 +#define DEFAULT_WINDOW_SIZE_ROW 24 +STATIC INT32 ConsoleGetWinSize(unsigned long arg) +{ + struct winsize kws = { + .ws_col = DEFAULT_WINDOW_SIZE_COL, + .ws_row = DEFAULT_WINDOW_SIZE_ROW + }; + + if(LOS_ArchCopyToUser((VOID *)arg, &kws, sizeof(struct winsize)) != 0) { + return -EFAULT; + } else { + return LOS_OK; + } +} + +STATIC INT32 ConsoleGetTermios(unsigned long arg) +{ + struct file *filep = NULL; + CONSOLE_CB *consoleCB = NULL; + + INT32 ret = fs_getfilep(0, &filep); + if (ret < 0) { + return -EPERM; + } + + consoleCB = (CONSOLE_CB *)filep->f_priv; + if (consoleCB == NULL) { + return -EFAULT; + } + + if(LOS_ArchCopyToUser((VOID *)arg, &consoleCB->consoleTermios, sizeof(struct termios)) != 0) { + return -EFAULT; + } else { + return LOS_OK; + } +} + +INT32 ConsoleSetPgrp(CONSOLE_CB *consoleCB, unsigned long arg) +{ + if (LOS_ArchCopyFromUser(&consoleCB->pgrpId, (INT32 *)(UINTPTR)arg, sizeof(INT32)) != 0) { + return -EFAULT; + } + return LOS_OK; +} + +INT32 ConsoleGetPgrp(CONSOLE_CB *consoleCB, unsigned long arg) +{ + if (LOS_ArchCopyToUser((VOID *)arg, &consoleCB->pgrpId, sizeof(INT32)) != 0) { + return -EFAULT; + } + return LOS_OK; +} + STATIC INT32 ConsoleIoctl(struct file *filep, INT32 cmd, unsigned long arg) { INT32 ret; @@ -869,6 +938,21 @@ STATIC INT32 ConsoleIoctl(struct file *filep, INT32 cmd, unsigned long arg) case CONSOLE_CONTROL_REG_USERTASK: ret = ConsoleTaskReg(consoleCB->consoleID, arg); break; + case TIOCGWINSZ: + ret = ConsoleGetWinSize(arg); + break; + case TCSETSW: + ret = ConsoleSetSW(consoleCB, arg); + break; + case TCGETS: + ret = ConsoleGetTermios(arg); + break; + case TIOCGPGRP: + ret = ConsoleGetPgrp(consoleCB, arg); + break; + case TIOCSPGRP: + ret = ConsoleSetPgrp(consoleCB, arg); + break; default: if ((cmd == UART_CFG_ATTR || cmd == UART_CFG_PRIVATE) && !LOS_IsUserAddress(arg)) { @@ -940,6 +1024,7 @@ STATIC VOID OsConsoleTermiosInit(CONSOLE_CB *consoleCB, const CHAR *deviceName) /* set console to have a buffer for user */ (VOID)ConsoleTcGetAttr(consoleCB->fd, &consoleTermios); consoleTermios.c_lflag |= ICANON | ECHO; + consoleTermios.c_cc[VINTR] = 3; /* /003 for ^C */ (VOID)ConsoleTcSetAttr(consoleCB->fd, 0, &consoleTermios); } #ifdef LOSCFG_NET_TELNET @@ -950,6 +1035,7 @@ STATIC VOID OsConsoleTermiosInit(CONSOLE_CB *consoleCB, const CHAR *deviceName) /* set console to have a buffer for user */ (VOID)ConsoleTcGetAttr(consoleCB->fd, &consoleTermios); consoleTermios.c_lflag |= ICANON | ECHO; + consoleTermios.c_cc[VINTR] = 3; /* /003 for ^C */ (VOID)ConsoleTcSetAttr(consoleCB->fd, 0, &consoleTermios); } #endif @@ -1157,6 +1243,7 @@ STATIC CONSOLE_CB *OsConsoleCBInit(UINT32 consoleID) (VOID)memset_s(consoleCB, sizeof(CONSOLE_CB), 0, sizeof(CONSOLE_CB)); consoleCB->consoleID = consoleID; + consoleCB->pgrpId = -1; consoleCB->shellEntryId = SHELL_ENTRYID_INVALID; /* initialize shellEntryId to an invalid value */ consoleCB->name = LOS_MemAlloc((VOID *)m_aucSysMem0, CONSOLE_NAMELEN); if (consoleCB->name == NULL) { diff --git a/kernel/common/console.h b/kernel/common/console.h index 20a0c2d3..0bae46eb 100644 --- a/kernel/common/console.h +++ b/kernel/common/console.h @@ -80,7 +80,6 @@ typedef struct { UINT32 consoleID; UINT32 consoleType; UINT32 consoleSem; - UINT32 shellEntryId; UINT32 consoleMask; struct Vnode *devVnode; CHAR *name; @@ -88,7 +87,9 @@ typedef struct { UINT32 refCount; BOOL isNonBlock; #ifdef LOSCFG_SHELL + UINT32 shellEntryId; VOID *shellHandle; + INT32 pgrpId; #endif UINT32 sendTaskID; CirBufSendCB *cirBufSendCB; @@ -123,6 +124,7 @@ extern INT32 GetFilepOps(const struct file *filep, struct file **privFilep, cons extern VOID OsWaitConsoleSendTaskPend(UINT32 taskID); extern VOID OsWakeConsoleSendTask(VOID); #endif +extern VOID KillPgrp(VOID); /* console ioctl */ #define CONSOLE_IOC_MAGIC 'c' diff --git a/kernel/common/los_magickey.c b/kernel/common/los_magickey.c index adae57e8..f0361149 100644 --- a/kernel/common/los_magickey.c +++ b/kernel/common/los_magickey.c @@ -30,13 +30,13 @@ */ #include "los_magickey.h" +#include "console.h" #include "los_task_pri.h" #ifdef LOSCFG_ENABLE_MAGICKEY #define MAGIC_KEY_NUM 5 - STATIC VOID OsMagicHelp(VOID); STATIC VOID OsMagicTaskShow(VOID); STATIC VOID OsMagicPanic(VOID); @@ -66,6 +66,12 @@ STATIC MagicKeyOp g_magicHelpOp = { .magicKey = 0x1a /* ctrl + z */ }; +STATIC MagicKeyOp g_magicKillPgrp = { + .opHandler = KillPgrp, + .helpMsg = "Show all magic op key(ctrl+c) ", + .magicKey = 0x03 /* ctrl + c */ +}; + /* * NOTICE:Suggest don't use * ctrl+h/backspace=0x8, @@ -81,7 +87,7 @@ STATIC MagicKeyOp *g_magicOpTable[MAGIC_KEY_NUM] = { &g_magicPanicOp, /* ctrl + p */ &g_magicTaskShowOp, /* ctrl + t */ &g_magicHelpOp, /* ctrl + z */ - NULL /* rserved */ + &g_magicKillPgrp /* ctrl + c */ }; STATIC VOID OsMagicHelp(VOID) @@ -131,7 +137,11 @@ INT32 CheckMagicKey(CHAR key) PRINTK("Magic key off\n"); } return 1; + } else if (key == 0x03){ /* ctrl + c */ + KillPgrp(); + return 0; } + if (magicKeySwitch != 0) { for (i = 0; g_magicOpTable[i] != NULL; ++i) { if (key == g_magicOpTable[i]->magicKey) { diff --git a/tools/build/config/qemu_arm_virt_debug_shell.config b/tools/build/config/qemu_arm_virt_debug_shell.config index 88da9ef9..d22f8fd8 100644 --- a/tools/build/config/qemu_arm_virt_debug_shell.config +++ b/tools/build/config/qemu_arm_virt_debug_shell.config @@ -3,7 +3,7 @@ LOSCFG_BOARD_CONFIG_PATH="device/qemu/arm_virt/liteos_a/config/board" # LOSCFG_HRTIMER_ENABLE is not set # LOSCFG_KERNEL_CPPSUPPORT is not set # LOSCFG_FS_FAT is not set -# LOSCFG_ENABLE_MAGICKEY is not set +LOSCFG_ENABLE_MAGICKEY=y LOSCFG_DEBUG_VERSION=y # LOSCFG_SHELL_LK is not set LOSCFG_USER_INIT_DEBUG=y diff --git a/tools/build/mk/los_config.mk b/tools/build/mk/los_config.mk index cf1526c3..da8203a7 100644 --- a/tools/build/mk/los_config.mk +++ b/tools/build/mk/los_config.mk @@ -109,9 +109,11 @@ endif ifeq ($(OUTDIR),) OUT = $(LITEOSTOPDIR)/out/$(LITEOS_PLATFORM) LITEOS_TARGET_DIR = $(OUT) +KERNEL_COMPILE_ONLY = y else OUT = $(OUTDIR) LITEOS_TARGET_DIR = $(OUT)/../../../ +KERNEL_COMPILE_ONLY = n endif BUILD = $(OUT)/obj MK_PATH = $(LITEOSTOPDIR)/tools/build/mk