- /*
- By Marcus Xing
- kernel/system_call.c
- 各功能号的处理函数如下
- */
- #include "type.h"
- #include "const.h"
- #include "ipc.h"
- #include "protect.h"
- #include "proc.h"
- #include "console.h"
- #include "tty.h"
- #include "global.h"
- #include "proto.h"
- /*-------------------------------------------------------------System_Call_Write
- RINT 0,系统调用1号功能函数
- */
- void System_Call_Write(int unused1,int unused2,const char *buf,PCB *pcb)
- {
- /* 把调用Printf函数的进程绑定的控制台的指针取出来 */
- Console *con = &Console_Table[pcb->bind_tty];
- /* 如果是Panic调用的或者是Assert调用的并且是系统进程调用的 */
- if((*buf == MAGIC_CHAR_PANIC) || (*buf == MAGIC_CHAR_ASSERT && Is_System_Proc[pcb - PCB_Table] == 1))
- {
- Disable_Int(); /* 为了能hlt住系统,必须关掉中断 */
- char *v = (char*)VIDEO_START_ADDR; /* 指向显存首地址 */
- char *m = (char*)buf + 1; /* 略掉标记字符 */
- /* 不超过显存则继续 */
- while((u32)v < VIDEO_START_ADDR + VIDEO_MEM_SIZE)
- {
- /* 如果串没结束,则打印之 */
- if(*m != '/0')
- {
- *v++ = *m++;
- *v++ = Make_Color(GREEN,BLACK);
- }
- else
- {
- /* 结束了的话则把剩下的空间填为空,这样则使每隔10行打印一次 */
- while((((u32)v - VIDEO_START_ADDR) % (ROW_BYTE_NUM * 10)) != 0)
- {
- *v++ = ' ';
- *v++ = Make_Color(WHITE,BLACK);
- }
- /* m重新指串的第2个字符 */
- m = (char*)buf + 1;
- }
- }
- __asm__ __volatile__("hlt"); /* 叫停系统 */
- }
- /* 如果在用户进程调用Assert,则略过标志字符 */
- if(*buf == MAGIC_CHAR_ASSERT)
- {
- buf++;
- }
- /* 取出解析好的串的每一个字符,交给Out_Char打印 */
- while(*buf != '/0')
- {
- Out_Char(con,*buf++);
- }
- }
- /*------------------------------------------------------System_Call_Send_Receive
- RING 0,系统调用2号功能
- 收发消息的大管家
- */
- void System_Call_Send_Receive(int function,int send_recev_pid,Message *m,PCB *caller)
- {
- Assert((caller - PCB_Table) != send_recev_pid); /* 收发进程不同为同一个 */
- m->src_proc_pid = caller - PCB_Table; /* 消息注明是谁收的或谁发的 */
- /* 进行收发 */
- if(function == SEND)
- {
- MSG_Send(send_recev_pid,m,caller);
- }
- else if(function == RECEIVE)
- {
- MSG_Receive(send_recev_pid,m,caller);
- }
- else
- {
- Panic("SEND RECEIVE ERROR!");
- }
- }