syscall.c
来自「ppc750 system design simulator using sys」· C语言 代码 · 共 1,548 行 · 第 1/4 页
C
1,548 行
BOOL ppc_syscall_getgroups(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_setgroups(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_select(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_symlink(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_oldlstat(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_readlink(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_uselib(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_swapon(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_reboot(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_readdir(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_mmap(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_munmap(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_truncate(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_ftruncate(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_fchmod(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_fchown(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_getpriority(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_setpriority(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_profil(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_statfs(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_fstatfs(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_ioperm(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_socketcall(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_syslog(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_setitimer(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_getitimer(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_stat(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_lstat(syscall_cb_t *cb) { RETURN(-1); return FALSE; }static void ppc_swap_stat(struct stat *buf){ ppc_swap(&buf->st_dev, sizeof(&buf->st_dev)); ppc_swap(&buf->st_ino, sizeof(&buf->st_ino)); ppc_swap(&buf->st_mode, sizeof(&buf->st_mode)); ppc_swap(&buf->st_nlink, sizeof(&buf->st_nlink)); ppc_swap(&buf->st_uid, sizeof(&buf->st_uid)); ppc_swap(&buf->st_gid, sizeof(&buf->st_gid)); ppc_swap(&buf->st_rdev, sizeof(&buf->st_rdev)); ppc_swap(&buf->st_size, sizeof(&buf->st_size)); ppc_swap(&buf->st_blksize, sizeof(&buf->st_blksize)); ppc_swap(&buf->st_blocks, sizeof(&buf->st_blocks)); ppc_swap(&buf->st_atime, sizeof(&buf->st_atime)); ppc_swap(&buf->st_mtime, sizeof(&buf->st_mtime)); ppc_swap(&buf->st_ctime, sizeof(&buf->st_ctime)); ppc_swap(&buf->st_ino, sizeof(&buf->st_ino));}BOOL ppc_syscall_fstat(syscall_cb_t *cb){ int fd; struct stat *buf; addr_t buf_addr; int ret; fd = PARM(0); buf_addr = PARM(1); if(verbose) fprintf(stderr, "fstat(fd=%d, buf=0x%08x)\n", fd, buf_addr); buf = (struct stat *) malloc(sizeof(struct stat)); if(buf) { ret = fstat(fd, buf); if(ret >= 0) { if(swap) ppc_swap_stat(buf); MEM_WRITE(buf_addr, buf, sizeof(struct stat)); } free(buf); } else { ret = -1; } RETURN(ret); return ret != -1;}BOOL ppc_syscall_olduname(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_iopl(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_vhangup(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_idle(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_vm86old(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_wait4(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_swapoff(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_sysinfo(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_ipc(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_fsync(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_sigreturn(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_clone(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_setdomainname(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_uname(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_modify_ldt(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_adjtimex(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_mprotect(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_sigprocmask(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_create_module(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_init_module(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_delete_module(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_get_kernel_syms(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_quotactl(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_getpgid(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_fchdir(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_bdflush(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_sysfs(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_personality(syscall_cb_t *cb) { return TRUE; }BOOL ppc_syscall_afs_syscall(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_setfsuid(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_setfsgid(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall__llseek(syscall_cb_t *cb){ int fd; UInt32 offset_high; UInt32 offset_low; addr_t result_addr; int whence; int ret; fd = PARM(0); offset_high = PARM(1); offset_low = PARM(2); result_addr = PARM(3); whence = PARM(4); if(verbose) fprintf(stderr, "_lseek(fd=%d, offset_high=%u, offset_low=%u, result=0x%08x, whence=%d)\n", fd, offset_high, offset_low, result_addr, whence); if(offset_high == 0) { off_t lseek_ret = lseek(fd, offset_low, whence); if(lseek_ret >= 0) { MEM_WRITE_DWORD(result_addr, lseek_ret); ret = 0; } else { ret = -1; } } else { ret = -1; } RETURN(ret); return ret != -1;}BOOL ppc_syscall_getdents(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_newselect(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_flock(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_msync(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_readv(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_writev(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_getsid(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_fdatasync(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_sysctl(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_mlock(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_munlock(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_mlockall(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_munlockall(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_sched_setparam(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_sched_getparam(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_sched_setscheduler(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_getsheduler(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_sched_yield(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_sched_get_priority_max(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_sched_get_priority_min(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_sched_rr_get_interval(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_nanosleep(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_mremap(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_setresuid(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_getresuid(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_vm86(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_query_module(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_poll(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_nfsservctl(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_setresgid(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_getresgid(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_prctl(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_rt_sigreturn(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_rt_sigaction(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_rt_sigprocmask(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_rt_sigpending(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_rt_sigtimedwait(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_rt_sigqueueinfo(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_rt_sigsuspend(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_pread(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_pwrite(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_chown(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_getcwd(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_capget(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_capset(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_sigaltstack(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_sendfile(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_getpmsg(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_putpmsg(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_vfork(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_ugetrlimit(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_mmap2(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_truncate64(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_ftruncate64(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_stat64(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_lstat64(syscall_cb_t *cb) { RETURN(-1); return FALSE; }#ifdef linuxstatic void ppc_swap_stat64(struct stat64 *buf){ ppc_swap(&buf->st_dev, sizeof(&buf->st_dev)); ppc_swap(&buf->__pad1, sizeof(&buf->__pad1));// ppc_swap(&buf->__st_ino, sizeof(&buf->__st_ino)); ppc_swap(&buf->st_mode, sizeof(&buf->st_mode)); ppc_swap(&buf->st_nlink, sizeof(&buf->st_nlink)); ppc_swap(&buf->st_uid, sizeof(&buf->st_uid)); ppc_swap(&buf->st_gid, sizeof(&buf->st_gid)); ppc_swap(&buf->st_rdev, sizeof(&buf->st_rdev)); ppc_swap(&buf->__pad2, sizeof(&buf->__pad2)); ppc_swap(&buf->st_size, sizeof(&buf->st_size)); ppc_swap(&buf->st_blksize, sizeof(&buf->st_blksize)); ppc_swap(&buf->st_blocks, sizeof(&buf->st_blocks)); ppc_swap(&buf->st_atime, sizeof(&buf->st_atime)); ppc_swap(&buf->__unused1, sizeof(&buf->__unused1)); ppc_swap(&buf->st_mtime, sizeof(&buf->st_mtime)); ppc_swap(&buf->__unused2, sizeof(&buf->__unused2)); ppc_swap(&buf->st_ctime, sizeof(&buf->st_ctime)); ppc_swap(&buf->__unused3, sizeof(&buf->__unused3)); ppc_swap(&buf->st_ino, sizeof(&buf->st_ino));}#endifBOOL ppc_syscall_fstat64(syscall_cb_t *cb){#ifdef linux int fd; addr_t buf_addr; struct stat64 *buf; int ret; fd = PARM(0); buf_addr = PARM(1); if(verbose) fprintf(stderr, "fstat64(fd=%d, buf=0x%08x)\n", fd, buf_addr); buf = (struct stat64 *) malloc(sizeof(struct stat64)); if(buf) { ret = fstat64(fd, buf); if(ret >= 0) { if(swap) ppc_swap_stat64(buf); MEM_WRITE(buf_addr, buf, sizeof(struct stat64)); } free(buf); } else { ret = -1; } RETURN(ret); return ret != -1;#else int ret = -1; RETURN(ret); return FALSE;#endif}BOOL ppc_syscall_lchown32(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_getuid32(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_getgid32(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_geteuid32(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_getegid32(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_setreuid32(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_setregid32(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_getgroups32(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_setgroups32(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_fchown32(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_setresuid32(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_getresuid32(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_setresgid32(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_getresgid32(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_chown32(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_setuid32(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_setgid32(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_setfsuid32(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_setfsgid32(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_pivot_root(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_mincore(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_madvise(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_getdents64(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_fnctl64(syscall_cb_t *cb) { RETURN(-1); return FALSE; }static char *ppc_get_syscall_name(int num){ switch(num) { case __SYSCALL_exit: return "exit"; case __SYSCALL_fork: return "fork"; case __SYSCALL_read: return "read"; case __SYSCALL_write: return "write"; case __SYSCALL_open: return "open"; case __SYSCALL_close: return "close"; case __SYSCALL_waitpid: return "waitpid"; case __SYSCALL_creat: return "creat"; case __SYSCALL_link: return "link"; case __SYSCALL_unlink: return "unlink"; case __SYSCALL_execve: return "execve"; case __SYSCALL_chdir: return "chdir"; case __SYSCALL_time: return "time"; case __SYSCALL_mknod: return "mknod"; case __SYSCALL_chmod: return "chmod"; case __SYSCALL_lchown: return "lchown"; case __SYSCALL_break: return "break"; case __SYSCALL_oldstat: return "oldstat"; case __SYSCALL_lseek: return "lseek"; case __SYSCALL_getpid: return "getpid"; case __SYSCALL_mount: return "mount"; case __SYSCALL_umount: return "umount"; case __SYSCALL_setuid: return "setuid"; case __SYSCALL_getuid: return "getuid"; case __SYSCALL_stime: return "stime"; case __SYSCALL_ptrace: return "ptrace"; case __SYSCALL_alarm: return "alarm"; case __SYSCALL_oldfstat: return "oldfstat"; case __SYSCALL_pause: return "pause"; case __SYSCALL_utime: return "utime"; case __SYSCALL_stty: return "stty"; case __SYSCALL_gtty: return "gtty"; case __SYSCALL_access: return "access"; case __SYSCALL_nice: return "nice"; case __SYSCALL_ftime: return "ftime"; case __SYSCALL_sync: return "sync"; case __SYSCALL_kill: return "kill"; case __SYSCALL_rename: return "rename"; case __SYSCALL_mkdir: return "mkdir"; case __SYSCALL_rmdir: return "rmdir"; case __SYSCALL_dup: return "dup"; case __SYSCALL_pipe: return "pipe"; case __SYSCALL_times: return "times"; case __SYSCALL_prof: return "prof"; case __SYSCALL_brk: return "brk"; case __SYSCALL_setgid: return "setgid"; case __SYSCALL_getgid: return "getgid"; case __SYSCALL_signal: return "signal"; case __SYSCALL_geteuid: return "geteuid"; case __SYSCALL_getegid: return "getegid"; case __SYSCALL_acct: return "acct"; case __SYSCALL_umount2: return "umount2"; case __SYSCALL_lock: return "lock"; case __SYSCALL_ioctl: return "ioctl"; case __SYSCALL_fcntl: return "fcntl"; case __SYSCALL_mpx: return "mpx"; case __SYSCALL_setpgid: return "setpgid"; case __SYSCALL_ulimit: return "ulimit"; case __SYSCALL_oldolduname: return "oldolduname"; case __SYSCALL_umask: return "umask"; case __SYSCALL_chroot: return "chroot"; case __SYSCALL_ustat : return "ustat"; case __SYSCALL_dup2: return "dup2"; case __SYSCALL_getppid: return "getppid"; case __SYSCALL_getpgrp: return "getpgrp"; case __SYSCALL_setsid: return "setsid"; case __SYSCALL_sigaction: return "sigaction"; case __SYSCALL_sgetmask: return "sgetmask"; case __SYSCALL_ssetmask: return "ssetmask"; case __SYSCALL_setreuid: return "setreuid"; case __SYSCALL_setregid: return "setregid"; case __SYSCALL_sigsuspend: return "sigsuspend"; case __SYSCALL_sigpending: return "sigpending"; case __SYSCALL_sethostname: return "sethostname"; case __SYSCALL_setrlimit: return "setrlimit"; case __SYSCALL_getrlimit: return "getrlimit"; case __SYSCALL_getrusage: return "getrusage"; case __SYSCALL_gettimeofday: return "gettimeofday"; case __SYSCALL_settimeofday: return "settimeofday"; case __SYSCALL_getgroups: return "getgroups"; case __SYSCALL_setgroups: return "setgroups"; case __SYSCALL_select: return "select"; case __SYSCALL_symlink: return "symlink"; case __SYSCALL_oldlstat: return "oldlstat"; case __SYSCALL_readlink: return "readlink"; case __SYSCALL_uselib: return "uselib"; case __SYSCALL_swapon: return "swapon"; case __SYSCALL_reboot: return "reboot"; case __SYSCALL_readdir: return "readdir"; case __SYSCALL_mmap: return "mmap"; case __SYSCALL_munmap: return "munmap";
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?