/drivers/ddk/core.S |
---|
26,9 → 26,13 |
.global _FreeKernelSpace |
.global _FreePage |
.global _FS_Service |
.global _GetClockNs |
.global _GetCpuFreq |
.global _GetCurrSlot |
.global _GetDisplay |
.global _GetEvent |
.global _GetPgAddr |
83,8 → 87,6 |
.global _WaitEvent |
.global _WaitEventTimeout |
.global _FS_Service |
.def _AcpiGetRootPtr; .scl 2; .type 32; .endef |
.def _AllocKernelSpace; .scl 2; .type 32; .endef |
109,10 → 111,11 |
.def _FreeKernelSpace; .scl 2; .type 32; .endef |
.def _FreePage; .scl 2; .type 32; .endef |
.def _FS_Service; .scl 2; .type 32; .endef |
.def _GetClockNs; .scl 2; .type 32; .endef |
.def _GetDisplay; .scl 2; .type 32; .endef |
.def _GetCurrSlot; .scl 2; .type 32; .endef |
.def _GetDisplay; .scl 2; .type 32; .endef |
.def _GetEvent; .scl 2; .type 32; .endef |
167,8 → 170,6 |
.def _WaitEvent; .scl 2; .type 32; .endef |
.def _WaitEventTimeout; .scl 2; .type 32; .endef |
.def _FS_Service; .scl 2; .type 32; .endef |
_AcpiGetRootPtr: |
_AllocKernelSpace: |
195,8 → 196,13 |
_FreeKernelSpace: |
_FreePage: |
_FS_Service: |
_GetClockNs: |
_GetCpuFreq: |
_GetCurrSlot: |
_GetDisplay: |
_GetEvent: |
_GetPCIList: |
247,9 → 253,6 |
_UserFree: |
_WaitEvent: |
_WaitEventTimeout: |
_FS_Service: |
ret |
.section .drectve |
278,8 → 281,13 |
.ascii " -export:FreeKernelSpace" # stdcall |
.ascii " -export:FreePage" # |
.ascii " -export:FS_Service" # watch system call 70 |
.ascii " -export:GetClockNs" # |
.ascii " -export:GetCpuFreq" # |
.ascii " -export:GetCurrSlot" |
.ascii " -export:GetDisplay" # stdcall |
.ascii " -export:GetEvent" # |
.ascii " -export:GetPCIList" # |
290,7 → 298,6 |
.ascii " -export:GetStackBase" # |
.ascii " -export:GetWindowRect" # fastcall |
.ascii " -export:KernelAlloc" # stdcall |
.ascii " -export:KernelFree" # stdcall |
332,4 → 339,3 |
.ascii " -export:WaitEvent" # stdcall |
.ascii " -export:WaitEventTimeout" # stdcall |
.ascii " -export:FS_Service" # watch system call 70 |
/drivers/ddk/linux/mutex.c |
---|
25,22 → 25,6 |
#include <linux/spinlock.h> |
#include <syscall.h> |
struct kos_taskdata |
{ |
u32 event_mask; |
u32 pid; |
u16 r0; |
u8 state; |
u8 r1; |
u16 r2; |
u8 wnd_number; |
u8 r3; |
u32 mem_start; |
u32 counter_sum; |
u32 counter_add; |
u32 cpu_usage; |
}__attribute__((packed)); |
static inline void mutex_set_owner(struct mutex *lock) |
{ |
} |
144,11 → 128,12 |
*/ |
flags = safe_cli(); |
list_for_each_entry(cur, &lock->base.wait_list, list) { |
((struct kos_taskdata*)cur->task)->state = 0; |
((struct kos_appdata*)cur->task)->state = KOS_SLOT_STATE_RUNNING; |
} |
safe_sti(flags); |
} |
static __always_inline void |
ww_mutex_set_context_slowpath(struct ww_mutex *lock, |
struct ww_acquire_ctx *ctx) |
{ |
162,7 → 147,7 |
* so they can recheck if they have to back off. |
*/ |
list_for_each_entry(cur, &lock->base.wait_list, list) { |
((struct kos_taskdata*)cur->task)->state = 0; |
((struct kos_appdata*)cur->task)->state = KOS_SLOT_STATE_RUNNING; |
} |
} |
170,13 → 155,13 |
{ |
struct mutex *lock; |
struct mutex_waiter waiter; |
struct kos_taskdata* taskdata; |
struct kos_appdata *appdata; |
u32 eflags; |
int ret = 0; |
lock = &ww->base; |
taskdata = (struct kos_taskdata*)(0x80003010); |
waiter.task = (u32*)taskdata; |
appdata = GetCurrSlot(); |
waiter.task = appdata; |
eflags = safe_cli(); |
192,7 → 177,7 |
if (ret) |
goto err; |
}; |
taskdata->state = 1; |
appdata->state = KOS_SLOT_STATE_SUSPENDED; |
change_task(); |
}; |
/drivers/include/linux/mutex.h |
---|
58,7 → 58,7 |
*/ |
struct mutex_waiter { |
struct list_head list; |
int *task; |
void *task; |
}; |
/drivers/include/syscall.h |
---|
3,13 → 3,16 |
#include <ddk.h> |
#define ASSERT_CONCAT_(a, b) a##b |
#define ASSERT_CONCAT(a, b) ASSERT_CONCAT_(a, b) |
#define STATIC_ASSERT(e) enum { ASSERT_CONCAT(assert_line_, __LINE__) = 1/(!!(e)) } |
typedef u32 addr_t; |
typedef u32 count_t; |
#pragma pack(push, 1) |
typedef struct |
{ |
typedef struct { |
int width; |
int height; |
int bpp; |
16,8 → 19,7 |
int freq; |
}videomode_t; |
struct kos32_pdev |
{ |
struct kos32_pdev { |
struct kos32_pdev *prev; |
struct kos32_pdev *next; |
u32 devid; |
28,6 → 30,96 |
u32 owner; |
}; |
// struct BOX in const.inc |
struct kos_wnd_box { |
u32 left; |
u32 top; |
u32 width; |
u32 height; |
}; |
// struct DBG_REGS in const.inc |
struct kos_dbg_regs { |
u32 dr0; |
u32 dr1; |
u32 dr2; |
u32 dr3; |
u32 dr7; |
}; |
struct kos_lhead { |
struct kos_lhead *prev; |
struct kos_lhead *next; |
}; |
enum KOS_SLOT_STATES { |
KOS_SLOT_STATE_RUNNING = 0, |
KOS_SLOT_STATE_SUSPENDED = 1, |
KOS_SLOT_STATE_SUSPENDED_WAIT_EVENT = 2, |
KOS_SLOT_STATE_NORMAL_TERM = 3, |
KOS_SLOT_STATE_EXCEPT_TERM = 4, |
KOS_SLOT_STATE_WAIT_EVENT = 5, |
KOS_SLOT_STATE_FREE = 9 |
}; |
struct kos_appdata { |
char app_name[16]; |
struct kos_lhead list; |
u32 process; |
u32 fpu_state; |
u32 exc_handler; |
u32 except_mask; |
u32 pl0_stack; |
u32 cursor; |
u32 fd_ev; |
u32 bk_ev; |
u32 fd_obj; |
u32 bk_obj; |
u32 saved_esp; |
u32 io_map[2]; |
u32 dbg_state; |
char* cur_dir; |
u32 wait_timeout; |
u32 saved_esp0; |
u32 wait_begin; |
u32 wait_test; |
u32 wait_param; |
u32 tls_base; |
u32 event_mask; |
u32 tid; |
u32 draw_bgr_x; |
u32 draw_bgr_y; |
u8 state; |
u8 wnd_number; |
u16 __reserved1; |
u32 wnd_shape; |
u32 wnd_shape_scale; |
u32 __reserved2; |
u32 counter_sum; |
struct kos_wnd_box saved_box; |
u32 ipc_start; |
u32 ipc_size; |
u32 occurred_events; |
u32 debugger_slot; |
u32 terminate_protection; |
u8 keyboard_mode; |
u8 captionEncoding; |
u8 __reserved3[2]; |
char* exec_params; |
u32 dbg_event_mem; |
struct kos_dbg_regs dbg_regs; |
char* wnd_caption; |
struct kos_wnd_box wnd_clientbox; |
u32 priority; |
struct kos_lhead in_schedule; |
u32 counter_add; |
u32 cpu_usage; |
u32 __reserved4; |
}; |
#define KOS_APPDATA_SIZE 256 |
STATIC_ASSERT(sizeof(struct kos_appdata) == KOS_APPDATA_SIZE); |
typedef struct { |
unsigned p00; |
union{ |
133,6 → 225,8 |
u32 STDCALL PciWrite16(u32 bus, u32 devfn, u32 reg,u16 val)__asm__("PciWrite16"); |
u32 STDCALL PciWrite32(u32 bus, u32 devfn, u32 reg,u32 val)__asm__("PciWrite32"); |
struct kos_appdata* IMPORT GetCurrSlot(void) __asm__("GetCurrSlot"); |
#define pciReadByte(tag, reg) \ |
PciRead8(PCI_BUS_FROM_TAG(tag),PCI_DFN_FROM_TAG(tag),(reg)) |
534,7 → 628,8 |
static inline int power_supply_is_system_supplied(void) { return -1; }; |
static inline int FS_Service(ksys70_t *k, int* err){ |
static inline int FS_Service(ksys70_t *k, int* err) |
{ |
int status; |
__asm__ __volatile__( |
"call *__imp__FS_Service" |