lib: c: re-organise into separate static modules, plus a single shared library
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
set(source_dirs core malloc)
|
set(source_dirs core malloc io)
|
||||||
|
|
||||||
set(public_include_dirs
|
set(public_include_dirs
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/include)
|
${CMAKE_CURRENT_SOURCE_DIR}/include)
|
||||||
@@ -26,5 +26,5 @@ bsp_add_library(
|
|||||||
NAME libc
|
NAME libc
|
||||||
LIB_DIR /usr/lib)
|
LIB_DIR /usr/lib)
|
||||||
|
|
||||||
target_link_libraries(libc libmango)
|
target_link_libraries(libc libmango libxpc-static interface::fs)
|
||||||
target_compile_definitions(libc PRIVATE ENABLE_GLOBAL_HEAP=1)
|
target_compile_definitions(libc PRIVATE ENABLE_GLOBAL_HEAP=1)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
set(source_dirs stdio string)
|
set(source_dirs stdio string errno)
|
||||||
|
|
||||||
foreach (dir ${source_dirs})
|
foreach (dir ${source_dirs})
|
||||||
file(GLOB dir_sources ${CMAKE_CURRENT_SOURCE_DIR}/${dir}/*.c)
|
file(GLOB dir_sources ${CMAKE_CURRENT_SOURCE_DIR}/${dir}/*.c)
|
||||||
@@ -21,3 +21,5 @@ sysroot_add_library(
|
|||||||
NAME libc-core
|
NAME libc-core
|
||||||
HEADER_DIR /usr/include
|
HEADER_DIR /usr/include
|
||||||
LIB_DIR /usr/lib)
|
LIB_DIR /usr/lib)
|
||||||
|
|
||||||
|
target_link_libraries(libc-core libmango)
|
||||||
|
|||||||
54
lib/libc/core/errno/errno.c
Normal file
54
lib/libc/core/errno/errno.c
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
#include <errno.h>
|
||||||
|
#include <mango/status.h>
|
||||||
|
|
||||||
|
#if defined(BUILD_STATIC)
|
||||||
|
int __set_errno(int err)
|
||||||
|
{
|
||||||
|
return -err;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(BUILD_SHARED)
|
||||||
|
int __set_errno(int err)
|
||||||
|
{
|
||||||
|
/* TODO */
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int __errno_from_kern_status(unsigned int err)
|
||||||
|
{
|
||||||
|
switch (err) {
|
||||||
|
case KERN_OK:
|
||||||
|
return SUCCESS;
|
||||||
|
case KERN_UNIMPLEMENTED:
|
||||||
|
return ENOSYS;
|
||||||
|
case KERN_NAME_EXISTS:
|
||||||
|
return EEXIST;
|
||||||
|
case KERN_INVALID_ARGUMENT:
|
||||||
|
return EINVAL;
|
||||||
|
case KERN_UNSUPPORTED:
|
||||||
|
return ENOTSUP;
|
||||||
|
case KERN_NO_MEMORY:
|
||||||
|
return ENOMEM;
|
||||||
|
case KERN_NO_ENTRY:
|
||||||
|
return ENOENT;
|
||||||
|
case KERN_WOULD_BLOCK:
|
||||||
|
return EWOULDBLOCK;
|
||||||
|
case KERN_NO_DEVICE:
|
||||||
|
return ENODEV;
|
||||||
|
case KERN_DEVICE_STUCK:
|
||||||
|
case KERN_IO_ERROR:
|
||||||
|
return EIO;
|
||||||
|
case KERN_FATAL_ERROR:
|
||||||
|
return ENXIO;
|
||||||
|
case KERN_BAD_STATE:
|
||||||
|
return EPERM;
|
||||||
|
case KERN_MEMORY_FAULT:
|
||||||
|
return EFAULT;
|
||||||
|
case KERN_ACCESS_DENIED:
|
||||||
|
return EACCES;
|
||||||
|
default:
|
||||||
|
return EINVAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -139,4 +139,7 @@
|
|||||||
#define EQFULL 106 /* Interface output queue is full */
|
#define EQFULL 106 /* Interface output queue is full */
|
||||||
#define ELAST 106 /* Must be equal largest errno */
|
#define ELAST 106 /* Must be equal largest errno */
|
||||||
|
|
||||||
|
extern int __set_errno(int err);
|
||||||
|
extern int __errno_from_kern_status(unsigned int err);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -14,4 +14,6 @@ extern int strncmp(const char *s1, const char *s2, unsigned long n);
|
|||||||
extern void *memset(void *str, int c, size_t n);
|
extern void *memset(void *str, int c, size_t n);
|
||||||
extern void *memcpy(void *dst, const void *src, size_t len);
|
extern void *memcpy(void *dst, const void *src, size_t len);
|
||||||
|
|
||||||
|
extern char *strdup(char *s);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,9 +1,12 @@
|
|||||||
#ifndef UNISTD_H_
|
#ifndef UNISTD_H_
|
||||||
#define UNISTD_H_
|
#define UNISTD_H_
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
extern int open(const char *path, int flags);
|
extern int open(const char *path, int flags);
|
||||||
extern int close(int fd);
|
extern int close(int fd);
|
||||||
|
|
||||||
|
extern int read(int fd, void *buf, size_t count);
|
||||||
|
extern int write(int fd, const void *buf, size_t count);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
33
lib/libc/io/CMakeLists.txt
Normal file
33
lib/libc/io/CMakeLists.txt
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
set(source_dirs unistd stdio)
|
||||||
|
|
||||||
|
file(GLOB sources *.c *.h)
|
||||||
|
|
||||||
|
foreach (dir ${source_dirs})
|
||||||
|
file(GLOB dir_sources ${CMAKE_CURRENT_SOURCE_DIR}/${dir}/*.c)
|
||||||
|
file(GLOB dir_headers ${CMAKE_CURRENT_SOURCE_DIR}/${dir}/*.h)
|
||||||
|
|
||||||
|
set(sources ${sources} ${dir_sources})
|
||||||
|
set(headers ${headers} ${dir_headers})
|
||||||
|
endforeach (dir)
|
||||||
|
|
||||||
|
file(GLOB_RECURSE sub_headers ${CMAKE_CURRENT_SOURCE_DIR}/include/*.h)
|
||||||
|
set(headers ${headers} ${sub_headers})
|
||||||
|
|
||||||
|
set(component_sources ${sources} PARENT_SCOPE)
|
||||||
|
set(component_headers ${headers} PARENT_SCOPE)
|
||||||
|
set(component_public_include_dirs ${CMAKE_CURRENT_SOURCE_DIR}/include PARENT_SCOPE)
|
||||||
|
|
||||||
|
rosetta_add_library(STATIC
|
||||||
|
NAME libc-io
|
||||||
|
PUBLIC_INCLUDE_DIRS
|
||||||
|
${public_include_dirs}
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/include
|
||||||
|
SOURCES ${sources}
|
||||||
|
HEADERS ${headers})
|
||||||
|
|
||||||
|
sysroot_add_library(
|
||||||
|
NAME libc-io
|
||||||
|
HEADER_DIR /usr/include
|
||||||
|
LIB_DIR /usr/lib)
|
||||||
|
|
||||||
|
target_link_libraries(libc-io libc-core interface::fs libxpc-static libmango)
|
||||||
2
lib/libc/io/fs.c
Normal file
2
lib/libc/io/fs.c
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
#define MSG_IMPLEMENTATION
|
||||||
|
#include <rosetta/fs.h>
|
||||||
43
lib/libc/io/include/sys/mman.h
Normal file
43
lib/libc/io/include/sys/mman.h
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
#ifndef SYS_MMAN_H_
|
||||||
|
#define SYS_MMAN_H_
|
||||||
|
|
||||||
|
#include <mango/types.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#define PROT_NONE 0x00u
|
||||||
|
#define PROT_EXEC 0x01u
|
||||||
|
#define PROT_READ 0x02u
|
||||||
|
#define PROT_WRITE 0x04u
|
||||||
|
|
||||||
|
#define MAP_SHARED 0x01u
|
||||||
|
#define MAP_SHARED_VALIDATE 0x03u
|
||||||
|
#define MAP_PRIVATE 0x04u
|
||||||
|
#define MAP_32BIT 0x08u
|
||||||
|
#define MAP_ANON MAP_ANONYMOUS
|
||||||
|
#define MAP_ANONYMOUS 0x10u
|
||||||
|
#define MAP_DENYWRITE 0x20u
|
||||||
|
#define MAP_EXECUTABLE 0x40u
|
||||||
|
#define MAP_FILE 0x80u
|
||||||
|
#define MAP_FIXED 0x100u
|
||||||
|
#define MAP_FIXED_NOREPLACE 0x300u
|
||||||
|
#define MAP_GROWSDOWN 0x400u
|
||||||
|
#define MAP_HUGETLB 0x800u
|
||||||
|
#define MAP_HUGE_2MB 0x1000u
|
||||||
|
#define MAP_HUGE_1GB 0x2000u
|
||||||
|
#define MAP_LOCKED 0x4000u
|
||||||
|
#define MAP_NONBLOCK 0x8000u
|
||||||
|
#define MAP_NORESERVE 0x10000u
|
||||||
|
#define MAP_POPULATE 0x20000u
|
||||||
|
#define MAP_STACK 0x40000u
|
||||||
|
#define MAP_SYNC 0x80000u
|
||||||
|
#define MAP_UNINITIALIZED 0x100000u
|
||||||
|
|
||||||
|
extern void *mmap(
|
||||||
|
void *addr,
|
||||||
|
size_t length,
|
||||||
|
int prot,
|
||||||
|
int flags,
|
||||||
|
int fd,
|
||||||
|
off_t offset);
|
||||||
|
|
||||||
|
#endif
|
||||||
18
lib/libc/io/include/sys/remote.h
Normal file
18
lib/libc/io/include/sys/remote.h
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
#ifndef SYS_REMOTE_H_
|
||||||
|
#define SYS_REMOTE_H_
|
||||||
|
|
||||||
|
#include <mango/types.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
enum sys_remote_id {
|
||||||
|
SYS_REMOTE_NONE,
|
||||||
|
SYS_REMOTE_NSD,
|
||||||
|
};
|
||||||
|
|
||||||
|
extern bool sys_remote_get(
|
||||||
|
enum sys_remote_id id,
|
||||||
|
tid_t *out_tid,
|
||||||
|
unsigned int *out_chid);
|
||||||
|
extern void sys_remote_set(enum sys_remote_id id, tid_t tid, unsigned int chid);
|
||||||
|
|
||||||
|
#endif
|
||||||
45
lib/libc/io/remote.c
Normal file
45
lib/libc/io/remote.c
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
#include <sys/remote.h>
|
||||||
|
|
||||||
|
#define TID_INVALID ((tid_t) - 1)
|
||||||
|
#define CHID_INVALID ((unsigned int)-1)
|
||||||
|
|
||||||
|
struct remote {
|
||||||
|
tid_t tid;
|
||||||
|
unsigned int chid;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct remote remotes[] = {
|
||||||
|
[SYS_REMOTE_NONE] = {.tid = TID_INVALID, .chid = CHID_INVALID},
|
||||||
|
[SYS_REMOTE_NSD] = {.tid = TID_INVALID, .chid = CHID_INVALID},
|
||||||
|
};
|
||||||
|
static const size_t nr_remotes = sizeof remotes / sizeof remotes[0];
|
||||||
|
|
||||||
|
bool sys_remote_get(
|
||||||
|
enum sys_remote_id id,
|
||||||
|
tid_t *out_tid,
|
||||||
|
unsigned int *out_chid)
|
||||||
|
{
|
||||||
|
if (id < 0 || id >= nr_remotes) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const struct remote *remote = &remotes[id];
|
||||||
|
if (remote->tid == TID_INVALID || remote->chid == CHID_INVALID) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
*out_tid = remote->tid;
|
||||||
|
*out_chid = remote->chid;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void sys_remote_set(enum sys_remote_id id, tid_t tid, unsigned int chid)
|
||||||
|
{
|
||||||
|
if (id < 0 || id >= nr_remotes) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct remote *remote = &remotes[id];
|
||||||
|
remote->tid = tid;
|
||||||
|
remote->chid = chid;
|
||||||
|
}
|
||||||
0
lib/libc/io/unistd/close.c
Normal file
0
lib/libc/io/unistd/close.c
Normal file
6
lib/libc/io/unistd/mmap.c
Normal file
6
lib/libc/io/unistd/mmap.c
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
#include <sys/mman.h>
|
||||||
|
|
||||||
|
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
40
lib/libc/io/unistd/open.c
Normal file
40
lib/libc/io/unistd/open.c
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
#include <errno.h>
|
||||||
|
#include <mango/handle.h>
|
||||||
|
#include <mango/msg.h>
|
||||||
|
#include <rosetta/fs.h>
|
||||||
|
#include <sys/remote.h>
|
||||||
|
|
||||||
|
int open(const char *path, int flags)
|
||||||
|
{
|
||||||
|
tid_t remote_tid;
|
||||||
|
unsigned int remote_chid;
|
||||||
|
if (!sys_remote_get(SYS_REMOTE_NSD, &remote_tid, &remote_chid)) {
|
||||||
|
return __set_errno(ENXIO);
|
||||||
|
}
|
||||||
|
|
||||||
|
kern_handle_t port;
|
||||||
|
kern_status_t status = port_create(&port);
|
||||||
|
if (status != KERN_OK) {
|
||||||
|
return __set_errno(__errno_from_kern_status(status));
|
||||||
|
}
|
||||||
|
|
||||||
|
status = port_connect(port, remote_tid, remote_chid);
|
||||||
|
if (status != KERN_OK) {
|
||||||
|
kern_handle_close(port);
|
||||||
|
return __set_errno(__errno_from_kern_status(status));
|
||||||
|
}
|
||||||
|
|
||||||
|
int err = SUCCESS;
|
||||||
|
status = fs_open(port, path, flags, &err);
|
||||||
|
if (status != KERN_OK) {
|
||||||
|
kern_handle_close(port);
|
||||||
|
return __set_errno(__errno_from_kern_status(status));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (err != SUCCESS) {
|
||||||
|
kern_handle_close(port);
|
||||||
|
return __set_errno(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (int)port;
|
||||||
|
}
|
||||||
21
lib/libc/io/unistd/read.c
Normal file
21
lib/libc/io/unistd/read.c
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
#include <errno.h>
|
||||||
|
#include <mango/handle.h>
|
||||||
|
#include <mango/msg.h>
|
||||||
|
#include <rosetta/fs.h>
|
||||||
|
#include <sys/remote.h>
|
||||||
|
|
||||||
|
int read(int fd, void *buf, size_t count)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
size_t nr_read;
|
||||||
|
kern_status_t status = fs_read(fd, count, &err, &nr_read, buf, count);
|
||||||
|
if (status != KERN_OK) {
|
||||||
|
return __set_errno(__errno_from_kern_status(status));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (err != SUCCESS) {
|
||||||
|
return __set_errno(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
return nr_read;
|
||||||
|
}
|
||||||
0
lib/libc/io/unistd/write.c
Normal file
0
lib/libc/io/unistd/write.c
Normal file
@@ -1,4 +1,4 @@
|
|||||||
set(source_dirs stdlib)
|
set(source_dirs stdlib string)
|
||||||
|
|
||||||
file(GLOB sources *.c *.h)
|
file(GLOB sources *.c *.h)
|
||||||
|
|
||||||
|
|||||||
14
lib/libc/malloc/string/strdup.c
Normal file
14
lib/libc/malloc/string/strdup.c
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
char *strdup(char *s)
|
||||||
|
{
|
||||||
|
size_t len = strlen(s);
|
||||||
|
char *out = malloc(len + 1);
|
||||||
|
if (!out) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(out, s, len + 1);
|
||||||
|
return out;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user