2021-08-30 10:24:51 -04:00
|
|
|
/**
|
2021-09-13 13:07:00 -04:00
|
|
|
* Implementation of 68000 specific syscall routines.
|
2021-09-13 20:39:41 -04:00
|
|
|
*
|
2021-08-30 10:24:51 -04:00
|
|
|
* NOTE: these routines are not called directly but are instead called through TRAP#13
|
|
|
|
*/
|
|
|
|
|
2021-09-21 19:07:45 -04:00
|
|
|
#include "log.h"
|
2021-09-03 17:49:24 -04:00
|
|
|
#include "types.h"
|
2021-09-13 13:07:00 -04:00
|
|
|
#include "syscalls.h"
|
2021-09-21 19:07:45 -04:00
|
|
|
#include "interrupt.h"
|
2021-10-29 18:45:58 -04:00
|
|
|
#include "proc.h"
|
2021-09-13 13:07:00 -04:00
|
|
|
#include "dev/channel.h"
|
2021-09-21 19:07:45 -04:00
|
|
|
#include "dev/block.h"
|
|
|
|
#include "dev/fsys.h"
|
2021-10-29 18:45:58 -04:00
|
|
|
#include "dev/rtc.h"
|
2021-08-30 22:01:09 -04:00
|
|
|
|
2021-08-30 10:24:51 -04:00
|
|
|
/*
|
2021-09-13 13:07:00 -04:00
|
|
|
* Determine the correct system function implementation and call it.
|
2021-08-30 10:24:51 -04:00
|
|
|
*/
|
2021-10-30 15:38:39 -04:00
|
|
|
unsigned long syscall_dispatch(int32_t function, int32_t param0, int32_t param1, int32_t param2, int32_t param3, int32_t param4, int32_t param5) {
|
2021-09-21 19:07:45 -04:00
|
|
|
switch (function & 0x00f0) {
|
|
|
|
case 0x00:
|
|
|
|
/* Core System Calls */
|
|
|
|
switch (function) {
|
|
|
|
case KFN_EXIT:
|
2021-09-30 13:39:39 -04:00
|
|
|
proc_exit((int)param0);
|
2021-09-21 19:07:45 -04:00
|
|
|
break;
|
|
|
|
|
|
|
|
case KFN_WARMBOOT:
|
|
|
|
break;
|
|
|
|
|
|
|
|
case KFN_INT_REGISTER:
|
|
|
|
return (int32_t)int_register((unsigned short)param0, (p_int_handler)param1);
|
|
|
|
|
|
|
|
case KFN_INT_ENABLE:
|
|
|
|
int_enable((unsigned short)param0);
|
|
|
|
return;
|
|
|
|
|
|
|
|
case KFN_INT_DISABLE:
|
|
|
|
int_disable((unsigned short)param0);
|
|
|
|
return;
|
|
|
|
|
|
|
|
case KFN_INT_ENABLE_ALL:
|
2021-10-29 18:45:58 -04:00
|
|
|
return int_enable_all();
|
2021-09-21 19:07:45 -04:00
|
|
|
|
|
|
|
case KFN_INT_DISABLE_ALL:
|
2021-10-29 18:45:58 -04:00
|
|
|
return int_disable_all();
|
2021-09-21 19:07:45 -04:00
|
|
|
|
|
|
|
case KFN_INT_CLEAR:
|
|
|
|
int_clear((unsigned short)param0);
|
|
|
|
return;
|
|
|
|
|
|
|
|
case KFN_INT_PENDING:
|
|
|
|
return int_pending((unsigned short)param0);
|
|
|
|
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 0x10:
|
|
|
|
/* Channel system calls */
|
|
|
|
switch (function) {
|
|
|
|
case KFN_CHAN_WRITE_B:
|
|
|
|
return chan_write_b((short)param0, (uint8_t)param1);
|
|
|
|
|
|
|
|
case KFN_CHAN_WRITE:
|
|
|
|
return chan_write((short)param0, (const uint8_t *)param1, (short)param2);
|
|
|
|
|
|
|
|
case KFN_CHAN_READ_B:
|
|
|
|
return chan_read_b((short)param0);
|
|
|
|
|
|
|
|
case KFN_CHAN_READ:
|
|
|
|
return chan_read((short)param0, (const uint8_t *)param1, (short)param2);
|
|
|
|
|
|
|
|
case KFN_CHAN_READ_LINE:
|
|
|
|
return chan_readline((short)param0, (const uint8_t *)param1, (short)param2);
|
|
|
|
|
|
|
|
case KFN_CHAN_STATUS:
|
|
|
|
return chan_status((short)param0);
|
|
|
|
|
|
|
|
case KFN_CHAN_FLUSH:
|
|
|
|
return chan_flush((short)param0);
|
|
|
|
|
|
|
|
case KFN_CHAN_SEEK:
|
|
|
|
return chan_seek((short)param0, (long)param1, (short)param2);
|
2021-09-13 13:07:00 -04:00
|
|
|
|
2021-09-21 19:07:45 -04:00
|
|
|
case KFN_CHAN_IOCTRL:
|
|
|
|
return chan_ioctrl((short)param0, (short)param1, (unsigned char *)param2, (short)param3);
|
2021-08-30 10:24:51 -04:00
|
|
|
|
2021-09-21 19:07:45 -04:00
|
|
|
case KFN_CHAN_REGISTER:
|
|
|
|
return cdev_register((p_dev_chan)param0);
|
2021-09-19 19:16:41 -04:00
|
|
|
|
2021-09-21 19:07:45 -04:00
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
2021-09-19 19:16:41 -04:00
|
|
|
|
2021-09-21 19:07:45 -04:00
|
|
|
case 0x20:
|
|
|
|
/* Block device system calls */
|
|
|
|
switch (function) {
|
|
|
|
case KFN_BDEV_GETBLOCK:
|
|
|
|
return bdev_read((short)param0, (long)param1, (unsigned char *)param2, (short)param3);
|
|
|
|
|
|
|
|
case KFN_BDEV_PUTBLOCK:
|
|
|
|
return bdev_write((short)param0, (long)param1, (unsigned char *)param2, (short)param3);
|
|
|
|
|
|
|
|
case KFN_BDEV_FLUSH:
|
|
|
|
return bdev_flush((short)param0);
|
|
|
|
|
|
|
|
case KFN_BDEV_STATUS:
|
|
|
|
return bdev_status((short)param0);
|
|
|
|
|
|
|
|
case KFN_BDEV_IOCTRL:
|
|
|
|
return bdev_ioctrl((short)param0, (short)param1, (unsigned char *)param2, (short)param3);
|
|
|
|
|
|
|
|
case KFN_BDEV_REGISTER:
|
|
|
|
return bdev_register((p_dev_block)param0);
|
|
|
|
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 0x30:
|
|
|
|
/* File System Calls */
|
|
|
|
switch (function) {
|
|
|
|
case KFN_OPEN:
|
|
|
|
return fsys_open((const char *)param0, (short)param1);
|
|
|
|
|
|
|
|
case KFN_CLOSE:
|
|
|
|
return fsys_close((short)param0);
|
|
|
|
|
|
|
|
case KFN_OPENDIR:
|
|
|
|
return fsys_opendir((const char *)param0);
|
|
|
|
|
|
|
|
case KFN_CLOSEDIR:
|
|
|
|
return fsys_closedir((short)param0);
|
|
|
|
|
|
|
|
case KFN_READDIR:
|
|
|
|
return fsys_readdir((short)param0, (p_file_info)param1);
|
|
|
|
|
|
|
|
case KFN_FINDFIRST:
|
|
|
|
return fsys_findfirst((const char *)param0, (const char *)param1, (p_file_info)param2);
|
|
|
|
|
|
|
|
case KFN_FINDNEXT:
|
|
|
|
return fsys_findnext((short)param0, (p_file_info)param1);
|
|
|
|
|
|
|
|
case KFN_DELETE:
|
|
|
|
return fsys_delete((const char *)param0);
|
|
|
|
|
|
|
|
case KFN_RENAME:
|
|
|
|
return fsys_rename((const char *)param0, (const char *)param1);
|
|
|
|
|
2021-10-29 18:45:58 -04:00
|
|
|
case KFN_LOAD:
|
|
|
|
return fsys_load((char *)param0, (long)param1, (long *)param2);
|
|
|
|
|
|
|
|
case KFN_SAVE:
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
case KFN_LOAD_REGISTER:
|
|
|
|
return fsys_register_loader((char *)param0, (p_file_loader)param1);
|
|
|
|
|
2021-09-21 19:07:45 -04:00
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
2021-09-19 19:16:41 -04:00
|
|
|
|
2021-10-29 18:45:58 -04:00
|
|
|
case 0x40:
|
2021-10-31 16:25:49 -04:00
|
|
|
/* Process and Memory functions */
|
|
|
|
case KFN_RUN:
|
|
|
|
return proc_run((char *)param0, (int)param1, (char *)param2);
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 0x50:
|
|
|
|
/* Misc functions */
|
2021-10-29 18:45:58 -04:00
|
|
|
switch (function) {
|
|
|
|
case KFN_GET_TIMECODE:
|
|
|
|
return rtc_get_jiffies();
|
|
|
|
|
|
|
|
case KFN_SET_DATETIME:
|
|
|
|
rtc_set_time((p_time)param0);
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
case KFN_GET_DATETIME:
|
|
|
|
rtc_get_time((p_time)param0);
|
|
|
|
return 0;
|
|
|
|
|
2021-10-30 15:38:39 -04:00
|
|
|
case KFN_ERR_MESSAGE:
|
|
|
|
return (unsigned long)err_message((short)param0);
|
|
|
|
|
2021-10-29 18:45:58 -04:00
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2021-08-30 22:01:09 -04:00
|
|
|
default:
|
2021-09-21 19:07:45 -04:00
|
|
|
break;
|
2021-08-30 22:01:09 -04:00
|
|
|
}
|
2021-09-21 19:07:45 -04:00
|
|
|
|
|
|
|
DEBUG("syscall unknown function\n");
|
|
|
|
do {} while (1);
|
|
|
|
return -1;
|
2021-09-13 20:39:41 -04:00
|
|
|
}
|