static void system_clock(PSW* m) { if (process_current() != NULL) { memcpy(&process_current()->cpu, m, sizeof (PSW)); } memcpy(m, &process_next()->cpu, sizeof (PSW)); DEBUG_PRINTF(DEBUG_T_SYSTEM, "Exécution processus : %d, state = %d\n", (int)process_current()->number, process_current()->state); }
static void system_sysc_sleep(PSW* m) { DEBUG_PRINTF(DEBUG_T_SYSC, "SYSCALL SLEEP(%d)\n", m->DR[m->RI.i]); process_current()->state = PROC_STATE_SLEEP; process_current()->waketime = time(NULL) + m->DR[m->RI.i]; ++m->PC; system_clock(m); //Change de processus }
static int read_partition_table(const char* path) { mbr_t *mbr = (mbr_t*)█ int fd = open(path, 0); if(fd == -1) { printf("error %d\n", fd); return 1; } device_t* device = devfs_device_from_file(process_current()->fd[fd]); int size = get_device_option(fd, "device_size"); char model[100]; get_device_option(fd, "model", model, sizeof(model)); int human = size; char *suffix[] = {"", "k", "M", "G", "T", 0}; int suffix_idx = 0; while(human >= 1024) { human /= 1024; suffix_idx++; if(suffix[suffix_idx] == 0) break; } printf("\nDisk %s: %d %sB, %d bytes\n", path, human, suffix[suffix_idx], size); printf("Model: '%s'\n\n", model); printf("Partition Boot Start End Blocks Id System\n"); invoke(device, device, read_blocks)(device, block, 0, 1); if(mbr->signature != 0xaa55) printf("invalid mbr signature\n"); int i; for(i=0; i<4; i++) { if((mbr->pe[i].type == 0 ) && (mbr->pe[i].lba_sector == 0)) continue; printf("%d %c %10d%10d%10d %02x %s\n", i, mbr->pe[i].active ? '*' : ' ', mbr->pe[i].lba_sector, mbr->pe[i].lba_sector + mbr->pe[i].lba_len, mbr->pe[i].lba_len, mbr->pe[i].type, part_type_name(mbr->pe[i].type)); } int extid = 5; int j; for(j=0; j<4; j++) { if((mbr->pe[j].type == 0 ) && (mbr->pe[j].lba_sector == 0)) continue; if(mbr->pe[j].type == DOS_PART_EXT) { printf("found an extended part table (starting at %d)\n", extid); } } printf("\n"); return 0; }
int __syscall_getcwd(char *buf, size_t size) { char *cwd = process_current()->cwd; if(strlen(cwd) < size) { strcpy(buf, cwd); return strlen(cwd); } return 0; }
void pcnet32_test_run() { xprintf("PCNET32 TEST\n"); xprintf("root fnode %p\n", process_current()->root); xprintf("root filesystem name %s\n", process_current()->root->mounted->filesystem->name); xprintf("file id %d\n", process_current()->root->file_id); pci_init(); // ide_init(); ether_init(); ip_init(); pcnet32_init(); //pcnet32 // mounting devfs devfs_mount(); // registering devfs driver_register_devfs(); // mounting tarfs at standard boot location tarfs_mount(multiboot_get_module(0), "/System/Startup"); shell_run(); xprintf("pcnet32_test end\n"); }
static void system_sysc_getchar(PSW* m){ DEBUG_PUTS(DEBUG_T_SYSC, "SYSCALL GETCHAR()"); Process* proc = process_current(); char c = system_io_getchar(proc); //Change de processus (en attente de caractère) if(proc->state == PROC_STATE_GETCHAR){ system_clock(m); return; } m->DR[m->RI.i] = c; ++m->PC; }
static void system_sysc_exit(PSW* m) { DEBUG_PRINTF(DEBUG_T_SYSC, "SYSCALL EXIT()\n"); Process* process = process_current(); if(process == NULL){ DEBUG_PUTS(DEBUG_T_SYSTEM, "Pas de processus courant"); return; } DEBUG_PRINTF(DEBUG_T_SYSTEM, "Suppr. proc %d\n", (int)process->number); process_kill(process); system_clock(m); }
void Gobby::TaskSaveAll::on_document_removed(SessionView& view) { std::list<TextSessionView*>::iterator iter = std::find( m_views.begin(), m_views.end(), &view); if(iter == m_current) { m_current = m_views.erase(m_current); // Go on with next process_current(); } if(iter != m_views.end()) m_views.erase(iter); }
static void system_sysc_fork(PSW* m) { DEBUG_PUTS(DEBUG_T_SYSC, "SYSCALL FORK()"); Process* child = process_fork(process_current()); if(child == NULL){ ++m->PC; return; } m->AC = child->number; m->DR[m->RI.i] = child->number; ++m->PC; child->cpu.PC = m->PC; child->state = PROC_STATE_READY; }
/* Resolve an address space constant to a pointer */ static addrspace_t *resolve_addrspace(addrspace_t *addrspace) { /* Current address space */ if (addrspace == ADDRSPACE_CURRENT) { return &(process_current()->addrspace); } /* System address space */ else if (addrspace == ADDRSPACE_SYSTEM) { return &system_addrspace; } /* Address space pointer */ else { return addrspace; } }
void Gobby::TaskSaveAll::run() { const unsigned int n_pages = get_folder().get_n_pages(); for(unsigned int i = 0; i < n_pages; ++i) { SessionView& view = get_folder().get_document(i); TextSessionView* text_view = dynamic_cast<TextSessionView*>(&view); if(text_view) m_views.push_back(text_view); } get_folder().signal_document_removed().connect( sigc::mem_fun(*this, &TaskSaveAll::on_document_removed)); m_current = m_views.begin(); process_current(); }
void Gobby::TaskSaveAll::process_current() { m_task.reset(NULL); if(m_current == m_views.end()) { finish(); } else { TextSessionView& view = **m_current; const DocumentInfoStorage::Info* info = get_document_info_storage().get_info( view.get_info_storage_key()); if(info != NULL && !info->uri.empty()) { Glib::RefPtr<Gio::File> file = Gio::File::create_for_uri(info->uri); get_operations().save_document( view, file, info->encoding, info->eol_style); m_current = m_views.erase(m_current); process_current(); } else { m_task.reset(new TaskSave(m_file_commands, view)); m_task->signal_finished().connect(sigc::mem_fun( *this, &TaskSaveAll::on_finished)); m_task->run(); } } }
int32_t syscall_exit(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint32_t arg3, uint32_t arg4) { process_exit(process_current(), arg0); return 0; }
void Gobby::TaskSaveAll::on_finished() { m_current = m_views.erase(m_current); process_current(); }