#ifndef	PUBLIC_PROTO_QUARK_SYSCALL_H
#define	PUBLIC_PROTO_QUARK_SYSCALL_H

#include <public/quark/task.h>
#include <public/quark/message.h>
#include <public/quark/mmu.h>
#include <public/quark/interrupt.h>
#include <public/quark/tags.h>

/**********************************************************/

void	QFinishThread(void);
void	QDeleteThread(q_tid_t);
q_tid_t	QCreateThread(q_pid_t,
                      q_tags_t);
q_pid_t	QCreateTask(q_tags_t);
void	QDeleteTask(q_pid_t);

/**********************************************************/

bool_t	QAllocInterrupt(u_int32_t,
                        u_int32_t,
                        q_tags_t);
void	QFreeInterrupt(q_iid_t);

bool_t	QWaitInterrupt(u_int32_t);


/**********************************************************/

q_mid_t	QCreatePort(q_tags_t);
void	QDeletePort(q_mid_t);
size_t	QGetPortAttr(q_mid_t	MyMID,
                     void	*MyData,
                     u_int32_t	MySize,
                     u_int32_t	MyTag,
                     ...);

q_message_t	QCreateMessage(q_mid_t	MyReplyPort,
                               q_tags_t	MyTags);
size_t	QDeleteMessage(q_message_t	MyMessage);

size_t	QSetMessageAttr(q_message_t	MyMessage,
                        size_t		MyTag,
                        ...);

size_t	QGetMessageAttr(q_message_t	MyMessage,
                        size_t		MyTag,
                        ...);

size_t	QSendMessage(q_mid_t		MID,		/* gpr3-gpr4 */
                     q_message_t	MyMessage,	/* gpr5 */
                     size_t		Arg1,		/* gpr6 */
                     size_t		Arg2,		/* gpr7 */
                     size_t		Arg3,		/* gpr8 */
                     size_t		MyLength,	/* gpr9 */
                     void		*MyData);	/* gpr10 */
size_t	QReplyMessage(q_message_t	MyMessage);

void	QWaitPort(q_mid_t);
q_message_t	QGetMessage(q_mid_t		MID,
                            q_messageinfo_t	MyMessageInfo);

q_message_t	QGetLinkMessage(q_message_t	MyMessage,
                                q_messageinfo_t	MyMessageInfo);

size_t	QAddLinkMessage(q_message_t		MyMessage,	/* gpr3 */
                        q_message_t		MyLinkMessage,	/* gpr4 */
                        size_t			Arg1,		/* gpr5 */
                        size_t			Arg2,		/* gpr6 */
                        size_t			Arg3,		/* gpr7 */
                        size_t			MyLength,	/* gpr8 */
                        void			*MyData);	/* gpr9 */

/**********************************************************/

int32_t		QAllocSignal(int32_t);
void		QFreeSignal(int32_t);
u_int32_t	QSignal(q_tid_t,
                        q_signalmask_t);

q_signalmask_t	QSetSignal(q_signalmask_t,
                           q_signalmask_t);
q_signalmask_t	QWait(q_signalmask_t);


/**********************************************************/

u_int32_t	QGetThreadAttr(q_tid_t,
                               void*,
                               u_int32_t,
                               u_int32_t,
                               ...);

u_int32_t	QSetThreadAttr(q_tid_t,
                               u_int32_t,
                               u_int32_t,
                               u_int32_t,
                               ...);

bool_t	QMMUSetPageMode(q_pid_t	MyPID,
                        u_int32_t	SourcePage,
                        u_int32_t	DestPage,
                        u_int32_t	PageCount,
                        u_int32_t	SetMode,
                        u_int32_t	PageMode);

u_int32_t	QMMUGetTranslation(q_pid_t			MyPID,
                                   struct QMMUTranslation	*MyTable,
                                   q_tags_t			*MyTags);

u_int32_t	QMMUMapping(q_pid_t		MyPID,
                            void		*MyAddress,
                            u_int32_t		MySize,
                            struct QMMUMapEntry	*MyTable,
                            q_tags_t		MyTags);

void	dprintf(char*,...);


void	QInvalidInstCacheArea(void*,
                              u_int32_t);

void	QInvalidDataCacheArea(void*,
                              u_int32_t);

void	QFlushDataCacheArea(void*,
                            u_int32_t);

void	QFlushDataInstCacheArea(void*,
                                u_int32_t);

void	QTrashDataCacheArea(void*,
                            u_int32_t);

void	QTrashDataInstCacheArea(void*,
                                u_int32_t);


/**********************************************************/

void	*QKAllocMem(size_t	Size,
                    u_int32_t	Flags);

void	QKFreeMem(void	*Address,
                  size_t	Size);

void	*QKAllocVec(size_t	Size,
                    u_int32_t	Flags);

void	QKFreeVec(void	*Address);

/**********************************************************/

u_int32_t	QGetAttr(void*,
                         u_int32_t,
                         u_int32_t,
                         ...);

u_int32_t	QSetAttr(u_int32_t,
                         u_int32_t,
                         u_int32_t,
                         ...);

#endif
