cpiofs能够正常加载

This commit is contained in:
zhangzheng
2024-04-10 15:35:35 +08:00
parent 12aa44316f
commit 321f18d77c
26 changed files with 351 additions and 457 deletions

View File

@@ -53,8 +53,13 @@ long syscall_backend(long sys_inx, ...);
void fs_backend_init(void);
long be_lseek(long fd, long offset, long whence);
long sys_be_lseek(va_list ap);
int be_open(const char *path, int flags, mode_t mode);
long sys_be_open(va_list ap);
long sys_be_open_at(va_list ap);
int be_close(int fd);
long sys_be_close(va_list ap);
long sys_be_getdents(va_list ap);
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);

View File

@@ -7,12 +7,16 @@ typedef long (*sys_call_func)(va_list ap);
static const sys_call_func sys_call_list[] = {
// TODO: add syscall func pointer.
[SYS_openat] = sys_be_open_at,
[SYS_close] = sys_be_close,
[SYS_munmap] = sys_munmap,
[SYS_mmap] = sys_mmap,
[SYS_read] = sys_be_read,
[SYS_write] = sys_be_write,
[SYS_writev] = sys_be_writev,
[SYS_ioctl] = sys_be_ioctl,
[SYS_lseek] = sys_be_lseek,
[SYS_getdents64] = sys_be_getdents,
[SYS_set_tid_address] = sys_set_tid_address,
// [__ARM_NR_set_tls] = sys_set_thread_area,
// [SYS_exit] = be_exit,

View File

@@ -1,19 +1,19 @@
#include "fs_backend.h"
#include "syscall_backend.h"
#include "fs_cli.h"
#include <stdarg.h>
#include <errno.h>
#include <u_prot.h>
#include <u_log.h>
#include <u_env.h>
#include <u_task.h>
#include <cons_cli.h>
#include <sys/uio.h>
#include <assert.h>
#include <u_util.h>
#include "fd_map.h"
#include "fs_cli.h"
#include "syscall_backend.h"
#include "u_sleep.h"
#include <assert.h>
#include <cons_cli.h>
#include <errno.h>
#include <stdarg.h>
#include <sys/uio.h>
#include <u_env.h>
#include <u_log.h>
#include <u_prot.h>
#include <u_task.h>
#include <u_util.h>
AUTO_CALL(101)
void fs_backend_init(void)
{
@@ -25,71 +25,84 @@ int be_open(const char *path, int flags, mode_t mode)
{
int fd = fs_open(path, flags, mode);
if (fd < 0)
{
if (fd < 0) {
return fd;
}
int user_fd = fd_map_alloc(0, fd, FD_FS);
if (user_fd < 0)
{
if (user_fd < 0) {
be_close(user_fd);
}
return user_fd;
}
long sys_be_open(va_list ap)
{
void *path;
long flags;
long mode;
ARG_3_BE(ap, path, void *, flags, long, mode, long);
return be_open(path, flags, mode);
}
long sys_be_open_at(va_list ap)
{
long resv;
void *path;
long flags;
long mode;
ARG_4_BE(ap, resv, long, path, void *, flags, long, mode, long);
return be_open(path, flags, mode);
}
int be_close(int fd)
{
fd_map_entry_t u_fd;
int ret = fd_map_free(fd, &u_fd);
if (ret < 0)
{
if (ret < 0) {
return -EBADF;
}
switch (u_fd.type)
{
case FD_TTY:
{
}
break;
case FD_FS:
{
switch (u_fd.type) {
case FD_TTY: {
} break;
case FD_FS: {
return fs_close(u_fd.priv_fd);
}
break;
} break;
default:
return -ENOSYS;
}
return 0;
}
long sys_be_close(va_list ap)
{
long fd;
ARG_1_BE(ap, fd, long);
return be_close(fd);
}
static int be_tty_read(char *buf, long size)
{
pid_t pid;
int len;
int r_len = 0;
if (size == 0)
{
if (size == 0) {
return 0;
}
task_get_pid(TASK_THIS, (umword_t *)(&pid));
while (r_len < size)
{
if (pid == 0)
{
while (r_len < size) {
if (pid == 0) {
len = ulog_read_bytes(u_get_global_env()->log_hd, buf + r_len, size - r_len);
}
else
{
} else {
len = cons_read(buf + r_len, size - r_len);
}
if (len < 0)
{
if (len < 0) {
return len;
}
else if (len == 0)
{
} else if (len == 0) {
u_sleep_ms(10);
continue;
}
@@ -103,22 +116,16 @@ long be_read(long fd, char *buf, long size)
fd_map_entry_t u_fd;
int ret = fd_map_get(fd, &u_fd);
if (ret < 0)
{
if (ret < 0) {
return -EBADF;
}
switch (u_fd.type)
{
case FD_TTY:
{
switch (u_fd.type) {
case FD_TTY: {
return be_tty_read(buf, size);
}
break;
case FD_FS:
{
} break;
case FD_FS: {
return fs_read(u_fd.priv_fd, buf, size);
}
break;
} break;
default:
return -ENOSYS;
}
@@ -130,33 +137,24 @@ long be_write(long fd, char *buf, long size)
fd_map_entry_t u_fd;
int ret = fd_map_get(fd, &u_fd);
if (ret < 0)
{
if (ret < 0) {
return -EBADF;
}
switch (u_fd.type)
{
case FD_TTY:
{
switch (u_fd.type) {
case FD_TTY: {
pid_t pid;
task_get_pid(TASK_THIS, (umword_t *)(&pid));
if (pid == 0)
{
if (pid == 0) {
ulog_write_bytes(u_get_global_env()->log_hd, buf, size);
}
else
{
} else {
cons_write(buf, size);
}
return size;
}
break;
case FD_FS:
{
} break;
case FD_FS: {
return fs_write(u_fd.priv_fd, buf, size);
}
break;
} break;
default:
return -ENOSYS;
}
@@ -165,51 +163,38 @@ long be_write(long fd, char *buf, long size)
long be_readv(long fd, const struct iovec *iov, long iovcnt)
{
long wlen = 0;
for (int i = 0; i < iovcnt; i++)
{
for (int i = 0; i < iovcnt; i++) {
fd_map_entry_t u_fd;
int ret = fd_map_get(fd, &u_fd);
if (ret < 0)
{
if (ret < 0) {
return -EBADF;
}
switch (u_fd.type)
{
case FD_TTY:
{
switch (u_fd.type) {
case FD_TTY: {
pid_t pid;
int read_cn;
task_get_pid(TASK_THIS, (umword_t *)(&pid));
if (pid == 0)
{
if (pid == 0) {
read_cn = ulog_read_bytes(u_get_global_env()->log_hd, iov[i].iov_base, iov[i].iov_len);
}
else
{
} else {
again_read:
read_cn = cons_read(iov[i].iov_base, iov[i].iov_len);
if (read_cn < 0)
{
if (read_cn < 0) {
return read_cn;
}
else if (read_cn == 0)
{
} else if (read_cn == 0) {
u_sleep_ms(10); // TODO:改成信号量
goto again_read;
}
}
wlen += read_cn;
}
break;
case FD_FS:
{
} break;
case FD_FS: {
int rsize = fs_read(u_fd.priv_fd, iov[i].iov_base, iov[i].iov_len);
wlen += rsize;
}
break;
} break;
default:
return -ENOSYS;
}
@@ -219,40 +204,30 @@ long be_readv(long fd, const struct iovec *iov, long iovcnt)
long be_writev(long fd, const struct iovec *iov, long iovcnt)
{
long wlen = 0;
for (int i = 0; i < iovcnt; i++)
{
for (int i = 0; i < iovcnt; i++) {
fd_map_entry_t u_fd;
int ret = fd_map_get(fd, &u_fd);
if (ret < 0)
{
if (ret < 0) {
return -EBADF;
}
switch (u_fd.type)
{
case FD_TTY:
{
switch (u_fd.type) {
case FD_TTY: {
pid_t pid;
task_get_pid(TASK_THIS, (umword_t *)(&pid));
if (pid == 0)
{
if (pid == 0) {
ulog_write_bytes(u_get_global_env()->log_hd, iov[i].iov_base, iov[i].iov_len);
}
else
{
cons_write(iov[i].iov_base, iov[i].iov_len);
} else {
cons_write(iov[i].iov_base, iov[i].iov_len);
}
wlen += iov[i].iov_len;
}
break;
case FD_FS:
{
} break;
case FD_FS: {
int wsize = fs_write(u_fd.priv_fd, iov[i].iov_base, iov[i].iov_len);
wlen += wsize;
}
break;
} break;
default:
return -ENOSYS;
}
@@ -313,27 +288,30 @@ 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)
{
if (ret < 0) {
return -EBADF;
}
switch (u_fd.type)
{
case FD_TTY:
{
switch (u_fd.type) {
case FD_TTY: {
return -ENOSYS;
}
break;
case FD_FS:
{
} break;
case FD_FS: {
return fs_lseek(u_fd.priv_fd, offset, whence);
}
break;
} break;
default:
return -ENOSYS;
}
return 0;
}
long sys_be_lseek(va_list ap)
{
long fd;
long offset;
long whence;
ARG_3_BE(ap, fd, long, offset, long, whence, long);
return be_lseek(fd, offset, whence);
}
long be_symlink(const char *src, const char *dst)
{
return fs_symlink(src, dst);
@@ -343,24 +321,27 @@ long be_getdents(long fd, char *buf, size_t size)
fd_map_entry_t u_fd;
int ret = fd_map_get(fd, &u_fd);
if (ret < 0)
{
if (ret < 0) {
return -EBADF;
}
switch (u_fd.type)
{
case FD_TTY:
{
switch (u_fd.type) {
case FD_TTY: {
return -ENOSYS;
}
break;
case FD_FS:
{
} break;
case FD_FS: {
ret = fs_readdir(u_fd.priv_fd, (struct dirent *)buf);
}
break;
} break;
default:
return -ENOSYS;
}
return ret;
}
long sys_be_getdents(va_list ap)
{
long fd;
char *buf;
size_t size;
ARG_3_BE(ap, fd, long, buf, char *, size, long);
return be_getdents(fd, buf, size);
}

View File

@@ -47,14 +47,14 @@ int be_futex(uint32_t *uaddr, int futex_op, uint32_t val,
}
_try_again:
sys_read_info(SYS_PROT, &sys_info);
sys_read_info(SYS_PROT, &sys_info, 0);
st_val = sys_info.sys_tick;
tag = futex_ctrl(FUTEX_PROT, uaddr, futex_op, val, total, uaddr2, val3, pt->tid);
if (msg_tag_get_val(tag) == -ETIMEDOUT)
{
umword_t en_val;
sys_read_info(SYS_PROT, &sys_info);
sys_read_info(SYS_PROT, &sys_info, 0);
en_val = sys_info.sys_tick;
if (en_val - st_val < total)
{

View File

@@ -121,7 +121,7 @@ long be_clock_gettime(clockid_t clk_id, struct timespec *tp)
return -ENODEV;
}
sys_info_t info;
sys_read_info(SYS_PROT, &info);
sys_read_info(SYS_PROT, &info, 0);
unsigned long ts = info.sys_tick;

View File

@@ -31,9 +31,9 @@ typedef union msg_tag
struct
{
umword_t flags : 4; // 3bit:代表错误由内核报告
umword_t msg_buf_len : 5;
umword_t map_buf_len : 2;
umword_t prot : WORD_BITS - 12;
umword_t msg_buf_len : 7;
umword_t map_buf_len : 5;
umword_t prot : WORD_BITS - 16;
};
} msg_tag_t;

View File

@@ -9,7 +9,9 @@ typedef struct sys_info
umword_t sys_clk;
} sys_info_t;
msg_tag_t sys_read_info(obj_handler_t obj, sys_info_t *info);
#define SYS_FLAGS_MAP_CPIO_FS 0x01
msg_tag_t sys_read_info(obj_handler_t obj, sys_info_t *info, umword_t flags);
msg_tag_t sys_reboot(obj_handler_t obj);
msg_tag_t sys_mem_info(obj_handler_t obj, umword_t *total, umword_t *free);
msg_tag_t sys_dis_info(obj_handler_t obj, umword_t irq_inx);
@@ -18,13 +20,13 @@ static inline umword_t sys_read_tick(void)
{
sys_info_t info;
sys_read_info(SYS_PROT, &info);
sys_read_info(SYS_PROT, &info, 0);
return info.sys_tick;
}
static inline umword_t sys_read_clk(void)
{
sys_info_t info;
sys_read_info(SYS_PROT, &info);
sys_read_info(SYS_PROT, &info, 0);
return info.sys_clk;
}

View File

@@ -3,12 +3,12 @@
#include "u_types.h"
#include "u_prot.h"
#define MSG_BUG_LEN 128
#define MSG_BUG_LEN CONFIG_THREAD_MSG_BUG_LEN
#define MSG_BUF_RECV_R_FLAGS 0x02U //!< 接收上次发送数据的接收者
#define MSG_BUF_REPLY_FLAGS 0x04U //!<
#define IPC_MSG_SIZE 96 //!< IPC消息大小
#define MAP_BUF_SIZE 16 //!< 映射消息大小
#define IPC_MSG_SIZE CONFIG_THREAD_IPC_MSG_LEN //!< IPC消息大小
#define MAP_BUF_SIZE CONFIG_THREAD_MAP_BUF_LEN //!< 映射消息大小
#define IPC_USER_SIZE 12 //!< 用户态消息大小
typedef struct ipc_msg

View File

@@ -15,7 +15,7 @@ enum sys_op
DIS_IRQ,
};
msg_tag_t sys_read_info(obj_handler_t obj, sys_info_t *info)
msg_tag_t sys_read_info(obj_handler_t obj, sys_info_t *info, umword_t flags)
{
register volatile umword_t r0 asm(ARCH_REG_0);
register volatile umword_t r1 asm(ARCH_REG_1);
@@ -23,7 +23,7 @@ msg_tag_t sys_read_info(obj_handler_t obj, sys_info_t *info)
register volatile umword_t r3 asm(ARCH_REG_3);
mk_syscall(syscall_prot_create(SYS_INFO_GET, SYS_PROT, obj).raw,
0,
flags,
0,
0,
0,

View File

@@ -116,7 +116,7 @@ int app_load(const char *name, uenv_t *cur_env, pid_t *pid, char *argv[], int ar
msg_tag_t tag;
sys_info_t sys_info;
tag = sys_read_info(SYS_PROT, &sys_info);
tag = sys_read_info(SYS_PROT, &sys_info, 0);
if (msg_tag_get_val(tag) < 0)
{
return -ENOENT;

View File

@@ -128,7 +128,7 @@ int app_load(const char *name, uenv_t *cur_env, pid_t *pid, char *argv[], int ar
sys_info_t sys_info;
int ret;
tag = sys_read_info(SYS_PROT, &sys_info);
tag = sys_read_info(SYS_PROT, &sys_info, 0);
if (msg_tag_get_val(tag) < 0)
{
return -ENOENT;

View File

@@ -1,22 +1,21 @@
#include "cons_cli.h"
#include "cpiofs.h"
#include "fs_svr.h"
#include "rpc_prot.h"
#include "u_env.h"
#include "u_log.h"
#include "u_rpc.h"
#include "u_rpc_svr.h"
#include "u_sys.h"
#include "fs_svr.h"
#include "cons_cli.h"
#include "u_log.h"
#include "u_env.h"
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <assert.h>
#include <string.h>
#include <dirent.h>
#include "rpc_prot.h"
#include "cpiofs.h"
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
static fs_t fs;
typedef struct file_desc
{
typedef struct file_desc {
pid_t pid;
addr_t file_addr;
size_t file_size;
@@ -30,17 +29,14 @@ static file_desc_t fds[CPIO_FS_FD_NR];
static file_desc_t *fd_alloc(addr_t file_addr, size_t file_size, ssize_t offset, int *fd, int type)
{
for (int i = 0; i < CPIO_FS_FD_NR; i++)
{
if (fds[i].file_addr == 0)
{
for (int i = 0; i < CPIO_FS_FD_NR; i++) {
if (fds[i].file_addr == 0) {
fds[i].pid = thread_get_src_pid();
fds[i].file_addr = file_addr;
fds[i].file_size = file_size;
fds[i].offset = offset;
fds[i].type = type;
if (fd)
{
if (fd) {
*fd = i;
}
return fds + i;
@@ -50,80 +46,67 @@ static file_desc_t *fd_alloc(addr_t file_addr, size_t file_size, ssize_t offset,
}
static file_desc_t *fd_get(int fd)
{
if (fd < 0 || fd >= CPIO_FS_FD_NR)
{
if (fd < 0 || fd >= CPIO_FS_FD_NR) {
return NULL;
}
if (fds[fd].file_addr == 0)
{
if (fds[fd].file_addr == 0) {
return NULL;
}
if (fds[fd].pid != thread_get_src_pid())
{
if (fds[fd].pid != thread_get_src_pid()) {
return NULL;
}
return &fds[fd];
}
static void fd_free(int fd)
{
if (fd < 0 || fd >= CPIO_FS_FD_NR)
{
if (fd < 0 || fd >= CPIO_FS_FD_NR) {
return;
}
if (fds[fd].file_addr)
{
if (fds[fd].pid == thread_get_src_pid())
{
if (fds[fd].file_addr) {
if (fds[fd].pid == thread_get_src_pid()) {
fds[fd].file_addr = 0;
fds[fd].pid = -1;
}
}
}
static sys_info_t sys_info;
void fs_svr_init(void)
{
msg_tag_t tag;
fs_init(&fs);
meta_reg_svr_obj(&fs.svr, FS_PROT);
tag = sys_read_info(SYS_PROT, &sys_info, SYS_FLAGS_MAP_CPIO_FS);
assert(msg_tag_get_val(tag) >= 0);
}
int fs_svr_open(const char *path, int flags, int mode)
{
msg_tag_t tag;
sys_info_t sys_info;
char *o_path;
if (flags & O_RDWR)
{
if (flags & O_RDWR) {
return -EACCES;
}
if (flags & O_WRONLY)
{
if (flags & O_WRONLY) {
return -EACCES;
}
if (path[0] == '/')
{
if (path[0] == '/') {
path++;
}
tag = sys_read_info(SYS_PROT, &sys_info);
if (msg_tag_get_val(tag) < 0)
{
return -ENOENT;
}
umword_t size;
int type;
umword_t addr;
int ret = cpio_find_file((umword_t)sys_info.bootfs_start_addr,
(umword_t)(-1), path, &size, &type, &addr);
if (ret < 0)
{
if (ret < 0) {
return -ENOENT;
}
int fd;
// 找到指定文件
file_desc_t *fdp = fd_alloc(addr, size, 0, &fd, type);
if (!fdp)
{
if (!fdp) {
return -ENOMEM;
}
strncpy(fdp->open_name, path, 32);
@@ -136,20 +119,17 @@ int fs_svr_read(int fd, void *buf, size_t len)
{
file_desc_t *fdp = fd_get(fd);
if (!fdp)
{
if (!fdp) {
return -ENOENT;
}
if (fdp->type != 0)
{
if (fdp->type != 0) {
return -EACCES;
}
size_t remain_size = fdp->file_size - fdp->offset;
size_t read_size = 0;
read_size = MIN(remain_size, len);
if (read_size)
{
if (read_size) {
memcpy(buf, (void *)(fdp->file_addr + fdp->offset), read_size);
fdp->offset += read_size;
}
@@ -159,8 +139,7 @@ int fs_svr_write(int fd, void *buf, size_t len)
{
file_desc_t *fdp = fd_get(fd);
if (!fdp)
{
if (!fdp) {
return -ENOENT;
}
return -EACCES;
@@ -174,38 +153,29 @@ int fs_svr_lseek(int fd, int offs, int whence)
file_desc_t *file = fd_get(fd);
int new_offs = 0;
if (!file)
{
if (!file) {
return -ENOENT;
}
if (file->type != 0)
{
if (file->type != 0) {
return -EACCES;
}
switch (whence)
{
switch (whence) {
case SEEK_SET:
new_offs = offs;
break;
case SEEK_END:
{
case SEEK_END: {
new_offs = file->file_size + offs;
}
break;
case SEEK_CUR:
{
} break;
case SEEK_CUR: {
new_offs = offs + file->offset;
}
break;
} break;
default:
return -EINVAL;
}
if (new_offs > file->file_size)
{
if (new_offs > file->file_size) {
new_offs = file->file_size;
}
if (new_offs < 0)
{
if (new_offs < 0) {
new_offs = 0;
}
file->offset = new_offs;
@@ -225,12 +195,10 @@ int fs_svr_readdir(int fd, dirent_t *dir)
file_desc_t *file = fd_get(fd);
int new_offs = 0;
if (!file)
{
if (!file) {
return -ENOENT;
}
if (file->type != 1)
{
if (file->type != 1) {
return -EACCES;
}
umword_t size;
@@ -239,8 +207,7 @@ int fs_svr_readdir(int fd, dirent_t *dir)
const char *next_path;
int ret = cpio_find_next(file->file_addr, file->open_name, &size, &type, &next_addr, &next_path);
if (ret < 0)
{
if (ret < 0) {
return -ENOENT;
}
file->file_addr = next_addr;
@@ -267,8 +234,7 @@ int fs_svr_fstat(int fd, stat_t *stat)
{
file_desc_t *file = fd_get(fd);
if (!file)
{
if (!file) {
return -ENOENT;
}
stat->st_size = file->file_size;

View File

@@ -37,7 +37,7 @@ int parse_cfg(const char *parse_cfg_file_name, uenv_t *env)
msg_tag_t tag;
sys_info_t sys_info;
tag = sys_read_info(SYS_PROT, &sys_info);
tag = sys_read_info(SYS_PROT, &sys_info, 0);
if (msg_tag_get_val(tag) < 0)
{
printf("read info is errno.\n");