Cucumber/Kernel/include/Tier1/CTask.h

139 lines
3.7 KiB
C
Raw Normal View History

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