Clean excessive inline asm, mention tap0 in README.

This commit is contained in:
Ivan Baravy 2020-10-14 20:56:28 +03:00
parent d2cbe2e9e0
commit e834b93108
11 changed files with 88 additions and 85 deletions

23
README
View File

@ -55,7 +55,7 @@ BUILD
$ KOLIBRI=/path/to/kolibrios make $ KOLIBRI=/path/to/kolibrios make
/path/to/kolibrios is where you checked out `svn co svn://kolibrios.org`. /path/to/kolibrios is where you checked out 'svn co svn://kolibrios.org'.
Architecture Architecture
@ -75,7 +75,28 @@ sudo cp --parents /sys/firmware/acpi/tables/?SDT* /sys/bus/pci/devices/*/config
Troubleshooting Troubleshooting
--------------- ---------------
# lfbviewx
Allow reading process_vm_readv syscall.
# sysctl -w kernel.yama.ptrace_scope=0 # sysctl -w kernel.yama.ptrace_scope=0
# umka_os
Managing tap devices.
# ip tuntap add dev tap0 mode tap
# ip link set tap0 address 00:11:00:00:00:00
# ip addr add 10.50.0.1/24 dev tap0
# ip link set up dev tap0
# ip tuntap del dev tap0 mode tap
To create tap devices.
# setcap cap_net_admin+ep ../umka_os
Not yet used, but may be one day.
# sysctl -w vm.mmap_min_addr=0 # sysctl -w vm.mmap_min_addr=0

View File

@ -11,12 +11,6 @@ void reset_procmask(void) {
sigprocmask(SIG_UNBLOCK, &mask, NULL); sigprocmask(SIG_UNBLOCK, &mask, NULL);
} }
void set_procmask(void) {
sigemptyset (&mask);
sigaddset (&mask, SIGPROF);
sigprocmask(SIG_BLOCK, &mask, NULL);
}
int get_fake_if(ucontext_t *ctx) { int get_fake_if(ucontext_t *ctx) {
// we fake IF with id flag // we fake IF with id flag
return !(ctx->uc_mcontext.__gregs[REG_EFL] & (1 << 21)); return !(ctx->uc_mcontext.__gregs[REG_EFL] & (1 << 21));

View File

@ -1354,7 +1354,7 @@ void shell_pci_get_path(int argc, char **argv) {
void shell_stack_init(int argc, char **argv) { void shell_stack_init(int argc, char **argv) {
(void)argc; (void)argc;
(void)argv; (void)argv;
kos_stack_init(); umka_stack_init();
} }
void shell_net_add_device(int argc, char **argv) { void shell_net_add_device(int argc, char **argv) {

View File

@ -28,7 +28,7 @@ public coverage_end
public sha3_256_oneshot as 'hash_oneshot' public sha3_256_oneshot as 'hash_oneshot'
public kos_time_to_epoch public kos_time_to_epoch
public kos_init public umka_init
public CURRENT_TASK as 'kos_current_task' public CURRENT_TASK as 'kos_current_task'
public current_slot as 'kos_current_slot' public current_slot as 'kos_current_slot'
@ -52,7 +52,7 @@ public acpi_ssdt_size as 'kos_acpi_ssdt_size'
public acpi_ctx public acpi_ctx
public acpi_usage as 'kos_acpi_usage' public acpi_usage as 'kos_acpi_usage'
public stack_init public stack_init as 'kos_stack_init'
public net_add_device public net_add_device
public draw_data public draw_data
@ -60,12 +60,12 @@ public img_background
public mem_BACKGROUND public mem_BACKGROUND
public sys_background public sys_background
public REDRAW_BACKGROUND public REDRAW_BACKGROUND
public scheduler_add_thread public new_sys_threads as 'kos_new_sys_threads'
public new_sys_threads public osloop as 'kos_osloop'
public osloop
public set_mouse_data as 'kos_set_mouse_data' public set_mouse_data as 'kos_set_mouse_data'
public scheduler_current as 'kos_scheduler_current' public scheduler_current as 'kos_scheduler_current'
public eth_input as 'kos_eth_input' public eth_input as 'kos_eth_input'
public net_buff_alloc as 'kos_net_buff_alloc'
macro cli { macro cli {
pushfd pushfd
@ -288,7 +288,7 @@ proc kos_time_to_epoch c uses ebx esi edi ebp, _time
ret ret
endp endp
proc kos_init c uses ebx esi edi ebp proc umka_init c uses ebx esi edi ebp
mov edi, endofcode mov edi, endofcode
mov ecx, uglobals_size mov ecx, uglobals_size
xor eax, eax xor eax, eax
@ -539,36 +539,20 @@ proc delay_ms
ret ret
endp endp
;public inject_packet as 'kos_inject_packet' public umka_cli
public umka_inject_packet proc umka_cli
proc umka_inject_packet c uses ebx esi edi, _data, _size, _dev cli ; macro
mov ebx, [_dev] ret
mov ecx, [_size] endp
push ecx
add ecx, NET_BUFF.data
stdcall net_buff_alloc, ecx ; Allocate a buffer to put packet into
pop ecx
test eax, eax ; Test if we allocated succesfully
jz .abort
mov [eax + NET_BUFF.length], ecx
mov [eax + NET_BUFF.device], ebx
mov [eax + NET_BUFF.offset], NET_BUFF.data
lea edi, [eax + NET_BUFF.data] ; Where we will copy too public umka_sti
mov esi, [_data] ; The buffer we will copy from proc umka_sti
rep movsb sti ; macro
push .abort
push eax ; buffer ptr for Eth_input
jmp eth_input ; Send it to kernel
.abort:
ret ret
endp endp
extrn reset_procmask extrn reset_procmask
extrn get_fake_if extrn get_fake_if
extrn restart_timer
public irq0 public irq0
proc irq0 c, _signo, _info, _context proc irq0 c, _signo, _info, _context
DEBUGF 2, "### irq0\n" DEBUGF 2, "### irq0\n"

15
umka.h
View File

@ -346,10 +346,10 @@ typedef struct {
uint16_t ttl; uint16_t ttl;
} arp_entry_t; } arp_entry_t;
void osloop(void); void kos_osloop(void);
void irq0(int signo, siginfo_t *info, void *context); void irq0(int signo, siginfo_t *info, void *context);
void kos_init(void); void umka_init(void);
void i40(void); void i40(void);
uint32_t kos_time_to_epoch(uint32_t *time); uint32_t kos_time_to_epoch(uint32_t *time);
@ -380,12 +380,12 @@ static inline void umka_mouse_move(int lbheld, int mbheld, int rbheld,
kos_set_mouse_data(btn_state, xmoving, ymoving, vscroll, hscroll); kos_set_mouse_data(btn_state, xmoving, ymoving, vscroll, hscroll);
} }
void umka_inject_packet(void *data, size_t size, net_device_t *dev); net_buff_t *kos_net_buff_alloc(size_t size) __attribute__((__stdcall__));
static inline void umka_new_sys_threads(uint32_t flags, void (*entry)(), void *stack) { static inline void umka_new_sys_threads(uint32_t flags, void (*entry)(), void *stack) {
__asm__ __inline__ __volatile__ ( __asm__ __inline__ __volatile__ (
"pushad;" "pushad;"
"call new_sys_threads;" "call kos_new_sys_threads;"
"popad" "popad"
: :
: "b"(flags), : "b"(flags),
@ -426,10 +426,10 @@ typedef struct {
uint32_t ebx; uint32_t ebx;
} f76ret_t; } f76ret_t;
static inline void kos_stack_init() { static inline void umka_stack_init() {
__asm__ __inline__ __volatile__ ( __asm__ __inline__ __volatile__ (
"pushad;" "pushad;"
"call stack_init;" "call kos_stack_init;"
"popad" "popad"
: :
: :
@ -447,6 +447,9 @@ static inline int32_t kos_net_add_device(net_device_t *dev) {
return dev_num; return dev_num;
} }
void umka_cli(void);
void umka_sti(void);
extern uint8_t coverage_begin[]; extern uint8_t coverage_begin[];
extern uint8_t coverage_end[]; extern uint8_t coverage_end[];

View File

@ -51,7 +51,7 @@ static void bdfe_to_stat(bdfe_t *kf, struct stat *st) {
st->st_ctime = kos_time_to_epoch(&(kf->ctime)); st->st_ctime = kos_time_to_epoch(&(kf->ctime));
} }
static void *umka_init(struct fuse_conn_info *conn, static void *umka_fuse_init(struct fuse_conn_info *conn,
struct fuse_config *cfg) { struct fuse_config *cfg) {
(void) conn; (void) conn;
cfg->kernel_cache = 1; cfg->kernel_cache = 1;
@ -131,7 +131,7 @@ static int umka_read(const char *path, char *buf, size_t size, off_t offset,
} }
static struct fuse_operations umka_oper = { static struct fuse_operations umka_oper = {
.init = umka_init, .init = umka_fuse_init,
.getattr = umka_getattr, .getattr = umka_getattr,
.readdir = umka_readdir, .readdir = umka_readdir,
.open = umka_open, .open = umka_open,
@ -144,7 +144,7 @@ int main(int argc, char *argv[]) {
printf("usage: umka_fuse dir img\n"); printf("usage: umka_fuse dir img\n");
exit(1); exit(1);
} }
kos_init(); umka_init();
void *userdata = vdisk_init(argv[2], 1, 0u); void *userdata = vdisk_init(argv[2], 1, 0u);
void *vdisk = disk_add(&vdisk_functions, "hd0", userdata, 0); void *vdisk = disk_add(&vdisk_functions, "hd0", userdata, 0);
disk_media_changed(vdisk, 1); disk_media_changed(vdisk, 1);

View File

@ -13,12 +13,7 @@
#define MONITOR_THREAD_STACK_SIZE 0x100000 #define MONITOR_THREAD_STACK_SIZE 0x100000
void monitor() { void monitor() {
__asm__ __inline__ __volatile__ ( umka_sti();
"pushfd;"
"btr dword ptr[esp], 21;"
"popfd"
: : : "memory");
fprintf(stderr, "Start monitor thread\n"); fprintf(stderr, "Start monitor thread\n");
// mkfifo("/tmp/umka.fifo.2u", 0644); // mkfifo("/tmp/umka.fifo.2u", 0644);
// mkfifo("/tmp/umka.fifo.4u", 0644); // mkfifo("/tmp/umka.fifo.4u", 0644);
@ -39,12 +34,7 @@ struct itimerval timeout = {.it_value = {.tv_sec = 0, .tv_usec = 10000},
.it_interval = {.tv_sec = 0, .tv_usec = 10000}}; .it_interval = {.tv_sec = 0, .tv_usec = 10000}};
int main() { int main() {
__asm__ __inline__ __volatile__ ( umka_sti();
"pushfd;"
"btr dword ptr[esp], 21;"
"popfd"
: : : "memory");
umka_tool = UMKA_OS; umka_tool = UMKA_OS;
struct sigaction sa; struct sigaction sa;
@ -57,7 +47,6 @@ int main() {
return 1; return 1;
} }
/* /*
void *app_base = mmap((void*)0x000000, 16*0x100000, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); void *app_base = mmap((void*)0x000000, 16*0x100000, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if (app_base == MAP_FAILED) { if (app_base == MAP_FAILED) {
@ -67,8 +56,8 @@ int main() {
*/ */
printf("pid=%d, kos_lfb_base=%p\n", getpid(), (void*)kos_lfb_base); printf("pid=%d, kos_lfb_base=%p\n", getpid(), (void*)kos_lfb_base);
kos_init(); umka_init();
kos_stack_init(); umka_stack_init();
uint8_t *monitor_stack = malloc(MONITOR_THREAD_STACK_SIZE); uint8_t *monitor_stack = malloc(MONITOR_THREAD_STACK_SIZE);
umka_new_sys_threads(0, monitor, monitor_stack + MONITOR_THREAD_STACK_SIZE); umka_new_sys_threads(0, monitor, monitor_stack + MONITOR_THREAD_STACK_SIZE);
@ -80,7 +69,7 @@ int main() {
setitimer(ITIMER_PROF, &timeout, NULL); setitimer(ITIMER_PROF, &timeout, NULL);
osloop(); // doesn't return kos_osloop(); // doesn't return
return 0; return 0;
} }

View File

@ -83,12 +83,7 @@ int tapfd;
_Atomic int go_ping = 0; _Atomic int go_ping = 0;
int umka_thread_ping(void) { int umka_thread_ping(void) {
__asm__ __inline__ __volatile__ ( umka_sti();
"pushfd;"
"btr dword ptr[esp], 21;"
"popfd"
: : : "memory");
while (!go_ping) { /* wait until initialized */ } while (!go_ping) { /* wait until initialized */ }
fprintf(stderr, "[ping] tapfd is %i\n", tapfd); fprintf(stderr, "[ping] tapfd is %i\n", tapfd);
@ -135,26 +130,19 @@ int umka_thread_ping(void) {
return 0; return 0;
} }
uint8_t buffer[2*1024];
int plen = 0;
void umka_thread_net_drv(void) { void umka_thread_net_drv(void) {
__asm__ __inline__ __volatile__ ( umka_sti();
"pushfd;"
"btr dword ptr[esp], 21;"
"popfd"
: : : "memory");
fprintf(stderr, "[net_drv] starting\n"); fprintf(stderr, "[net_drv] starting\n");
uint8_t buffer[2048];
int plen = 0;
char tapdev[IFNAMSIZ] = "tap0"; char tapdev[IFNAMSIZ] = "tap0";
tapfd = tap_alloc(tapdev); tapfd = tap_alloc(tapdev);
net_device_t *vnet = vnet_init(tapfd); net_device_t *vnet = vnet_init(tapfd);
kos_net_add_device(vnet); kos_net_add_device(vnet);
umka_sys_net_dev_reset(1);
char devname[64]; char devname[64];
for (size_t i = 0; i < umka_sys_net_get_dev_count(); i++) { for (size_t i = 0; i < umka_sys_net_get_dev_count(); i++) {
// umka_sys_net_dev_reset(i); umka_sys_net_dev_reset(i);
umka_sys_net_get_dev_name(i, devname); umka_sys_net_get_dev_name(i, devname);
uint32_t devtype = umka_sys_net_get_dev_type(i); uint32_t devtype = umka_sys_net_get_dev_type(i);
printf("[net_drv] device %i: %s %u\n", i, devname, devtype); printf("[net_drv] device %i: %s %u\n", i, devname, devtype);
@ -197,7 +185,7 @@ void umka_thread_net_drv(void) {
fprintf(stderr, " %2.2x", buffer[i]); fprintf(stderr, " %2.2x", buffer[i]);
} }
fprintf(stderr, "\n"); fprintf(stderr, "\n");
umka_inject_packet(buffer, plen, vnet); vnet_receive_frame(vnet, buffer, plen);
} else if(plen == -1 && (errno == EAGAIN || errno == EINTR)) { } else if(plen == -1 && (errno == EAGAIN || errno == EINTR)) {
continue; continue;
} else { } else {

View File

@ -77,7 +77,7 @@ int main(int argc, char **argv) {
trace_begin(); trace_begin();
COVERAGE_ON(); COVERAGE_ON();
kos_init(); umka_init();
COVERAGE_OFF(); COVERAGE_OFF();
run_test(fin, fout, 1); run_test(fin, fout, 1);

22
vnet.c
View File

@ -83,3 +83,25 @@ int vnet_transmit(net_buff_t *buf) {
return 0; return 0;
} }
void vnet_receive_frame(net_device_t *dev, void *data, size_t size) {
net_buff_t *buf = kos_net_buff_alloc(size + offsetof(net_buff_t, data));
if (!buf) {
fprintf(stderr, "[vnet] Can't allocate network buffer!\n");
return;
}
buf->length = size;
buf->device = dev;
buf->offset = offsetof(net_buff_t, data);
memcpy(buf->data, data, size);
__asm__ __inline__ __volatile__ (
"pushad;"
"lea ecx, 1f;"
"push ecx;"
"push eax;"
"jmp kos_eth_input;"
"1:"
"popad"
:
: "a"(buf)
: "memory", "ecx");
}

2
vnet.h
View File

@ -16,4 +16,6 @@ void vnet_reset(void);
__attribute__((__stdcall__)) __attribute__((__stdcall__))
int vnet_transmit(net_buff_t *buf); int vnet_transmit(net_buff_t *buf);
void vnet_receive_frame(net_device_t *dev, void *data, size_t size);
#endif // VNET_H_INCLUDED #endif // VNET_H_INCLUDED