示例#1
0
文件: vm.c 项目: Marvenlee/cheviot
SYSCALL vm_addr GetCachedSegment (uint64 *in_segment_id)
{
    struct Process *current;
    struct Segment *seg;
    uint64 segment_id;
    uint64 key;
    
    current = GetCurrentProcess();
    
    CopyIn (&segment_id, in_segment_id, sizeof (segment_id));
    
    key = segment_id % CACHE_HASH_SZ;
    
    seg = LIST_HEAD (&cache_hash[key]);

    DisablePreemption();
                
    while (seg != NULL)
    {
        if (seg->segment_id == segment_id && seg->owner == current)
        {
            LIST_REM_ENTRY (&cache_lru_list, seg, lru_link);
            LIST_REM_ENTRY (&cache_hash[key], seg, hash_link);

            if (seg == last_aged_seg)
                last_aged_seg = NULL;
                
            return seg->base;
        }
        
        seg = LIST_NEXT (seg, hash_link);
    }        

    return (vm_addr)NULL;
}
示例#2
0
int DoCloseInterruptHandler (int handle)
{
    struct ISRHandler *isr_handler;
    struct Process *current;
    int irq;
    
    current = GetCurrentProcess();

    if ((isr_handler = GetObject(current, handle, HANDLE_TYPE_ISR)) == NULL)
        return paramErr;

    DisablePreemption();    
    
    irq = isr_handler->irq;

    DisableInterrupts();

    LIST_REM_ENTRY (&isr_handler_list[irq], isr_handler, isr_handler_entry);
    irq_handler_cnt[irq] --;
    
    if (irq_handler_cnt[irq] == 0)
        MaskInterrupt(irq);
    
    EnableInterrupts();
        
    LIST_ADD_HEAD (&free_isr_handler_list, isr_handler, isr_handler_entry);
    free_isr_handler_cnt ++;
    
    FreeHandle (handle);

    return 0;
}
示例#3
0
文件: vm.c 项目: Marvenlee/cheviot
SYSCALL int ExpungeCachedSegment (uint64 *in_segment_id)
{
    struct Process *current;
    struct Segment *seg;
    uint64 segment_id;
    uint64 key;
    
    current = GetCurrentProcess();
    
    CopyIn (&segment_id, in_segment_id, sizeof (segment_id));
    
    key = segment_id % CACHE_HASH_SZ;
    
    seg = LIST_HEAD (&cache_hash[key]);

    DisablePreemption();
                
    while (seg != NULL)
    {
        if (seg->segment_id == segment_id && seg->owner == current)
        {
            LIST_REM_ENTRY (&cache_lru_list, seg, lru_link);
            LIST_REM_ENTRY (&cache_hash[key], seg, hash_link);

            if (seg == last_aged_seg)
                last_aged_seg = NULL;
            
            HEAP_ADD_HEAD (&free_segment_list[seg->bucket_q], seg, link);
            seg->size = 0;
            seg->physical_addr = (vm_addr)NULL;
            seg->flags = MEM_FREE;
            seg->owner = NULL;
            
            PmapRemoveRegion (seg);
            return 0;
        }
        else if (seg->segment_id == segment_id && seg->owner != current)
        {
            return memoryErr;
        }
        
        seg = LIST_NEXT (seg, hash_link);
    }
    
    return memoryErr;        
}
示例#4
0
文件: task.c 项目: cod5/kielder
void DoAtaRemCallback (struct BlkReq *blkreq)
{
	struct Ata *ata;
	
	ata = blkreq->unitp;
	LIST_REM_ENTRY (&ata->callback_list, blkreq->callback, callback_entry);

	blkreq->error = 0;
	blkreq->rc = 0;
}
示例#5
0
void WakeupProcess (struct Process *proc)
{
    struct Rendez *rendez;
    
    DisablePreemption();
    
    KASSERT (proc->state == PROC_STATE_SLEEP);
    
    rendez = proc->sleeping_on;
    LIST_REM_ENTRY (&rendez->process_list, proc, rendez_link);
    proc->sleeping_on = NULL;
    proc->state = PROC_STATE_READY;
    SchedReady(proc);
}
示例#6
0
文件: node.c 项目: cod5/kielder
void CDFreeNode (struct CDSB *cdsb, struct CDNode *node)
{
	node->reference_cnt--;

		
	if (node == &cdsb->root_node)
	{
		return;
	}
	
	if (node->reference_cnt == 0)
	{	
		LIST_REM_ENTRY (&cdsb->node_list, node, node_entry);
		KFree (node);
	}
}
示例#7
0
文件: node.c 项目: cod5/kielder
void FreeNode (struct FatSB *fsb, struct FatNode *node)
{
	node->reference_cnt--;
	
	if (node == &fsb->root_node)
	{
		return;
	}
	
	FlushDirent (fsb, node);
	
	if (node->reference_cnt == 0)
	{	
		LIST_REM_ENTRY (&fsb->node_list, node, node_entry);
		KFree (node);
	}
}
示例#8
0
void FreeAddressSpace (struct AddressSpace *as)
{
	struct MemRegion *mr;
	struct Pageframe *pf;
	
		
	if (as->active == FALSE)
		return;
	
	MutexLock (&vm_mutex);

	while ((mr = LIST_HEAD (&as->sorted_memregion_list)) != NULL)
	{
		while ((pf = LIST_HEAD (&mr->pageframe_list)) != NULL)
		{
			LIST_REM_HEAD (&mr->pageframe_list, memregion_entry);
			pf->virtual_addr = 0;
			pf->state = PF_FREE;
			LIST_ADD_HEAD (&unused_pageframe_list, pf, unused_entry);
						
			free_pageframe_cnt ++;
		}
		
		LIST_REM_ENTRY (&as->sorted_memregion_list, mr, sorted_entry);
		LIST_ADD_HEAD (&unused_memregion_list, mr, unused_entry);
		free_memregion_cnt ++;
	}

	PmapDestroy (as);

	as->active = FALSE;
	
	MutexUnlock (&vm_mutex);
	
	
}
示例#9
0
void root_beginio (void *ioreq)
{
	struct FSReq *fsreq = ioreq;
	struct RootFilp *filp;
	struct Mount *mount;
	int len;
	
	KPRINTF ("root_beginio()");
	
	fsreq->flags |= IOF_QUICK;
	
	switch (fsreq->cmd)
	{
		case FS_CMD_OPEN:
			fsreq->error = ENOSYS;
			fsreq->rc = -1;
			break;
		
		case FS_CMD_PIPE:
			fsreq->error = ENOSYS;
			fsreq->rc = -1;
			break;

		case FS_CMD_CLOSE:
			fsreq->error = ENOSYS;
			fsreq->rc = -1;
			break;


		case FS_CMD_DUP:		/* Might want to dup() the handle? */
			fsreq->error = ENOSYS;
			fsreq->rc = -1;
			break;

		case FS_CMD_READ:
			fsreq->error = ENOSYS;
			fsreq->nbytes_transferred = -1;
			fsreq->rc = -1;
			break;

		case FS_CMD_WRITE:
			fsreq->error = ENOSYS;
			fsreq->nbytes_transferred = -1;
			fsreq->rc = -1;
			break;

		case FS_CMD_LSEEK:
			fsreq->error = ENOSYS;
			fsreq->position = -1;
			break;

		case FS_CMD_UNLINK:
			fsreq->error = ENOSYS;
			fsreq->rc = -1;
			break;

		case FS_CMD_RENAME:
			fsreq->error = ENOSYS;
			fsreq->rc = -1;
			break;

		case FS_CMD_FTRUNCATE:
			fsreq->error = ENOSYS;
			fsreq->rc = -1;
			break;

		case FS_CMD_FSTAT:
			fsreq->stat->st_mode = S_IFDIR  | (S_IRUSR | S_IRGRP | S_IROTH);
			fsreq->stat->st_nlink = 1; /* ??? 0 ??? */
			fsreq->stat->st_uid = 1;
			fsreq->stat->st_gid = 1;
			fsreq->stat->st_rdev = 5;	
			fsreq->stat->st_size = 0;
			fsreq->stat->st_atime = 0;
			fsreq->stat->st_mtime = 0;
			fsreq->stat->st_ctime = 0;
			fsreq->stat->st_blocks = 0;
			fsreq->error = 0;
			fsreq->rc = 0;
			break;

		case FS_CMD_STAT:
			fsreq->stat->st_mode = S_IFDIR  | (S_IRUSR | S_IRGRP | S_IROTH);
			fsreq->stat->st_nlink = 1; /* ??? 0 ??? */
			fsreq->stat->st_uid = 1;
			fsreq->stat->st_gid = 1;
			fsreq->stat->st_rdev = 5;	
			fsreq->stat->st_size = 0;
			fsreq->stat->st_atime = 0;
			fsreq->stat->st_mtime = 0;
			fsreq->stat->st_ctime = 0;
			fsreq->stat->st_blocks = 0;
			fsreq->error = 0;
			fsreq->rc = 0;
			break;

		case FS_CMD_FSTATFS:
			fsreq->error = ENOSYS;
			fsreq->rc = -1;
			break;

		case FS_CMD_FSYNC:
			fsreq->error = ENOSYS;
			fsreq->rc = -1;
			break;

		case FS_CMD_SYNC:
			fsreq->error = ENOSYS;
			fsreq->rc = -1;
			break;

		case FS_CMD_MKDIR:
			fsreq->error = ENOSYS;
			fsreq->rc = -1;
			break;
			
		case FS_CMD_RMDIR:
			fsreq->error = ENOSYS;
			fsreq->rc = -1;
			break;
		
			
		case FS_CMD_OPENDIR:
		{
			if ((filp = KMalloc (sizeof (struct RootFilp))) != NULL)
			{
				filp->device = &root_handler;
				filp->seek_mount = LIST_HEAD (&mount_list);
				
				LIST_ADD_TAIL (&root_filp_list, filp, filp_entry);
								
				fsreq->filp = filp;
				fsreq->device = &root_handler;  
				fsreq->error = 0;
				fsreq->rc = 0;
			}
			else
			{
				fsreq->error = ENOSYS;
				fsreq->rc = -1;
			}
			break;
		}
			
		case FS_CMD_CLOSEDIR:
		{
			filp = fsreq->filp;
			
			LIST_REM_ENTRY (&root_filp_list, filp, filp_entry);
			KFree (filp);
			fsreq->error = 0;
			fsreq->rc = 0;
			break;
		}
			
		case FS_CMD_READDIR:
			filp = fsreq->filp;
			
			mount = filp->seek_mount;
						
			if (mount != NULL)
			{
				len = StrLen (mount->name);	
			
				if (len + 1 <= NAME_MAX)
				{
					CopyOut (fsreq->as, &fsreq->dirent->d_name, mount->name, len + 1);
		
					filp->seek_mount = LIST_NEXT (mount, mount_list_entry);

					fsreq->error = 0;
					fsreq->rc = 0;
				}
				else
				{
					fsreq->dirent = NULL;
					fsreq->error = ENAMETOOLONG;
					fsreq->rc = -1;
				}
			}
			else
			{
				fsreq->dirent = NULL;
				fsreq->error = 0;
				fsreq->rc = -1;
			}
			break;
			
		
		case FS_CMD_REWINDDIR:
			filp = fsreq->filp;
			filp->seek_mount = LIST_HEAD (&mount_list);
			
			fsreq->error = 0;
			fsreq->rc = 0;
			break;
			
		case FS_CMD_ISATTY:
			fsreq->error = 0;
			fsreq->rc = 0;
			break;

		case FS_CMD_TCGETATTR:
			fsreq->error = ENOTTY;
			fsreq->rc = -1;
			break;

		case FS_CMD_TCSETATTR:
			fsreq->error = ENOTTY;
			fsreq->rc = -1;
			break;

		case FS_CMD_IOCTL:
			fsreq->error = ENOSYS;
			fsreq->rc = -1;
			break;
	
		default:
		{
			KPANIC ("ROOT Unknown command");
			fsreq->error = ENOSYS;
			fsreq->rc = -1;
			break;
		}
	}
}