/programs/develop/libraries/kolibri-libc/include/sys/ksys.h |
---|
49,15 → 49,6 |
}ksys_oskey_t; |
typedef struct{ |
unsigned handle; |
unsigned io_code; |
unsigned *input; |
int inp_size; |
void *output; |
int out_size; |
}ksys_ioctl_t; |
typedef struct{ |
void *data; |
size_t size; |
}ksys_ufile_t; |
152,6 → 143,17 |
void* func_ptr; |
}ksys_coff_etable_t; |
typedef void* ksys_drv_hand_t; |
typedef struct{ |
ksys_drv_hand_t handler; |
unsigned func_num; |
void* in_data_ptr; |
unsigned in_data_size; |
void* out_data_ptr; |
unsigned out_data_size; |
}ksys_drv_ctl_t; |
#pragma pack(pop) |
enum KSYS_EVENTS { |
999,6 → 1001,33 |
); |
} |
/* Driver functions */ |
static inline |
ksys_drv_hand_t _ksys_load_driver(char *driver_name) |
{ |
ksys_drv_hand_t driver_h; |
asm_inline( |
"int $0x40" |
:"=a"(driver_h) |
:"a"(68), "b"(16), "c"(driver_name) |
); |
return driver_h; |
} |
static inline |
unsigned _ksys_work_driver(ksys_drv_ctl_t *ioctl) |
{ |
unsigned status; |
asm_inline( |
"int $0x40" |
:"=a"(status) |
:"a"(68), "b"(17), "c"(ioctl) |
:"memory" |
); |
return status; |
} |
#ifdef __cplusplus |
} |
#endif |
/programs/develop/libraries/kolibri-libc/samples/Makefile |
---|
1,5 → 1,5 |
KTCC=../linuxtools/kos32-tcc |
KTCC=../../../ktcc/trunk/bin/kos32-tcc |
KPACK = kpack |
CFLAGS = -I../include |
LDFLAGS = -nostdlib -L../lib ../lib/crt0.o |
11,6 → 11,7 |
string_test.kex \ |
whois.kex \ |
file_io.kex \ |
tmpdisk_work.kex |
all: $(BIN) |
/programs/develop/libraries/kolibri-libc/samples/tmpdisk_work.c |
---|
0,0 → 1,56 |
#include "stddef.h" |
#include <sys/ksys.h> |
#include <stdio.h> |
#include <stdlib.h> |
#define DEV_ADD_DISK 1 |
#define TMPDISK_SIZE 10 //Mb |
#pragma pack(push, 1) |
struct{ |
unsigned disk_size; |
unsigned char disk_id; |
}tmpdisk_add; |
#pragma pack(pop) |
char *tmpdisk_res_text[]={ |
"TmpDisk operation completed successfully", |
"Unknown IOCTL code, wrong input/output size...", |
"DiskId must be from 0 to 9", |
"DiskSize is too large", |
"DiskSize is too small, might be too little free RAM", |
"Memory allocation failed", |
"Unknown error O_o", |
0}; |
int main(){ |
ksys_drv_hand_t tmpdisk_drv = _ksys_load_driver("tmpdisk"); |
if(!tmpdisk_drv){ |
puts("tmpdisk.sys driver not load!"); |
exit(0); |
}else{ |
puts("tmpdisk.sys driver is load!"); |
} |
tmpdisk_add.disk_size = TMPDISK_SIZE*1024*1024/512; |
tmpdisk_add.disk_id = 5; |
ksys_drv_ctl_t ioctl; |
ioctl.func_num = DEV_ADD_DISK; |
ioctl.handler = tmpdisk_drv; |
ioctl.in_data_ptr = &tmpdisk_add; |
ioctl.in_data_size = sizeof(tmpdisk_add); |
ioctl.out_data_ptr = NULL; |
ioctl.out_data_size = 0; |
printf("Create '/tmp%u/' disk a %u Mb size...\n", tmpdisk_add.disk_id, TMPDISK_SIZE); |
unsigned status =_ksys_work_driver(&ioctl); |
if(status<7){ |
puts(tmpdisk_res_text[status]); |
}else{ |
puts(tmpdisk_res_text[6]); |
} |
exit(0); |
} |
/programs/develop/libraries/kolibri-libc/source/Makefile |
---|
1,6 → 1,7 |
ifndef GCC |
GCC=kos32-gcc |
endif |
CC=kos32-gcc |
KPACK=kpack |
FASM=fasm |
14,8 → 15,11 |
mkdir -p exports ../lib |
../linuxtools/ExportGen symbols.txt exports/exports.c |
$(FASM) crt/crt0.asm ../lib/crt0.o |
$(CC) $(CFLAGS) $(SRC) -o $(LIB) |
$(GCC) $(CFLAGS) $(SRC) -o $(LIB) |
$(KPACK) $(LIB) |
../linuxtools/LoaderGen symbols.txt ../loader |
../linuxtools/LoaderBuild ../loader |
rm -rf exports |
install: |
cp -f ../lib/libc.obj ~/.kex/root/RD/1/LIB |