Merge kolibri.h and syscalls.h, rename kolibri.h to umka.h.

This commit is contained in:
Ivan Baravy 2020-05-07 04:57:01 +03:00
parent cea3923666
commit 5d99380431
10 changed files with 385 additions and 393 deletions

377
kolibri.h
View File

@ -1,377 +0,0 @@
#ifndef KOLIBRI_H_INCLUDED
#define KOLIBRI_H_INCLUDED
#include <stdio.h>
#include <stdint.h>
#include <stddef.h>
#define BDFE_LEN_CP866 304
#define BDFE_LEN_UNICODE 560
typedef struct {
uint32_t left, top, right, bottom;
} rect_t;
typedef struct {
uint32_t left, top, width, height;
} box_t;
typedef struct {
uint32_t cpu_usage;
uint16_t window_stack_position;
uint16_t window_stack_value;
uint16_t pad;
char process_name[12];
uint32_t memory_start;
uint32_t used_memory;
uint32_t pid;
box_t box;
uint16_t slot_state;
uint16_t pad2;
box_t client_box;
uint8_t wnd_state;
uint8_t pad3[1024-71];
} __attribute__((packed)) process_information_t;
typedef struct {
uint32_t frame, grab, work_3d_dark, work_3d_light, grab_text, work,
work_button, work_button_text, work_text, work_graph;
} system_colors_t;
typedef enum {
DEFAULT_ENCODING,
CP866,
UTF16,
UTF8,
INVALID_ENCODING,
} fs_enc_t;
typedef enum {
F70 = 70,
F80 = 80,
} f70or80_t;
enum {
ERROR_SUCCESS,
ERROR_DISK_BASE,
ERROR_UNSUPPORTED_FS,
ERROR_UNKNOWN_FS,
ERROR_PARTITION,
ERROR_FILE_NOT_FOUND,
ERROR_END_OF_FILE,
ERROR_MEMORY_POINTER,
ERROR_DISK_FULL,
ERROR_FS_FAIL,
ERROR_ACCESS_DENIED,
ERROR_DEVICE,
ERROR_OUT_OF_MEMORY,
};
typedef struct lhead lhead_t;
struct lhead {
lhead_t *next;
lhead_t *prev;
};
typedef struct {
lhead_t wait_list;
uint32_t count;
} mutex_t;
typedef struct {
uint32_t flags;
uint32_t sector_size;
uint64_t capacity; // in sectors
} diskmediainfo_t;
typedef struct {
uintptr_t pointer;
uint32_t data_size;
uintptr_t data;
uint32_t sad_size;
uint32_t search_start;
uint32_t sector_size_log;
} disk_cache_t;
typedef struct {
uint64_t first_sector;
uint64_t length; // in sectors
void *disk;
void *fs_user_functions;
} partition_t;
typedef struct disk_t disk_t;
typedef struct {
uint32_t strucsize;
void (*close)(void *userdata) __attribute__((__stdcall__));
void (*closemedia)(void *userdata) __attribute__((__stdcall__));
int (*querymedia)(void *userdata, diskmediainfo_t *info) __attribute__((__stdcall__));
int (*read)(void *userdata, void *buffer, off_t startsector, size_t *numsectors) __attribute__((__stdcall__));
int (*write)(void *userdata, void *buffer, off_t startsector, size_t *numsectors) __attribute__((__stdcall__));
int (*flush)(void *userdata) __attribute__((__stdcall__));
unsigned int (*adjust_cache_size)(void *userdata, size_t suggested_size) __attribute__((__stdcall__));
} diskfunc_t;
struct disk_t {
disk_t *next;
disk_t *prev;
diskfunc_t *functions;
const char *name;
void *userdata;
uint32_t driver_flags;
uint32_t ref_count;
mutex_t media_lock;
uint8_t media_inserted;
uint8_t media_used;
uint16_t padding;
uint32_t media_ref_count;
diskmediainfo_t media_info;
uint32_t num_partitions;
partition_t **partitions;
uint32_t cache_size;
mutex_t cache_lock;
disk_cache_t sys_cache;
disk_cache_t app_cache;
};
typedef struct {
uint32_t attr;
uint32_t enc;
uint32_t ctime;
uint32_t cdate;
uint32_t atime;
uint32_t adate;
uint32_t mtime;
uint32_t mdate;
uint64_t size;
char name[0];
} bdfe_t;
typedef struct {
uint32_t status;
uint32_t count;
} f7080ret_t;
typedef struct {
uint32_t sf;
uint64_t offset;
uint32_t count;
void *buf;
union {
struct {
uint8_t zero;
const char *path;
} __attribute__((packed)) f70;
struct {
uint32_t path_encoding;
const char *path;
} f80;
} u;
} __attribute__((packed)) f7080s0arg_t;
typedef struct {
uint32_t sf;
uint32_t offset;
uint32_t encoding;
uint32_t size;
void *buf;
union {
struct {
uint8_t zero;
const char *path;
} __attribute__((packed)) f70;
struct {
uint32_t path_encoding;
const char *path;
} f80;
} u;
} __attribute__((packed)) f7080s1arg_t;
typedef struct {
uint32_t version;
uint32_t cnt;
uint32_t total_cnt;
uint32_t zeroed[5];
bdfe_t bdfes[0];
} f7080s1info_t;
typedef struct {
uint32_t sf;
uint32_t reserved1;
uint32_t flags;
uint32_t reserved2;
void *buf;
union {
struct {
uint8_t zero;
const char *path;
} __attribute__((packed)) f70;
struct {
uint32_t path_encoding;
const char *path;
} f80;
} u;
} __attribute__((packed)) f7080s5arg_t;
#define KF_READONLY 0x01
#define KF_HIDDEN 0x02
#define KF_SYSTEM 0x04
#define KF_LABEL 0x08
#define KF_FOLDER 0x10
#define KF_ATTR_CNT 5
#define HASH_SIZE 32
typedef struct {
uint8_t hash[HASH_SIZE];
uint8_t opaque[1024-HASH_SIZE];
} hash_context;
typedef struct {
uint32_t edi;
uint32_t esi;
uint32_t ebp;
uint32_t esp;
uint32_t ebx;
uint32_t edx;
uint32_t ecx;
uint32_t eax;
} pushad_t;
#define NET_TYPE_ETH 1
#define NET_TYPE_SLIP 2
// Link state
#define ETH_LINK_DOWN 0x0 // Link is down
#define ETH_LINK_UNKNOWN 0x1 // There could be an active link
#define ETH_LINK_FD 0x2 // full duplex flag
#define ETH_LINK_10M 0x4 // 10 mbit
#define ETH_LINK_100M 0x8 // 100 mbit
#define ETH_LINK_1G 0xc // gigabit
// Ethernet protocol numbers
#define ETHER_PROTO_ARP 0x0608
#define ETHER_PROTO_IPv4 0x0008
#define ETHER_PROTO_IPv6 0xDD86
#define ETHER_PROTO_PPP_DISCOVERY 0x6388
#define ETHER_PROTO_PPP_SESSION 0x6488
// Internet protocol numbers
#define IP_PROTO_IP 0
#define IP_PROTO_ICMP 1
#define IP_PROTO_TCP 6
#define IP_PROTO_UDP 17
#define IP_PROTO_RAW 255
// IP options
#define IP_TOS 1
#define IP_TTL 2
#define IP_HDRINCL 3
// PPP protocol numbers
#define PPP_PROTO_IPv4 0x2100
#define PPP_PROTO_IPV6 0x5780
#define PPP_PROTO_ETHERNET 666
// Protocol family
#define AF_INET4 AF_INET
typedef struct {
uint32_t device_type; // type field
uint32_t mtu; // Maximal Transmission Unit
char *name; // ptr to 0 terminated string
void *unload; // ptrs to driver functions
void *reset;
void *transmit;
uint64_t bytes_tx; // statistics, updated by the driver
uint64_t bytes_rx;
uint32_t packets_tx;
uint32_t packets_rx;
uint32_t link_state; // link state (0 = no link)
uint32_t hwacc; // bitmask stating enabled HW accelerations (offload
// engines)
uint8_t mac[6];
} net_device_t; // NET_DEVICE
typedef struct {
void *next; // pointer to next frame in list
void *prev; // pointer to previous frame in list
net_device_t *device; // ptr to NET_DEVICE structure
uint32_t type; // encapsulation type: e.g. Ethernet
size_t length; // size of encapsulated data
size_t offset; // offset to actual data (24 bytes for default frame)
uint8_t data[0];
} net_buff_t;
void kos_init(void);
void i40(void);
uint32_t kos_time_to_epoch(uint32_t *time);
void *disk_add(diskfunc_t *disk, const char *name, void *userdata, uint32_t flags) __attribute__((__stdcall__));
void *disk_media_changed(diskfunc_t *disk, int inserted) __attribute__((__stdcall__));
void disk_del(disk_t *disk) __attribute__((__stdcall__));
void hash_oneshot(void *ctx, void *data, size_t len);
void xfs_user_functions(void);
void ext_user_functions(void);
void fat_user_functions(void);
void ntfs_user_functions(void);
static inline void kos_enable_acpi() {
__asm__ __inline__ __volatile__ (
"pushad;"
"call enable_acpi;"
"popad"
:
:
: "memory", "cc");
}
typedef struct {
uint32_t value;
uint32_t errorcode;
} f75ret_t;
typedef struct {
uint32_t eax;
uint32_t ebx;
} f76ret_t;
static inline void kos_stack_init() {
__asm__ __inline__ __volatile__ (
"pushad;"
"call stack_init;"
"popad"
:
:
: "memory", "cc");
}
static inline int32_t kos_net_add_device(net_device_t *dev) {
int32_t dev_num;
__asm__ __inline__ __volatile__ (
"call net_add_device"
: "=a"(dev_num)
: "b"(dev)
: "ecx", "edx", "esi", "edi", "memory", "cc");
return dev_num;
}
void coverage_begin(void);
void coverage_end(void);
extern uint32_t *kos_lfb_base;
extern uint16_t *kos_win_stack;
extern uint16_t *kos_win_pos;
extern uint32_t kos_acpi_ssdt_cnt;
extern uint8_t **kos_acpi_ssdt_base;
extern size_t *kos_acpi_ssdt_size;
extern disk_t disk_list;
#endif

View File

@ -47,7 +47,7 @@ tags: umka.sym
trace.o: trace.c trace.h trace_lbr.h trace.o: trace.c trace.h trace_lbr.h
$(CC) $(CFLAGS_32) -c $< $(CC) $(CFLAGS_32) -c $<
trace_lbr.o: trace_lbr.c trace_lbr.h kolibri.h trace_lbr.o: trace_lbr.c trace_lbr.h umka.h
$(CC) $(CFLAGS_32) -c $< $(CC) $(CFLAGS_32) -c $<
vdisk.o: vdisk.c vdisk.o: vdisk.c
@ -56,10 +56,10 @@ vdisk.o: vdisk.c
vnet.o: vnet.c vnet.o: vnet.c
$(CC) $(CFLAGS_32) -c $< $(CC) $(CFLAGS_32) -c $<
umka_shell.o: umka_shell.c kolibri.h trace.h syscalls.h umka_shell.o: umka_shell.c umka.h trace.h
$(CC) $(CFLAGS_32) -c $< $(CC) $(CFLAGS_32) -c $<
umka_fuse.o: umka_fuse.c kolibri.h umka_fuse.o: umka_fuse.c umka.h
$(CC) $(CFLAGS_32) `pkg-config fuse3 --cflags` -c $< $(CC) $(CFLAGS_32) `pkg-config fuse3 --cflags` -c $<
tools/mkdirrange: tools/mkdirrange.c tools/mkdirrange: tools/mkdirrange.c

View File

@ -6,7 +6,7 @@
#include <sys/stat.h> #include <sys/stat.h>
#include <fcntl.h> #include <fcntl.h>
#include <signal.h> #include <signal.h>
#include "kolibri.h" #include "umka.h"
#define MSR_IA32_DEBUGCTLMSR 0x1d9 #define MSR_IA32_DEBUGCTLMSR 0x1d9
#define MSR_IA32_LASTBRANCHFROMIP 0x1db #define MSR_IA32_LASTBRANCHFROMIP 0x1db

View File

@ -1,8 +1,379 @@
#ifndef SYSCALLS_H_INCLUDED #ifndef UMKA_H_INCLUDED
#define SYSCALLS_H_INCLUDED #define UMKA_H_INCLUDED
#include <inttypes.h> #include <inttypes.h>
#include "kolibri.h" #include <stdio.h>
#include <stdint.h>
#include <stddef.h>
#define BDFE_LEN_CP866 304
#define BDFE_LEN_UNICODE 560
typedef struct {
uint32_t left, top, right, bottom;
} rect_t;
typedef struct {
uint32_t left, top, width, height;
} box_t;
typedef struct {
uint32_t cpu_usage;
uint16_t window_stack_position;
uint16_t window_stack_value;
uint16_t pad;
char process_name[12];
uint32_t memory_start;
uint32_t used_memory;
uint32_t pid;
box_t box;
uint16_t slot_state;
uint16_t pad2;
box_t client_box;
uint8_t wnd_state;
uint8_t pad3[1024-71];
} __attribute__((packed)) process_information_t;
typedef struct {
uint32_t frame, grab, work_3d_dark, work_3d_light, grab_text, work,
work_button, work_button_text, work_text, work_graph;
} system_colors_t;
typedef enum {
DEFAULT_ENCODING,
CP866,
UTF16,
UTF8,
INVALID_ENCODING,
} fs_enc_t;
typedef enum {
F70 = 70,
F80 = 80,
} f70or80_t;
enum {
ERROR_SUCCESS,
ERROR_DISK_BASE,
ERROR_UNSUPPORTED_FS,
ERROR_UNKNOWN_FS,
ERROR_PARTITION,
ERROR_FILE_NOT_FOUND,
ERROR_END_OF_FILE,
ERROR_MEMORY_POINTER,
ERROR_DISK_FULL,
ERROR_FS_FAIL,
ERROR_ACCESS_DENIED,
ERROR_DEVICE,
ERROR_OUT_OF_MEMORY,
};
typedef struct lhead lhead_t;
struct lhead {
lhead_t *next;
lhead_t *prev;
};
typedef struct {
lhead_t wait_list;
uint32_t count;
} mutex_t;
typedef struct {
uint32_t flags;
uint32_t sector_size;
uint64_t capacity; // in sectors
} diskmediainfo_t;
typedef struct {
uintptr_t pointer;
uint32_t data_size;
uintptr_t data;
uint32_t sad_size;
uint32_t search_start;
uint32_t sector_size_log;
} disk_cache_t;
typedef struct {
uint64_t first_sector;
uint64_t length; // in sectors
void *disk;
void *fs_user_functions;
} partition_t;
typedef struct disk_t disk_t;
typedef struct {
uint32_t strucsize;
void (*close)(void *userdata) __attribute__((__stdcall__));
void (*closemedia)(void *userdata) __attribute__((__stdcall__));
int (*querymedia)(void *userdata, diskmediainfo_t *info) __attribute__((__stdcall__));
int (*read)(void *userdata, void *buffer, off_t startsector, size_t *numsectors) __attribute__((__stdcall__));
int (*write)(void *userdata, void *buffer, off_t startsector, size_t *numsectors) __attribute__((__stdcall__));
int (*flush)(void *userdata) __attribute__((__stdcall__));
unsigned int (*adjust_cache_size)(void *userdata, size_t suggested_size) __attribute__((__stdcall__));
} diskfunc_t;
struct disk_t {
disk_t *next;
disk_t *prev;
diskfunc_t *functions;
const char *name;
void *userdata;
uint32_t driver_flags;
uint32_t ref_count;
mutex_t media_lock;
uint8_t media_inserted;
uint8_t media_used;
uint16_t padding;
uint32_t media_ref_count;
diskmediainfo_t media_info;
uint32_t num_partitions;
partition_t **partitions;
uint32_t cache_size;
mutex_t cache_lock;
disk_cache_t sys_cache;
disk_cache_t app_cache;
};
typedef struct {
uint32_t attr;
uint32_t enc;
uint32_t ctime;
uint32_t cdate;
uint32_t atime;
uint32_t adate;
uint32_t mtime;
uint32_t mdate;
uint64_t size;
char name[0];
} bdfe_t;
typedef struct {
uint32_t status;
uint32_t count;
} f7080ret_t;
typedef struct {
uint32_t sf;
uint64_t offset;
uint32_t count;
void *buf;
union {
struct {
uint8_t zero;
const char *path;
} __attribute__((packed)) f70;
struct {
uint32_t path_encoding;
const char *path;
} f80;
} u;
} __attribute__((packed)) f7080s0arg_t;
typedef struct {
uint32_t sf;
uint32_t offset;
uint32_t encoding;
uint32_t size;
void *buf;
union {
struct {
uint8_t zero;
const char *path;
} __attribute__((packed)) f70;
struct {
uint32_t path_encoding;
const char *path;
} f80;
} u;
} __attribute__((packed)) f7080s1arg_t;
typedef struct {
uint32_t version;
uint32_t cnt;
uint32_t total_cnt;
uint32_t zeroed[5];
bdfe_t bdfes[0];
} f7080s1info_t;
typedef struct {
uint32_t sf;
uint32_t reserved1;
uint32_t flags;
uint32_t reserved2;
void *buf;
union {
struct {
uint8_t zero;
const char *path;
} __attribute__((packed)) f70;
struct {
uint32_t path_encoding;
const char *path;
} f80;
} u;
} __attribute__((packed)) f7080s5arg_t;
#define KF_READONLY 0x01
#define KF_HIDDEN 0x02
#define KF_SYSTEM 0x04
#define KF_LABEL 0x08
#define KF_FOLDER 0x10
#define KF_ATTR_CNT 5
#define HASH_SIZE 32
typedef struct {
uint8_t hash[HASH_SIZE];
uint8_t opaque[1024-HASH_SIZE];
} hash_context;
typedef struct {
uint32_t edi;
uint32_t esi;
uint32_t ebp;
uint32_t esp;
uint32_t ebx;
uint32_t edx;
uint32_t ecx;
uint32_t eax;
} pushad_t;
#define NET_TYPE_ETH 1
#define NET_TYPE_SLIP 2
// Link state
#define ETH_LINK_DOWN 0x0 // Link is down
#define ETH_LINK_UNKNOWN 0x1 // There could be an active link
#define ETH_LINK_FD 0x2 // full duplex flag
#define ETH_LINK_10M 0x4 // 10 mbit
#define ETH_LINK_100M 0x8 // 100 mbit
#define ETH_LINK_1G 0xc // gigabit
// Ethernet protocol numbers
#define ETHER_PROTO_ARP 0x0608
#define ETHER_PROTO_IPv4 0x0008
#define ETHER_PROTO_IPv6 0xDD86
#define ETHER_PROTO_PPP_DISCOVERY 0x6388
#define ETHER_PROTO_PPP_SESSION 0x6488
// Internet protocol numbers
#define IP_PROTO_IP 0
#define IP_PROTO_ICMP 1
#define IP_PROTO_TCP 6
#define IP_PROTO_UDP 17
#define IP_PROTO_RAW 255
// IP options
#define IP_TOS 1
#define IP_TTL 2
#define IP_HDRINCL 3
// PPP protocol numbers
#define PPP_PROTO_IPv4 0x2100
#define PPP_PROTO_IPV6 0x5780
#define PPP_PROTO_ETHERNET 666
// Protocol family
#define AF_INET4 AF_INET
typedef struct {
uint32_t device_type; // type field
uint32_t mtu; // Maximal Transmission Unit
char *name; // ptr to 0 terminated string
void *unload; // ptrs to driver functions
void *reset;
void *transmit;
uint64_t bytes_tx; // statistics, updated by the driver
uint64_t bytes_rx;
uint32_t packets_tx;
uint32_t packets_rx;
uint32_t link_state; // link state (0 = no link)
uint32_t hwacc; // bitmask stating enabled HW accelerations (offload
// engines)
uint8_t mac[6];
} net_device_t; // NET_DEVICE
typedef struct {
void *next; // pointer to next frame in list
void *prev; // pointer to previous frame in list
net_device_t *device; // ptr to NET_DEVICE structure
uint32_t type; // encapsulation type: e.g. Ethernet
size_t length; // size of encapsulated data
size_t offset; // offset to actual data (24 bytes for default frame)
uint8_t data[0];
} net_buff_t;
void kos_init(void);
void i40(void);
uint32_t kos_time_to_epoch(uint32_t *time);
void *disk_add(diskfunc_t *disk, const char *name, void *userdata, uint32_t flags) __attribute__((__stdcall__));
void *disk_media_changed(diskfunc_t *disk, int inserted) __attribute__((__stdcall__));
void disk_del(disk_t *disk) __attribute__((__stdcall__));
void hash_oneshot(void *ctx, void *data, size_t len);
void xfs_user_functions(void);
void ext_user_functions(void);
void fat_user_functions(void);
void ntfs_user_functions(void);
static inline void kos_enable_acpi() {
__asm__ __inline__ __volatile__ (
"pushad;"
"call enable_acpi;"
"popad"
:
:
: "memory", "cc");
}
typedef struct {
uint32_t value;
uint32_t errorcode;
} f75ret_t;
typedef struct {
uint32_t eax;
uint32_t ebx;
} f76ret_t;
static inline void kos_stack_init() {
__asm__ __inline__ __volatile__ (
"pushad;"
"call stack_init;"
"popad"
:
:
: "memory", "cc");
}
static inline int32_t kos_net_add_device(net_device_t *dev) {
int32_t dev_num;
__asm__ __inline__ __volatile__ (
"call net_add_device"
: "=a"(dev_num)
: "b"(dev)
: "ecx", "edx", "esi", "edi", "memory", "cc");
return dev_num;
}
void coverage_begin(void);
void coverage_end(void);
extern uint32_t *kos_lfb_base;
extern uint16_t *kos_win_stack;
extern uint16_t *kos_win_pos;
extern uint32_t kos_acpi_ssdt_cnt;
extern uint8_t **kos_acpi_ssdt_base;
extern size_t *kos_acpi_ssdt_size;
extern disk_t disk_list;
static inline void umka_i40(pushad_t *regs) { static inline void umka_i40(pushad_t *regs) {
@ -692,4 +1063,4 @@ static inline f76ret_t umka_sys_net_ipv4_set_addr(uint32_t dev_num,
// Function 76, Protocol 5 - ARP, Subfunction 6, Send ARP announce == // Function 76, Protocol 5 - ARP, Subfunction 6, Send ARP announce ==
// Function 76, Protocol 5 - ARP, Subfunction 7, Read # conflicts === // Function 76, Protocol 5 - ARP, Subfunction 7, Read # conflicts ===
#endif #endif // UMKA_H_INCLUDED

View File

@ -32,8 +32,7 @@
#include <unistd.h> #include <unistd.h>
#include <fcntl.h> #include <fcntl.h>
#include "vdisk.h" #include "vdisk.h"
#include "kolibri.h" #include "umka.h"
#include "syscalls.h"
#define DIRENTS_TO_READ 100 #define DIRENTS_TO_READ 100

View File

@ -35,8 +35,7 @@
#include <arpa/inet.h> #include <arpa/inet.h>
#include "vdisk.h" #include "vdisk.h"
#include "vnet.h" #include "vnet.h"
#include "kolibri.h" #include "umka.h"
#include "syscalls.h"
#include "trace.h" #include "trace.h"
#include "lodepng.h" #include "lodepng.h"

View File

@ -3,7 +3,7 @@
#include <string.h> #include <string.h>
#include <inttypes.h> #include <inttypes.h>
#include <errno.h> #include <errno.h>
#include "kolibri.h" #include "umka.h"
#include "trace.h" #include "trace.h"
#include "vdisk.h" #include "vdisk.h"

View File

@ -3,7 +3,7 @@
#include <stdio.h> #include <stdio.h>
#include <inttypes.h> #include <inttypes.h>
#include "kolibri.h" #include "umka.h"
void *vdisk_init(const char *fname, int adjust_cache_size, size_t cache_size); void *vdisk_init(const char *fname, int adjust_cache_size, size_t cache_size);

2
vnet.c
View File

@ -3,7 +3,7 @@
#include <string.h> #include <string.h>
#include <inttypes.h> #include <inttypes.h>
#include <errno.h> #include <errno.h>
#include "kolibri.h" #include "umka.h"
#include "trace.h" #include "trace.h"
typedef struct { typedef struct {

2
vnet.h
View File

@ -3,7 +3,7 @@
#include <stdio.h> #include <stdio.h>
#include <inttypes.h> #include <inttypes.h>
#include "kolibri.h" #include "umka.h"
void *vnet_init(void); void *vnet_init(void);