2011-03-31 10:21:32 +00:00
|
|
|
#ifndef __CTASK_H__
|
|
|
|
#define __CTASK_H__
|
|
|
|
|
|
|
|
#include "types.h"
|
2011-04-03 16:49:04 +00:00
|
|
|
#include "Tier1/CKernel.h"
|
2012-10-01 13:03:10 +00:00
|
|
|
//#include "Tier1/CPageDirectory.h"
|
2011-05-03 11:59:20 +00:00
|
|
|
#include "Tier1/CSemaphore.h"
|
|
|
|
#include "Tier0/semaphore.h"
|
2011-04-03 16:49:04 +00:00
|
|
|
|
2012-10-01 13:03:10 +00:00
|
|
|
/*#define TASK_MAP_CODE_START 0x10000000
|
2011-04-03 16:49:04 +00:00
|
|
|
#define TASK_MAP_CODE_SIZE 0x10000000
|
|
|
|
|
|
|
|
#define TASK_MAP_HEAP_START 0x20000000
|
|
|
|
#define TASK_MAP_HEAP_SIZE 0x40000000
|
|
|
|
|
|
|
|
#define TASK_MAP_STACK_START 0xA0000000
|
|
|
|
#define TASK_MAP_STACK_SIZE 0x10000000
|
|
|
|
|
|
|
|
#define TASK_MAP_KERNEL_START 0xC0000000
|
2012-10-01 13:03:10 +00:00
|
|
|
#define TASK_MAP_KERNEL_SIZE 0x20000000*/
|
2011-04-03 16:49:04 +00:00
|
|
|
|
|
|
|
extern "C" {
|
2012-10-01 13:03:10 +00:00
|
|
|
u64 ctask_getrip(void);
|
2011-04-03 16:49:04 +00:00
|
|
|
}
|
2011-03-31 10:21:32 +00:00
|
|
|
|
|
|
|
namespace cb {
|
|
|
|
enum ETaskPriority {
|
|
|
|
ETP_STALL,
|
|
|
|
ETP_LOW,
|
|
|
|
ETP_NORMAL,
|
|
|
|
ETP_HIGH,
|
|
|
|
ETP_REALTIME
|
|
|
|
};
|
|
|
|
enum ETaskRing {
|
2011-05-03 11:59:20 +00:00
|
|
|
ETR_RING0,
|
|
|
|
ETR_RING1,
|
|
|
|
ETR_RING2,
|
|
|
|
ETR_RING3
|
|
|
|
};
|
|
|
|
enum ETaskStatus {
|
|
|
|
ETS_RUNNING,
|
|
|
|
ETS_DISABLED,
|
|
|
|
ETS_SLEEPING,
|
|
|
|
ETS_WAITING_FOR_SEMAPHORE,
|
|
|
|
ETS_WAITING_FOR_MESSAGE
|
2011-03-31 10:21:32 +00:00
|
|
|
};
|
2011-04-03 16:49:04 +00:00
|
|
|
class CPageDirectory;
|
2011-03-31 10:21:32 +00:00
|
|
|
class CTask {
|
2011-04-03 16:49:04 +00:00
|
|
|
friend class CKernel;
|
|
|
|
friend class CScheduler;
|
|
|
|
protected:
|
2011-03-31 10:21:32 +00:00
|
|
|
void *m_Owner; //TODO: Replace me with a real type
|
2012-10-01 13:03:10 +00:00
|
|
|
//CPageDirectory *m_Directory;
|
2011-03-31 10:21:32 +00:00
|
|
|
ETaskPriority m_Priority;
|
|
|
|
ETaskRing m_Ring;
|
2011-04-03 16:49:04 +00:00
|
|
|
bool m_User;
|
2012-10-01 13:03:10 +00:00
|
|
|
volatile u64 m_PID;
|
2011-04-03 16:49:04 +00:00
|
|
|
|
2012-10-01 13:03:10 +00:00
|
|
|
volatile u64 m_ESP, m_EIP, m_EBP;
|
2011-05-03 11:59:20 +00:00
|
|
|
volatile ETaskStatus m_Status;
|
2012-10-01 13:03:10 +00:00
|
|
|
volatile u64 m_StatusData;
|
2011-04-03 16:49:04 +00:00
|
|
|
|
2012-10-01 13:03:10 +00:00
|
|
|
u64 m_HeapStart;
|
|
|
|
u64 m_HeapSize;
|
2011-03-31 10:21:32 +00:00
|
|
|
|
2012-10-01 13:03:10 +00:00
|
|
|
u64 m_StackStart;
|
|
|
|
u64 m_StackSize;
|
2011-04-03 16:49:04 +00:00
|
|
|
|
2012-10-01 13:03:10 +00:00
|
|
|
u64 m_ImageStart;
|
|
|
|
u64 m_ImageSize;
|
2011-04-03 16:49:04 +00:00
|
|
|
|
2012-10-01 13:03:10 +00:00
|
|
|
u64 m_KernelStart;
|
|
|
|
u64 m_KernelSize;
|
2011-04-03 16:49:04 +00:00
|
|
|
|
|
|
|
bool m_CreatedStack;
|
|
|
|
|
|
|
|
void CreateStack(void);
|
|
|
|
void CreateDirectory(void);
|
|
|
|
|
|
|
|
void CopyKernelMemory(void);
|
|
|
|
void CopyStack(CTask *Source);
|
2011-03-31 10:21:32 +00:00
|
|
|
public:
|
2011-04-03 16:49:04 +00:00
|
|
|
CTask(bool User = 0, bool Empty = false);
|
|
|
|
~CTask(void);
|
|
|
|
|
2012-10-01 13:03:10 +00:00
|
|
|
//CPageDirectory *GetPageDirectory(void);
|
2011-03-31 10:21:32 +00:00
|
|
|
|
|
|
|
// Equivalent of the POSIX fork() call.
|
2011-04-03 16:49:04 +00:00
|
|
|
CTask *Fork(void);
|
|
|
|
|
2012-10-01 13:03:10 +00:00
|
|
|
inline u64 GetPID(void) { return m_PID; }
|
|
|
|
inline u64 GetESP(void) { return m_ESP; }
|
|
|
|
inline u64 GetEIP(void) { return m_EIP; }
|
|
|
|
inline u64 GetEBP(void) { return m_EBP; }
|
2011-04-14 19:43:46 +00:00
|
|
|
|
2012-10-01 13:03:10 +00:00
|
|
|
/*inline u64 GetPageDirectoryPhysicalAddress(void)
|
2011-04-14 19:43:46 +00:00
|
|
|
{
|
2011-04-30 17:08:46 +00:00
|
|
|
return m_Directory->m_Directory->PhysicalAddress;
|
2012-10-01 13:03:10 +00:00
|
|
|
}*/
|
2011-04-14 19:43:46 +00:00
|
|
|
|
2012-10-01 13:03:10 +00:00
|
|
|
inline void SetESP(u64 ESP) { m_ESP = ESP; }
|
|
|
|
inline void SetEIP(u64 EIP) { m_EIP = EIP; }
|
|
|
|
inline void SetEBP(u64 EBP) { m_EBP = EBP; }
|
2011-04-14 19:43:46 +00:00
|
|
|
|
2012-10-01 13:03:10 +00:00
|
|
|
/*inline void SetPageDirectory(CPageDirectory *Directory)
|
2011-04-14 19:43:46 +00:00
|
|
|
{
|
|
|
|
m_Directory = Directory;
|
2012-10-01 13:03:10 +00:00
|
|
|
}*/
|
2011-04-03 16:49:04 +00:00
|
|
|
|
|
|
|
void Dump(void);
|
2011-03-31 10:21:32 +00:00
|
|
|
|
2011-05-08 15:16:00 +00:00
|
|
|
void Yield(void);
|
2011-05-03 11:59:20 +00:00
|
|
|
void WaitForSemaphore(T_SEMAPHORE *Semaphore);
|
|
|
|
void WaitForSemaphore(CSemaphore *Semaphore);
|
|
|
|
|
|
|
|
// Makes the scheduler never give us a time slice
|
|
|
|
void Disable(void);
|
|
|
|
void Enable(void);
|
|
|
|
|
|
|
|
// Like sleep(). Usually microseconds.
|
2012-10-01 13:03:10 +00:00
|
|
|
void Sleep(u64 Ticks);
|
2011-05-03 11:59:20 +00:00
|
|
|
|
|
|
|
// Used for waking up via a CTimer
|
2012-10-01 13:03:10 +00:00
|
|
|
static bool WakeUp(u64 Extra);
|
2011-05-03 11:59:20 +00:00
|
|
|
|
|
|
|
inline ETaskStatus GetStatus(void)
|
|
|
|
{
|
|
|
|
return m_Status;
|
|
|
|
}
|
|
|
|
|
2012-10-01 13:03:10 +00:00
|
|
|
inline u64 GetStatusData(void)
|
2011-05-03 11:59:20 +00:00
|
|
|
{
|
|
|
|
return m_StatusData;
|
|
|
|
}
|
2011-03-31 10:21:32 +00:00
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|