posix文件借口修复
This commit is contained in:
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@@ -264,7 +264,8 @@
|
||||
"shell_cfg.h": "c",
|
||||
"__memory": "c",
|
||||
"optional": "c",
|
||||
"system_error": "c"
|
||||
"system_error": "c",
|
||||
"__dirent.h": "c"
|
||||
},
|
||||
"cortex-debug.showRTOS": false,
|
||||
"cortex-debug.variableUseNaturalFormat": false,
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
#include "mm_man.h"
|
||||
#include "ipc.h"
|
||||
static mem_t global_mem; //!< 全局内存管理块
|
||||
static uint8_t mem_block[59 * 1024]; //!< 内核内存分配堆 TODO:自动识别大小,或者从bootstrap中读取
|
||||
static uint8_t mem_block[1019 * 1024]; //!< 内核内存分配堆 TODO:自动识别大小,或者从bootstrap中读取
|
||||
static kobject_t *kobj_ls[FACTORY_FUNC_MAX]; //!< 全局静态内核对象
|
||||
|
||||
void global_reg_kobj(kobject_t *kobj, int inx)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
ENTRY(Reset_Handler)
|
||||
MEMORY
|
||||
{
|
||||
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K
|
||||
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 1024K
|
||||
FLASH (rx) : ORIGIN = 0x8000000 + 0x2000, LENGTH = 64K - 0x2000
|
||||
}
|
||||
SECTIONS
|
||||
|
||||
@@ -9,7 +9,7 @@ export INIT_OFFSET=0x10000
|
||||
export BOOTFS_ADDR_OFFSET=0x20000
|
||||
export KNL_TEXT=0x8000000
|
||||
export KNL_DATA=0x20000000
|
||||
export KNL_DATA_SIZE=64K
|
||||
export KNL_DATA_SIZE=1024K
|
||||
export BOARD=STM32F2x
|
||||
export ARCH=cortex-m3
|
||||
export PYTHON_EXECUTABLE=python3
|
||||
|
||||
@@ -15,7 +15,7 @@ add_library(LetterShell
|
||||
../../src/shell_companion.c
|
||||
../../src/shell_ext.c
|
||||
../../src/shell_cmd_list.c
|
||||
../../extensions/fs_support/shell_fs.c
|
||||
# ../../extensions/fs_support/shell_fs.c
|
||||
../../extensions/log/log.c
|
||||
# ../../extensions/telnet/telnetd.c
|
||||
../../extensions/shell_enhance/shell_passthrough.c
|
||||
|
||||
@@ -39,14 +39,14 @@
|
||||
* @brief 是否使用shell伴生对象
|
||||
* 一些扩展的组件(文件系统支持,日志工具等)需要使用伴生对象
|
||||
*/
|
||||
#define SHELL_USING_COMPANION 1
|
||||
#define SHELL_USING_COMPANION 0
|
||||
#endif /** SHELL_USING_COMPANION */
|
||||
|
||||
#ifndef SHELL_SUPPORT_END_LINE
|
||||
/**
|
||||
* @brief 支持shell尾行模式
|
||||
*/
|
||||
#define SHELL_SUPPORT_END_LINE 0
|
||||
#define SHELL_SUPPORT_END_LINE 1
|
||||
#endif /** SHELL_SUPPORT_END_LINE */
|
||||
|
||||
#ifndef SHELL_HELP_LIST_USER
|
||||
@@ -107,7 +107,7 @@
|
||||
* 启用后,可以通过`exec [addr] [args]`直接执行对应地址的函数
|
||||
* @attention 如果地址错误,可能会直接引起程序崩溃
|
||||
*/
|
||||
#define SHELL_EXEC_UNDEF_FUNC 1
|
||||
#define SHELL_EXEC_UNDEF_FUNC 0
|
||||
#endif /** SHELL_EXEC_UNDEF_FUNC */
|
||||
|
||||
#ifndef SHELL_PARAMETER_MAX_NUMBER
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include "u_types.h"
|
||||
#include <sys/uio.h>
|
||||
#include <time.h>
|
||||
#include <sys/stat.h>
|
||||
// #include <unistd.h>
|
||||
|
||||
#define ARG_1_BE(ap, arg0, type0) \
|
||||
@@ -51,6 +52,9 @@ long syscall_backend(long sys_inx, ...);
|
||||
|
||||
void fs_backend_init(void);
|
||||
|
||||
long be_lseek(long fd, long offset, long whence);
|
||||
int be_open(const char *path, int flags, mode_t mode);
|
||||
int be_close(int fd);
|
||||
long be_read(long fd, char *buf, long size);
|
||||
long be_write(long fd, char *buf, long size);
|
||||
long be_readv(long fd, const struct iovec *iov, long iovcnt);
|
||||
|
||||
@@ -21,6 +21,47 @@ void fs_backend_init(void)
|
||||
assert(fd_map_alloc(0, 1, FD_TTY) >= 0);
|
||||
assert(fd_map_alloc(0, 2, FD_TTY) >= 0);
|
||||
}
|
||||
int be_open(const char *path, int flags, mode_t mode)
|
||||
{
|
||||
int fd = fs_open(path, flags, mode);
|
||||
|
||||
if (fd < 0)
|
||||
{
|
||||
return fd;
|
||||
}
|
||||
int user_fd = fd_map_alloc(0, fd, FD_FS);
|
||||
|
||||
if (user_fd < 0)
|
||||
{
|
||||
be_close(user_fd);
|
||||
}
|
||||
return user_fd;
|
||||
}
|
||||
int be_close(int fd)
|
||||
{
|
||||
fd_map_entry_t u_fd;
|
||||
int ret = fd_map_free(fd, &u_fd);
|
||||
|
||||
if (ret < 0)
|
||||
{
|
||||
return -EBADF;
|
||||
}
|
||||
switch (u_fd.type)
|
||||
{
|
||||
case FD_TTY:
|
||||
{
|
||||
}
|
||||
break;
|
||||
case FD_FS:
|
||||
{
|
||||
return fs_close(u_fd.priv_fd);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return -ENOSYS;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
static int be_tty_read(char *buf, long size)
|
||||
{
|
||||
pid_t pid;
|
||||
@@ -75,7 +116,7 @@ long be_read(long fd, char *buf, long size)
|
||||
break;
|
||||
case FD_FS:
|
||||
{
|
||||
return fs_read(fd, buf, size);
|
||||
return fs_read(u_fd.priv_fd, buf, size);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@@ -113,7 +154,7 @@ long be_write(long fd, char *buf, long size)
|
||||
break;
|
||||
case FD_FS:
|
||||
{
|
||||
return fs_write(fd, buf, size);
|
||||
return fs_write(u_fd.priv_fd, buf, size);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@@ -164,7 +205,7 @@ long be_readv(long fd, const struct iovec *iov, long iovcnt)
|
||||
break;
|
||||
case FD_FS:
|
||||
{
|
||||
int rsize = fs_read(fd, iov[i].iov_base, iov[i].iov_len);
|
||||
int rsize = fs_read(u_fd.priv_fd, iov[i].iov_base, iov[i].iov_len);
|
||||
|
||||
wlen += rsize;
|
||||
}
|
||||
@@ -207,7 +248,7 @@ long be_writev(long fd, const struct iovec *iov, long iovcnt)
|
||||
break;
|
||||
case FD_FS:
|
||||
{
|
||||
int wsize = fs_write(fd, iov[i].iov_base, iov[i].iov_len);
|
||||
int wsize = fs_write(u_fd.priv_fd, iov[i].iov_base, iov[i].iov_len);
|
||||
|
||||
wlen += wsize;
|
||||
}
|
||||
@@ -267,3 +308,28 @@ long sys_be_ioctl(va_list ap)
|
||||
#undef ARG2
|
||||
return be_ioctl(fd, request, args);
|
||||
}
|
||||
long be_lseek(long fd, long offset, long whence)
|
||||
{
|
||||
fd_map_entry_t u_fd;
|
||||
int ret = fd_map_get(fd, &u_fd);
|
||||
|
||||
if (ret < 0)
|
||||
{
|
||||
return -EBADF;
|
||||
}
|
||||
switch (u_fd.type)
|
||||
{
|
||||
case FD_TTY:
|
||||
{
|
||||
}
|
||||
break;
|
||||
case FD_FS:
|
||||
{
|
||||
return fs_lseek(u_fd.priv_fd, offset, whence);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return -ENOSYS;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -516,7 +516,7 @@
|
||||
#define SYS_personality 136
|
||||
#define SYS_setfsuid 138
|
||||
#define SYS_setfsgid 139
|
||||
#define SYS__llseek 140
|
||||
// #define SYS__llseek 140
|
||||
#define SYS_getdents 141
|
||||
#define SYS__newselect 142
|
||||
#define SYS_flock 143
|
||||
|
||||
@@ -4,16 +4,22 @@
|
||||
#include <stdlib.h>
|
||||
#include "__dirent.h"
|
||||
#include "syscall.h"
|
||||
|
||||
#ifndef NO_LITTLE_MODE
|
||||
#include "syscall_backend.h"
|
||||
#endif
|
||||
DIR *opendir(const char *name)
|
||||
{
|
||||
int fd;
|
||||
DIR *dir;
|
||||
|
||||
if ((fd = open(name, O_RDONLY|O_DIRECTORY|O_CLOEXEC)) < 0)
|
||||
#ifdef NO_LITTLE_MODE
|
||||
if ((fd = open(name, O_RDONLY | O_DIRECTORY | O_CLOEXEC)) < 0)
|
||||
#else
|
||||
if ((fd = be_open(name, O_RDONLY | O_DIRECTORY | O_CLOEXEC, 0)) < 0)
|
||||
#endif
|
||||
return 0;
|
||||
if (!(dir = calloc(1, sizeof *dir))) {
|
||||
__syscall(SYS_close, fd);
|
||||
be_close(fd);
|
||||
return 0;
|
||||
}
|
||||
dir->fd = fd;
|
||||
|
||||
@@ -29,7 +29,7 @@ int fcntl(int fd, int cmd, ...)
|
||||
}
|
||||
ret = __syscall(SYS_fcntl, fd, F_DUPFD_CLOEXEC, 0);
|
||||
if (ret != -EINVAL) {
|
||||
if (ret >= 0) __syscall(SYS_close, ret);
|
||||
if (ret >= 0) be_close(ret);
|
||||
return __syscall_ret(-EINVAL);
|
||||
}
|
||||
ret = __syscall(SYS_fcntl, fd, F_DUPFD, arg);
|
||||
|
||||
@@ -1,20 +1,27 @@
|
||||
#include <fcntl.h>
|
||||
#include <stdarg.h>
|
||||
#include "syscall.h"
|
||||
|
||||
#ifndef NO_LITTLE_MODE
|
||||
#include "syscall_backend.h"
|
||||
#endif
|
||||
int open(const char *filename, int flags, ...)
|
||||
{
|
||||
mode_t mode = 0;
|
||||
|
||||
if ((flags & O_CREAT) || (flags & O_TMPFILE) == O_TMPFILE) {
|
||||
if ((flags & O_CREAT) || (flags & O_TMPFILE) == O_TMPFILE)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap, flags);
|
||||
mode = va_arg(ap, mode_t);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
#ifdef NO_LITTLE_MODE
|
||||
int fd = __sys_open_cp(filename, flags, mode);
|
||||
if (fd>=0 && (flags & O_CLOEXEC))
|
||||
#else
|
||||
int fd = be_open(filename, flags, mode);
|
||||
#endif
|
||||
if (fd >= 0 && (flags & O_CLOEXEC))
|
||||
__syscall(SYS_fcntl, fd, F_SETFD, FD_CLOEXEC);
|
||||
|
||||
return __syscall_ret(fd);
|
||||
|
||||
@@ -6,7 +6,9 @@
|
||||
#include <unistd.h>
|
||||
#include <semaphore.h>
|
||||
#include "syscall.h"
|
||||
|
||||
#ifndef NO_LITTLE_MODE
|
||||
#include "syscall_backend.h"
|
||||
#endif
|
||||
struct args {
|
||||
sem_t sem;
|
||||
int sock;
|
||||
@@ -68,7 +70,7 @@ int mq_notify(mqd_t mqd, const struct sigevent *sev)
|
||||
sigfillset(&allmask);
|
||||
pthread_sigmask(SIG_BLOCK, &allmask, &origmask);
|
||||
if (pthread_create(&td, &attr, start, &args)) {
|
||||
__syscall(SYS_close, s);
|
||||
be_close(s);
|
||||
pthread_sigmask(SIG_SETMASK, &origmask, 0);
|
||||
errno = EAGAIN;
|
||||
return -1;
|
||||
@@ -80,7 +82,7 @@ int mq_notify(mqd_t mqd, const struct sigevent *sev)
|
||||
sem_destroy(&args.sem);
|
||||
|
||||
if (args.err) {
|
||||
__syscall(SYS_close, s);
|
||||
be_close(s);
|
||||
pthread_join(td, 0);
|
||||
pthread_setcancelstate(cs, 0);
|
||||
errno = args.err;
|
||||
|
||||
@@ -5,7 +5,9 @@
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include "syscall.h"
|
||||
|
||||
#ifndef NO_LITTLE_MODE
|
||||
#include "syscall_backend.h"
|
||||
#endif
|
||||
char *if_indextoname(unsigned index, char *name)
|
||||
{
|
||||
struct ifreq ifr;
|
||||
@@ -14,7 +16,7 @@ char *if_indextoname(unsigned index, char *name)
|
||||
if ((fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0)) < 0) return 0;
|
||||
ifr.ifr_ifindex = index;
|
||||
r = ioctl(fd, SIOCGIFNAME, &ifr);
|
||||
__syscall(SYS_close, fd);
|
||||
be_close(fd);
|
||||
if (r < 0) {
|
||||
if (errno == ENODEV) errno = ENXIO;
|
||||
return 0;
|
||||
|
||||
@@ -4,7 +4,9 @@
|
||||
#include <sys/ioctl.h>
|
||||
#include <string.h>
|
||||
#include "syscall.h"
|
||||
|
||||
#ifndef NO_LITTLE_MODE
|
||||
#include "syscall_backend.h"
|
||||
#endif
|
||||
unsigned if_nametoindex(const char *name)
|
||||
{
|
||||
struct ifreq ifr;
|
||||
@@ -13,6 +15,6 @@ unsigned if_nametoindex(const char *name)
|
||||
if ((fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0)) < 0) return 0;
|
||||
strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name);
|
||||
r = ioctl(fd, SIOCGIFINDEX, &ifr);
|
||||
__syscall(SYS_close, fd);
|
||||
be_close(fd);
|
||||
return r < 0 ? 0 : ifr.ifr_ifindex;
|
||||
}
|
||||
|
||||
@@ -14,12 +14,14 @@
|
||||
#include "stdio_impl.h"
|
||||
#include "syscall.h"
|
||||
#include "lookup.h"
|
||||
|
||||
#ifndef NO_LITTLE_MODE
|
||||
#include "syscall_backend.h"
|
||||
#endif
|
||||
static void cleanup(void *p)
|
||||
{
|
||||
struct pollfd *pfd = p;
|
||||
for (int i=0; pfd[i].fd >= -1; i++)
|
||||
if (pfd[i].fd >= 0) __syscall(SYS_close, pfd[i].fd);
|
||||
if (pfd[i].fd >= 0) be_close(pfd[i].fd);
|
||||
}
|
||||
|
||||
static unsigned long mtime()
|
||||
@@ -303,7 +305,7 @@ int __res_msend_rc(int nqueries, const unsigned char *const *queries,
|
||||
* Immediately close TCP socket so as not to consume
|
||||
* resources we no longer need. */
|
||||
alens[i] = alen;
|
||||
__syscall(SYS_close, pfd[i].fd);
|
||||
be_close(pfd[i].fd);
|
||||
pfd[i].fd = -1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -110,13 +110,13 @@ static int child(void *args_vp)
|
||||
ret = __syscall(SYS_dup, p);
|
||||
if (ret < 0)
|
||||
goto fail;
|
||||
__syscall(SYS_close, p);
|
||||
be_close(p);
|
||||
p = ret;
|
||||
}
|
||||
switch (op->cmd)
|
||||
{
|
||||
case FDOP_CLOSE:
|
||||
__syscall(SYS_close, op->fd);
|
||||
be_close(op->fd);
|
||||
break;
|
||||
case FDOP_DUP2:
|
||||
fd = op->srcfd;
|
||||
@@ -147,7 +147,7 @@ static int child(void *args_vp)
|
||||
{
|
||||
if ((ret = __sys_dup2(fd, op->fd)) < 0)
|
||||
goto fail;
|
||||
__syscall(SYS_close, fd);
|
||||
be_close(fd);
|
||||
}
|
||||
break;
|
||||
case FDOP_CHDIR:
|
||||
|
||||
@@ -2,7 +2,9 @@
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
#include "syscall.h"
|
||||
|
||||
#ifndef NO_LITTLE_MODE
|
||||
#include "syscall_backend.h"
|
||||
#endif
|
||||
int fchmodat(int fd, const char *path, mode_t mode, int flag)
|
||||
{
|
||||
if (!flag) return syscall(SYS_fchmodat, fd, path, mode, flag);
|
||||
@@ -32,6 +34,6 @@ int fchmodat(int fd, const char *path, mode_t mode, int flag)
|
||||
else ret = syscall(SYS_fchmodat, AT_FDCWD, proc, mode);
|
||||
}
|
||||
|
||||
__syscall(SYS_close, fd2);
|
||||
be_close(fd2);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -2,7 +2,9 @@
|
||||
#include <fcntl.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#ifndef NO_LITTLE_MODE
|
||||
#include "syscall_backend.h"
|
||||
#endif
|
||||
FILE *fopen(const char *restrict filename, const char *restrict mode)
|
||||
{
|
||||
FILE *f;
|
||||
@@ -26,6 +28,6 @@ FILE *fopen(const char *restrict filename, const char *restrict mode)
|
||||
f = __fdopen(fd, mode);
|
||||
if (f) return f;
|
||||
|
||||
__syscall(SYS_close, fd);
|
||||
be_close(fd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -5,7 +5,9 @@
|
||||
#include <spawn.h>
|
||||
#include "stdio_impl.h"
|
||||
#include "syscall.h"
|
||||
|
||||
#ifndef NO_LITTLE_MODE
|
||||
#include "syscall_backend.h"
|
||||
#endif
|
||||
extern char **__environ;
|
||||
|
||||
FILE *popen(const char *cmd, const char *mode)
|
||||
@@ -27,8 +29,8 @@ FILE *popen(const char *cmd, const char *mode)
|
||||
if (pipe2(p, O_CLOEXEC)) return NULL;
|
||||
f = fdopen(p[op], mode);
|
||||
if (!f) {
|
||||
__syscall(SYS_close, p[0]);
|
||||
__syscall(SYS_close, p[1]);
|
||||
be_close(p[0]);
|
||||
be_close(p[1]);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -44,7 +46,7 @@ FILE *popen(const char *cmd, const char *mode)
|
||||
f->pipe_pid = pid;
|
||||
if (!strchr(mode, 'e'))
|
||||
fcntl(p[op], F_SETFD, 0);
|
||||
__syscall(SYS_close, p[1-op]);
|
||||
be_close(p[1-op]);
|
||||
__ofl_unlock();
|
||||
return f;
|
||||
}
|
||||
@@ -54,7 +56,7 @@ fail:
|
||||
posix_spawn_file_actions_destroy(&fa);
|
||||
}
|
||||
fclose(f);
|
||||
__syscall(SYS_close, p[1-op]);
|
||||
be_close(p[1-op]);
|
||||
|
||||
errno = e;
|
||||
return 0;
|
||||
|
||||
@@ -2,7 +2,9 @@
|
||||
#include <fcntl.h>
|
||||
#include <stdlib.h>
|
||||
#include "stdio_impl.h"
|
||||
|
||||
#ifndef NO_LITTLE_MODE
|
||||
#include "syscall_backend.h"
|
||||
#endif
|
||||
#define MAXTRIES 100
|
||||
|
||||
FILE *tmpfile(void)
|
||||
@@ -21,7 +23,7 @@ FILE *tmpfile(void)
|
||||
__syscall(SYS_unlinkat, AT_FDCWD, s, 0);
|
||||
#endif
|
||||
f = __fdopen(fd, "w+");
|
||||
if (!f) __syscall(SYS_close, fd);
|
||||
if (!f) be_close(fd);
|
||||
return f;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,7 +2,9 @@
|
||||
#include <fcntl.h>
|
||||
#include <sys/stat.h>
|
||||
#include "syscall.h"
|
||||
|
||||
#ifndef NO_LITTLE_MODE
|
||||
#include "syscall_backend.h"
|
||||
#endif
|
||||
const char unsigned *__map_file(const char *pathname, size_t *size)
|
||||
{
|
||||
struct stat st;
|
||||
@@ -13,6 +15,6 @@ const char unsigned *__map_file(const char *pathname, size_t *size)
|
||||
map = __mmap(0, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
|
||||
*size = st.st_size;
|
||||
}
|
||||
__syscall(SYS_close, fd);
|
||||
be_close(fd);
|
||||
return map == MAP_FAILED ? 0 : map;
|
||||
}
|
||||
|
||||
@@ -2,7 +2,9 @@
|
||||
#include <errno.h>
|
||||
#include "aio_impl.h"
|
||||
#include "syscall.h"
|
||||
|
||||
#ifndef NO_LITTLE_MODE
|
||||
#include "syscall_backend.h"
|
||||
#endif
|
||||
static int dummy(int fd)
|
||||
{
|
||||
return fd;
|
||||
@@ -13,7 +15,12 @@ weak_alias(dummy, __aio_close);
|
||||
int close(int fd)
|
||||
{
|
||||
fd = __aio_close(fd);
|
||||
#ifdef NO_LITTLE_MODE
|
||||
int r = __syscall_cp(SYS_close, fd);
|
||||
if (r == -EINTR) r = 0;
|
||||
#else
|
||||
int r = be_close(fd);
|
||||
#endif
|
||||
if (r == -EINTR)
|
||||
r = 0;
|
||||
return __syscall_ret(r);
|
||||
}
|
||||
|
||||
@@ -64,7 +64,7 @@ int faccessat(int fd, const char *filename, int amode, int flag)
|
||||
__block_all_sigs(&set);
|
||||
|
||||
pid = __clone(checker, stack + sizeof stack, 0, &c);
|
||||
__syscall(SYS_close, p[1]);
|
||||
be_close(p[1]);
|
||||
|
||||
#ifdef NO_LITTLE_MODE
|
||||
if (pid < 0 || __syscall(SYS_read, p[0], &ret, sizeof ret) != sizeof(ret))
|
||||
@@ -73,7 +73,7 @@ int faccessat(int fd, const char *filename, int amode, int flag)
|
||||
if (pid < 0 || be_read(p[0], &ret, sizeof ret) != sizeof(ret))
|
||||
ret = -EBUSY;
|
||||
#endif
|
||||
__syscall(SYS_close, p[0]);
|
||||
be_close(p[0]);
|
||||
__syscall(SYS_wait4, pid, &status, __WCLONE, 0);
|
||||
|
||||
__restore_sigs(&set);
|
||||
|
||||
@@ -1,13 +1,19 @@
|
||||
#include <unistd.h>
|
||||
#include "syscall.h"
|
||||
|
||||
#ifndef NO_LITTLE_MODE
|
||||
#include "syscall_backend.h"
|
||||
#endif
|
||||
off_t __lseek(int fd, off_t offset, int whence)
|
||||
{
|
||||
#ifdef SYS__llseek
|
||||
off_t result;
|
||||
return syscall(SYS__llseek, fd, offset>>32, offset, &result, whence) ? -1 : result;
|
||||
return syscall(SYS__llseek, fd, offset >> 32, offset, &result, whence) ? -1 : result;
|
||||
#else
|
||||
#ifdef NO_LITTLE_MODE
|
||||
return syscall(SYS_lseek, fd, offset, whence);
|
||||
#else
|
||||
return be_lseek(fd, offset, whence);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,14 @@
|
||||
#include <unistd.h>
|
||||
#include "syscall.h"
|
||||
|
||||
#ifndef NO_LITTLE_MODE
|
||||
#include "syscall_backend.h"
|
||||
#endif
|
||||
ssize_t write(int fd, const void *buf, size_t count)
|
||||
{
|
||||
#ifdef NO_LITTLE_MODE
|
||||
return syscall_cp(SYS_write, fd, buf, count);
|
||||
#else
|
||||
return be_write(fd, buf, count);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#pragma once
|
||||
#include <u_types.h>
|
||||
#include <string.h>
|
||||
int cons_write(const uint8_t *data, int len);
|
||||
static inline int cons_write_str(const char *str)
|
||||
|
||||
@@ -61,7 +61,7 @@ int app_load(const char *name, uenv_t *cur_env, pid_t *pid)
|
||||
printf("app format is error.\n");
|
||||
return -1;
|
||||
}
|
||||
printf("%s addr is 0x%x\n", name, app);
|
||||
printf("%s addr is [0x%x]\n", name, app);
|
||||
umword_t ram_base;
|
||||
obj_handler_t hd_task = handler_alloc();
|
||||
obj_handler_t hd_thread = handler_alloc();
|
||||
|
||||
@@ -18,4 +18,4 @@ add_subdirectory(app)
|
||||
add_subdirectory(fs)
|
||||
add_subdirectory(hello)
|
||||
add_subdirectory(drv)
|
||||
# add_subdirectory(path_manager)
|
||||
add_subdirectory(test)
|
||||
|
||||
@@ -5,11 +5,12 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUSE_STDPERIPH_DRIVER=1 -DSTM32F10X_XL ")
|
||||
file(
|
||||
GLOB deps
|
||||
ff15/source/*.c
|
||||
ext_disk_drv/*.c
|
||||
# ext_disk_drv/*.c
|
||||
ram_disk_drv/*.c
|
||||
*.c
|
||||
)
|
||||
|
||||
list(REMOVE_ITEM deps mkrtos_user/server/fs/fatfs/ram_disk_drv/*.*)
|
||||
# list(REMOVE_ITEM deps mkrtos_user/server/fs/fatfs/ram_disk_drv/*.*)
|
||||
|
||||
add_executable(
|
||||
fatfs.elf
|
||||
|
||||
@@ -8,11 +8,13 @@
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
#include <assert.h>
|
||||
#include "rpc_prot.h"
|
||||
static fs_t fs;
|
||||
|
||||
void fs_svr_init(void)
|
||||
{
|
||||
fs_init(&fs);
|
||||
meta_reg_svr_obj(&fs.svr, FS_PROT);
|
||||
}
|
||||
typedef struct file_desc
|
||||
{
|
||||
@@ -140,7 +142,7 @@ int fs_svr_open(const char *path, int flags, int mode)
|
||||
else
|
||||
{
|
||||
file->type = 0;
|
||||
cons_write_str("open file..\n");
|
||||
// cons_write_str("open file..\n");
|
||||
}
|
||||
|
||||
return fatfs_err_conv(ret);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#pragma once
|
||||
|
||||
void fs_svr_init(obj_handler_t ipc);
|
||||
void fs_svr_init(void);
|
||||
void fs_svr_loop(void);
|
||||
void *file_temp_buf_get(void);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
|
||||
#define HEAP_SIZE 0
|
||||
#define HEAP_SIZE 512
|
||||
#define STACK_SIZE 1024 * 2
|
||||
|
||||
#if defined(__CC_ARM)
|
||||
|
||||
@@ -15,12 +15,14 @@ static MKFS_PARM defopt = {FM_ANY, 0, 0, 0};
|
||||
|
||||
int main(int args, char *argv[])
|
||||
{
|
||||
obj_handler_t ipc_hd;
|
||||
int ret = rpc_creaite_bind_ipc(THREAD_MAIN, NULL, &ipc_hd);
|
||||
assert(ret >= 0);
|
||||
ns_register("/mnt", ipc_hd);
|
||||
obj_handler_t hd;
|
||||
int ret;
|
||||
|
||||
ret = rpc_meta_init(THREAD_MAIN, &hd);
|
||||
assert(ret >= 0);
|
||||
fs_svr_init();
|
||||
ns_register("/mnt", hd);
|
||||
|
||||
fs_svr_init(ipc_hd);
|
||||
FRESULT res = f_mount(&fs, "0:", 1);
|
||||
|
||||
if (res != FR_OK)
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
#include "ff.h" /* Obtains integer types */
|
||||
#include "diskio.h" /* Declarations of disk functions */
|
||||
// #include "ram_disk.h"
|
||||
#include "ram_disk.h"
|
||||
#include <stdio.h>
|
||||
/* Definitions of physical drive number for each drive */
|
||||
#define DEV_RAM 0 /* Example: Map Ramdisk to physical drive 0 */
|
||||
|
||||
@@ -6,10 +6,10 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUSE_STDPERIPH_DRIVER=1 \
|
||||
")
|
||||
|
||||
|
||||
add_executable(shell.elf
|
||||
add_executable(test.elf
|
||||
${deps}
|
||||
)
|
||||
target_link_libraries(shell.elf
|
||||
target_link_libraries(test.elf
|
||||
PUBLIC
|
||||
start
|
||||
muslc
|
||||
@@ -19,7 +19,7 @@ target_link_libraries(shell.elf
|
||||
${GCC_LIB_PATH}/libgcc.a
|
||||
)
|
||||
target_include_directories(
|
||||
shell.elf
|
||||
test.elf
|
||||
PUBLIC
|
||||
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys/inc
|
||||
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys_util/inc
|
||||
@@ -33,35 +33,35 @@ target_include_directories(
|
||||
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/obj/include
|
||||
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/include
|
||||
|
||||
${CMAKE_SOURCE_DIR}/mkrtos_user/server/shell/bsp/core_inc
|
||||
${CMAKE_SOURCE_DIR}/mkrtos_user/server/shell/bsp/inc
|
||||
${CMAKE_SOURCE_DIR}/mkrtos_user/server/test/bsp/core_inc
|
||||
${CMAKE_SOURCE_DIR}/mkrtos_user/server/test/bsp/inc
|
||||
)
|
||||
add_dependencies(shell.elf
|
||||
add_dependencies(test.elf
|
||||
muslc
|
||||
)
|
||||
set_target_properties(shell.elf PROPERTIES LINK_FLAGS
|
||||
set_target_properties(test.elf PROPERTIES LINK_FLAGS
|
||||
"-T ${CMAKE_CURRENT_LIST_DIR}/link.lds -pie --gc-section -no-dynamic-linker "
|
||||
#--no-warn-rwx-segments
|
||||
)
|
||||
add_custom_target(
|
||||
shell_dump ALL
|
||||
test_dump ALL
|
||||
COMMAND
|
||||
${CMAKE_OBJDUMP} -s -S shell.elf > ${CMAKE_SOURCE_DIR}/build/output/shell.S
|
||||
${CMAKE_OBJDUMP} -s -S test.elf > ${CMAKE_SOURCE_DIR}/build/output/test.S
|
||||
COMMAND
|
||||
${CMAKE_READELF} -a shell.elf > ${CMAKE_SOURCE_DIR}/build/output/shell.txt
|
||||
${CMAKE_READELF} -a test.elf > ${CMAKE_SOURCE_DIR}/build/output/test.txt
|
||||
COMMAND
|
||||
${CMAKE_OBJCOPY} -O binary -S shell.elf shell.bin
|
||||
${CMAKE_OBJCOPY} -O binary -S test.elf test.bin
|
||||
COMMAND
|
||||
${CMAKE_SIZE} shell.elf
|
||||
${CMAKE_SIZE} test.elf
|
||||
COMMAND
|
||||
mkdir -p ${CMAKE_SOURCE_DIR}/build/output/cpio
|
||||
COMMAND
|
||||
cp shell.bin ${CMAKE_SOURCE_DIR}/build/output/cpio/shell
|
||||
cp test.bin ${CMAKE_SOURCE_DIR}/build/output/cpio/test
|
||||
COMMAND
|
||||
cp shell.elf ${CMAKE_SOURCE_DIR}/build/output/shell.elf
|
||||
cp test.elf ${CMAKE_SOURCE_DIR}/build/output/test.elf
|
||||
)
|
||||
|
||||
add_dependencies(shell_dump shell.elf)
|
||||
add_dependencies(shell_dump sys)
|
||||
add_dependencies(shell_dump sys_util)
|
||||
add_dependencies(test_dump test.elf)
|
||||
add_dependencies(test_dump sys)
|
||||
add_dependencies(test_dump sys_util)
|
||||
|
||||
@@ -11,21 +11,19 @@
|
||||
#include "u_ns.h"
|
||||
#include "test.h"
|
||||
#include "u_rpc.h"
|
||||
#include "cons_cli.h"
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
|
||||
int main(int argc, char *args[])
|
||||
{
|
||||
printf("argc:%d args[0]:%s\n", argc, args[0]);
|
||||
ulog_write_str(u_get_global_env()->log_hd, "MKRTOS:\n");
|
||||
#if 0
|
||||
malloc_test();
|
||||
rpc_test();
|
||||
ns_test();
|
||||
#endif
|
||||
irq_test();
|
||||
#endif
|
||||
fs_test();
|
||||
task_unmap(TASK_THIS, vpage_create_raw3(KOBJ_DELETE_RIGHT, 0, TASK_THIS));
|
||||
ulog_write_str(u_get_global_env()->log_hd, "Error.\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1,21 +1,29 @@
|
||||
|
||||
|
||||
#include "fs_cli.h"
|
||||
#include "cons_cli.h"
|
||||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
#include <assert.h>
|
||||
#include <stddef.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
void fs_test(void)
|
||||
{
|
||||
char tmp[4] = "123";
|
||||
int fd = fs_open("/test", O_CREAT | O_RDWR, 0777);
|
||||
assert(fd >= 0);
|
||||
int wlen = fs_write(fd, tmp, 4);
|
||||
assert(wlen == 4);
|
||||
int ret = fs_lseek(fd, 0, SEEK_SET);
|
||||
assert(ret >= 0);
|
||||
int rlen = fs_read(fd, tmp, 4);
|
||||
assert(rlen == 4);
|
||||
assert(strcmp(tmp, "123") == 0);
|
||||
fs_close(fd);
|
||||
int i = 1000;
|
||||
while (i--)
|
||||
{
|
||||
char tmp[4] = "123";
|
||||
int fd = open("/mnt/1.txt", O_CREAT | O_RDWR, 0777);
|
||||
assert(fd >= 0);
|
||||
int wlen = write(fd, tmp, 4);
|
||||
assert(wlen == 4);
|
||||
int ret = lseek(fd, 0, SEEK_SET);
|
||||
assert(ret >= 0);
|
||||
int rlen = read(fd, tmp, 4);
|
||||
assert(rlen == 4);
|
||||
assert(strcmp(tmp, "123") == 0);
|
||||
close(fd);
|
||||
}
|
||||
printf("%s ok.\n", __func__);
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ void irq_test(void)
|
||||
assert(obj != HANDLER_INVALID);
|
||||
msg_tag_t tag = factory_create_irq_sender(FACTORY_PROT, vpage_create_raw3(0, 0, obj));
|
||||
assert(msg_tag_get_val(tag) >= 0);
|
||||
uirq_bind(obj, TIM2_IRQn, 0);
|
||||
uirq_bind(obj, TIM2_IRQn, u_irq_prio_create(0, 0));
|
||||
|
||||
tag = mm_align_alloc(MM_PROT, (void *)0x40000000, 0x50000000 - 0x40000000);
|
||||
assert(msg_tag_get_val(tag) >= 0);
|
||||
|
||||
@@ -14,20 +14,6 @@
|
||||
|
||||
void ns_test(void)
|
||||
{
|
||||
#if 0
|
||||
int ret;
|
||||
obj_handler_t tmp_ipc_hd;
|
||||
|
||||
tmp_ipc_hd = handler_alloc();
|
||||
assert(tmp_ipc_hd != HANDLER_INVALID);
|
||||
msg_tag_t tag = factory_create_ipc(FACTORY_PROT, vpage_create_raw3(0, 0, tmp_ipc_hd));
|
||||
assert(msg_tag_get_val(tag) >= 0);
|
||||
ret = cli_ns_register("shell", tmp_ipc_hd);
|
||||
assert(ret >= 0);
|
||||
ret = cli_ns_query("shell", &tmp_ipc_hd);
|
||||
assert(ret >= 0);
|
||||
ulog_write_str(u_get_global_env()->log_hd, "ns test success.\n");
|
||||
#endif
|
||||
obj_handler_t tmp_ipc_hd;
|
||||
|
||||
tmp_ipc_hd = handler_alloc();
|
||||
|
||||
@@ -95,7 +95,7 @@ msg_tag_t dispatch_test(msg_tag_t tag, ipc_msg_t *msg)
|
||||
tag = test_svr_t_query_dispatch(&test, tag, msg);
|
||||
}
|
||||
#endif
|
||||
RPC_GENERATION_OP2(test_svr_t, 0, query,
|
||||
RPC_GENERATION_OP2(test_svr_t, 0, 0, query,
|
||||
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_OUT, RPC_TYPE_BUF, var0,
|
||||
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, var1)
|
||||
{
|
||||
@@ -104,10 +104,10 @@ RPC_GENERATION_OP2(test_svr_t, 0, query,
|
||||
return 2;
|
||||
}
|
||||
|
||||
RPC_GENERATION_DISPATCH2(test_svr_t, 0, query,
|
||||
RPC_GENERATION_DISPATCH2(test_svr_t, 0, 0, query,
|
||||
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_OUT, RPC_TYPE_BUF, var0,
|
||||
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, var1)
|
||||
RPC_GENERATION_CALL2(test_svr_t, 0, query,
|
||||
RPC_GENERATION_CALL2(test_svr_t, 0, 0, query,
|
||||
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_OUT, RPC_TYPE_BUF, var0,
|
||||
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, var1)
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ set(CMAKE_SIZE "${CROSS_COMPILE}size" CACHE PATH "" FORCE)
|
||||
set(MKRTOS_ARCH $ENV{ARCH})
|
||||
|
||||
# -mfloat-abi=soft -u _printf_float
|
||||
set(CMAKE_C_FLAGS "-mcpu=${MKRTOS_ARCH} -mthumb -Os -g3 -lc -lrdimon -msoft-float -u _printf_float -D=MKRTOS \
|
||||
set(CMAKE_C_FLAGS "-mcpu=${MKRTOS_ARCH} -mthumb -O0 -g3 -lc -lrdimon -msoft-float -u _printf_float -D=MKRTOS \
|
||||
-std=gnu11 -ffunction-sections -fdata-sections -fno-builtin -mfix-cortex-m3-ldrd \
|
||||
-nostartfiles -nodefaultlibs -nostdlib -nostdinc -Xlinker \
|
||||
-fno-stack-protector -Wl,--gc-sections \
|
||||
|
||||
Reference in New Issue
Block a user