/*======================================================= init_prot() ========================================================*/ PUBLIC void init_prot() { init_8259A(); //初始化异常 (中断门 没有陷阱门) init_idt_desc( INT_VECTOR_DIVIDE, DA_386IGate, divide_error, PRIVILEGE_KRNL); init_idt_desc( INT_VECTOR_DEBUG, DA_386IGate, single_step_exception, PRIVILEGE_KRNL); init_idt_desc( INT_VECTOR_NMI, DA_386IGate, nmi, PRIVILEGE_KRNL); init_idt_desc( INT_VECTOR_BREAKPOINT, DA_386IGate, breakpoint_exception, PRIVILEGE_USER); init_idt_desc( INT_VECTOR_OVERFLOW, DA_386IGate , overflow, PRIVILEGE_USER); init_idt_desc( INT_VECTOR_BOUNDS, DA_386IGate, bounds_check, PRIVILEGE_KRNL); init_idt_desc( INT_VECTOR_INVAL_OP, DA_386IGate, inval_opcode, PRIVILEGE_KRNL); init_idt_desc( INT_VECTOR_COPROC_NOT, DA_386IGate, copr_not_available, PRIVILEGE_KRNL); init_idt_desc( INT_VECTOR_DOUBLE_FAULT, DA_386IGate, double_fault, PRIVILEGE_KRNL); init_idt_desc( INT_VECTOR_COPROC_SEG, DA_386IGate, copr_seg_overrun, PRIVILEGE_KRNL); init_idt_desc( INT_VECTOR_INVAL_TSS, DA_386IGate, inval_tss, PRIVILEGE_KRNL); init_idt_desc( INT_VECTOR_SEG_NOT, DA_386IGate, segment_not_present, PRIVILEGE_KRNL); init_idt_desc( INT_VECTOR_STACK_FAULT, DA_386IGate, stack_exception, PRIVILEGE_KRNL); init_idt_desc( INT_VECTOR_PROTECTION, DA_386IGate, general_protection, PRIVILEGE_KRNL); init_idt_desc( INT_VECTOR_PAGE_FAULT, DA_386IGate, page_fault, PRIVILEGE_KRNL); init_idt_desc( INT_VECTOR_COPROC_ERR, DA_386IGate, copr_error, PRIVILEGE_KRNL); /*初始化中断*/ init_idt_desc(INT_VECTOR_IRQ0 + 0, DA_386IGate , hint00 , PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 1, DA_386IGate , hint01 , PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 2, DA_386IGate , hint02 , PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 3, DA_386IGate , hint03 , PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 4, DA_386IGate , hint04 , PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 5, DA_386IGate , hint05 , PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 6, DA_386IGate , hint06 , PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 7, DA_386IGate , hint07 , PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 0, DA_386IGate , hint08 , PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 1, DA_386IGate , hint09 , PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 2, DA_386IGate , hint10 , PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 3, DA_386IGate , hint11 , PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 4, DA_386IGate , hint12 , PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 5, DA_386IGate , hint13 , PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 6, DA_386IGate , hint14 , PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 7, DA_386IGate , hint15 , PRIVILEGE_KRNL); /* 填充 GDT 中的 TSS */ memset(&tss,0,sizeof(tss)); tss.ss0 = SELECTOR_KERNEL_DS; init_descriptor(&gdt[INDEX_TSS], vir2phys(seg2phys(SELECTOR_KERNEL_DS),&tss), sizeof(tss) - 1, DA_386TSS); tss.iobase = sizeof(tss); /*没有I/O许可位图*/ /*填充 GDT 中进程的 LDT的描述符 */ init_descriptor(&gdt[INDEX_LDT_FIRST], vir2phys(seg2phys(SELECTOR_KERNEL_DS),proc_table[0].ldts), LDT_SIZE * sizeof(DESCRIPTOR) - 1, DA_LDT); }
void init_tss(void) { p_asm_memset(&tss, 0, sizeof(tss)); tss.ss0 = SELECTOR_KERNEL_DS; init_descriptor(&gdt[INDEX_TSS], linear2phy(seg2base(SELECTOR_KERNEL_DS), (u32)&tss), sizeof(tss)-1, DA_386TSS); tss.iobase = sizeof(tss); // ??? for (int i = 0 ; i < NR_TASKS ; ++i) { init_descriptor(&gdt[INDEX_LDT_FIRST+i], linear2phy(seg2base(SELECTOR_KERNEL_DS), (u32)proc_table[i].ldt), LDT_SIZE * sizeof(Descriptor) - 1, DA_LDT); } }
/* * Set the detector with the default parameters */ int VisualFeatureExtraction::setDescriptor(string descName){ // Assign the default parameters for the specified detector algorithm if(descName.compare("BRISK")==0){ myDescParams = new BRISK_descParams(); } else if(descName.compare("BRIEF")==0){ myDescParams = new BRIEF_descParams(); } else if(descName.compare("ORB")==0){ myDescParams = new ORB_descParams(); } else if(descName.compare("FREAK")==0){ myDescParams = new FREAK_descParams(); } else if(descName.compare("SURF")==0){ myDescParams = new SURF_descParams(); } else if(descName.compare("ExtendedSURF")==0){ myDescParams = new ExtendedSURF_descParams(); } else if(descName.compare("SIFT")==0){ myDescParams = new SIFT_descParams(); } else{ return -1; } // Initialize the detector init_descriptor(descName); return 0; }
/* * Set the detector with custom parameters */ int VisualFeatureExtraction::setDescriptor(string descName, descParams* params){ myDescParams = params; init_descriptor(descName); return 0; }
/* * Set the detector with the default parameters */ int VisualFeatureExtraction::setDescriptor(string descName){ // Assign the default parameters for the specified detector algorithm if(descName.compare("BRISK")==0){ int nPairs = BRISK_LENGTH_BITS; vector<int> pairs; int aux_pairs[nPairs]; ifstream fileRank; if( BRISK_LENGTH_BITS == 512 ){ fileRank.open("brisk/ranking_original_optimized512.bin",ios::in|ios::binary); } else if ( BRISK_LENGTH_BITS == 256 ){ fileRank.open("brisk/ranking_original_optimized256.bin",ios::in|ios::binary); } fileRank.read((char*)aux_pairs,sizeof(int)*nPairs); fileRank.close(); for(int i=0; i<nPairs; i++){ pairs.push_back(aux_pairs[i]); } myDescParams = new BRISK_descParams(pairs); } else if(descName.compare("BRIEF")==0){ myDescParams = new BRIEF_descParams(); } else if(descName.compare("ORB")==0){ myDescParams = new ORB_descParams(); } else if(descName.compare("FREAK")==0){ myDescParams = new FREAK_descParams(); } else if(descName.compare("SURF")==0){ myDescParams = new SURF_descParams(); } else if(descName.compare("ExtendedSURF")==0){ myDescParams = new ExtendedSURF_descParams(); } else if(descName.compare("SIFT")==0){ myDescParams = new SIFT_descParams(); } else{ return -1; } // Initialize the detector init_descriptor(descName); return 0; }
const LADSPA_Descriptor * ladspa_descriptor(unsigned long Index) { if (Index == 0) { if (gDescriptor == 0) { // allocate temporaries dsp and portCollector to build the plugin description mydsp* p = new mydsp(); if (p) { portCollector* c=new portCollector(p->getNumInputs(), p->getNumOutputs()); p->buildUserInterface(c); gDescriptor = new LADSPA_Descriptor; init_descriptor(gDescriptor); c->fillPortDescription(gDescriptor); delete p; } else { printf("Memory Error : unable to allocate the dsp object\n"); } } return gDescriptor; } else { return NULL; } }
/* Recover from a hotreboot - load players */ void hotreboot_recover() { DESCRIPTOR_DATA *d; FILE *fp; char name[100]; char host[MSL]; long desc; bool fOld; fp = fopen(HOTREBOOT_FILE, "r"); if(!fp) /* there are some descriptors open which will hang forever then ? */ { perror("hotreboot_recover:fopen"); exit(1); } /* unlink (HOTREBOOT_FILE); In case something crashes - doesn't prevent reading */ for(;;) { fscanf(fp, "%li %s %s\n", &desc, name, host); if(desc == -1) break; /* Write something, and check if it goes error-free */ if(!write_to_descriptor(desc, "\n\rRestoring from hotreboot...\n\r", 0)) { #ifdef WIN32 closesocket(desc); #else /* */ close(desc); /* nope */ #endif /* */ continue; } d = alloc_perm(sizeof(DESCRIPTOR_DATA)); init_descriptor(d, desc); /* set up various stuff */ d->host = str_dup(host); d->next = descriptor_list; descriptor_list = d; d->connected = CON_HOTREBOOT_RECOVER; /* -15, so close_socket frees the char */ /* Now, find the pfile */ fOld = load_char_obj(d, name); if(!fOld) /* Player file not found?! */ { write_to_descriptor(desc, "\n\rSomehow, your character was lost in the hotreboot. Reconnect\n\r", 0); close_socket2(d, FALSE); } else /* ok! */ { /* Just In Case */ if(!d->character->in_room) d->character->in_room = get_room_index(ROOM_VNUM_TEMPLE); /* Insert in the char_list */ d->character->next = char_list; char_list = d->character; char_to_room(d->character, d->character->in_room); do_look(d->character, ""); act("$n appears from the netherworld!", d->character, 0, 0, TO_ROOM); d->connected = CON_PLAYING; } } fclose(fp); olduptime = get_olduptime(); }
//-------------------------------------------------------------------------- // init_prot //-------------------------------------------------------------------------- void init_prot() { init_8259A(); // 全部初始化成中断门(没有陷阱门) init_idt_desc(INT_VECTOR_DIVIDE, DA_386IGate, divide_error, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_DEBUG, DA_386IGate, single_step_exception, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_NMI, DA_386IGate, nmi, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_BREAKPOINT, DA_386IGate, breakpoint_exception, PRIVILEGE_USER); init_idt_desc(INT_VECTOR_OVERFLOW, DA_386IGate, overflow, PRIVILEGE_USER); init_idt_desc(INT_VECTOR_BOUNDS, DA_386IGate, bounds_check, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_INVAL_OP, DA_386IGate, inval_opcode, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_COPROC_NOT, DA_386IGate, copr_not_available, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_DOUBLE_FAULT, DA_386IGate, double_fault, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_COPROC_SEG, DA_386IGate, copr_seg_overrun, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_INVAL_TSS, DA_386IGate, inval_tss, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_SEG_NOT, DA_386IGate, segment_not_present, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_STACK_FAULT, DA_386IGate, stack_exception, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_PROTECTION, DA_386IGate, general_protection, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_PAGE_FAULT, DA_386IGate, page_fault, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_COPROC_ERR, DA_386IGate, copr_error, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 0, DA_386IGate, hwint00, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 1, DA_386IGate, hwint01, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 2, DA_386IGate, hwint02, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 3, DA_386IGate, hwint03, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 4, DA_386IGate, hwint04, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 5, DA_386IGate, hwint05, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 6, DA_386IGate, hwint06, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 7, DA_386IGate, hwint07, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 0, DA_386IGate, hwint08, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 1, DA_386IGate, hwint09, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 2, DA_386IGate, hwint10, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 3, DA_386IGate, hwint11, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 4, DA_386IGate, hwint12, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 5, DA_386IGate, hwint13, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 6, DA_386IGate, hwint14, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 7, DA_386IGate, hwint15, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_SYS_CALL, DA_386IGate, sys_call, PRIVILEGE_USER); //填充 GDT 中 TSS 这个描述符 memset(&tss, 0, sizeof(tss)); tss.ss0 = SELECTOR_KERNEL_DS; init_descriptor(&gdt[INDEX_TSS], vir2phys(seg2phys(SELECTOR_KERNEL_DS), &tss), sizeof(tss) - 1, DA_386TSS); tss.iobase = sizeof(tss); // 没有I/O许可位图 // 填充 GDT 中进程的 LDT 的描述符 int i; PROCESS* p_proc = proc_table; u16 selector_ldt = INDEX_LDT_FIRST << 3; for(i=0;i<NR_TASKS;i++){ init_descriptor(&gdt[selector_ldt>>3], vir2phys(seg2phys(SELECTOR_KERNEL_DS), proc_table[i].ldts), LDT_SIZE * sizeof(DESCRIPTOR) - 1, DA_LDT); p_proc++; selector_ldt += 1 << 3; } }
void init_trap() { int i; init_8259A(); //soft interrupt set_trap_gate(INT_VECTOR_DIVIDE,divide_error); set_trap_gate(INT_VECTOR_DEBUG, single_step_exception); set_trap_gate(INT_VECTOR_NMI, nmi); set_system_gate(INT_VECTOR_BREAKPOINT, breakpoint_exception); set_system_gate(INT_VECTOR_OVERFLOW, overflow); set_system_gate(INT_VECTOR_BOUNDS, bounds_check); set_trap_gate(INT_VECTOR_INVAL_OP, inval_opcode); set_trap_gate(INT_VECTOR_COPROC_NOT, copr_not_available); set_trap_gate(INT_VECTOR_DOUBLE_FAULT, double_fault); set_trap_gate(INT_VECTOR_COPROC_SEG, copr_seg_overrun); set_trap_gate(INT_VECTOR_INVAL_TSS, inval_tss); set_trap_gate(INT_VECTOR_SEG_NOT, segment_not_present); set_trap_gate(INT_VECTOR_STACK_FAULT, stack_exception); set_trap_gate(INT_VECTOR_PROTECTION, general_protection); set_trap_gate(INT_VECTOR_PAGE_FAULT, page_fault); set_trap_gate(INT_VECTOR_COPROC_ERR, copr_error); // hard interrupt IRQ0-IRQ15 set_intr_gate(INT_VECTOR_IRQ0 + 0, clock_intr); //clock interrupt set_intr_gate(INT_VECTOR_IRQ0 + 1, kb_intr); //keyboard interrupt set_intr_gate(INT_VECTOR_IRQ0 + 2, hwint02); set_intr_gate(INT_VECTOR_IRQ0 + 3, hwint03); set_intr_gate(INT_VECTOR_IRQ0 + 4, hwint04); set_intr_gate(INT_VECTOR_IRQ0 + 5, hwint05); set_intr_gate(INT_VECTOR_IRQ0 + 6, hwint06); set_intr_gate(INT_VECTOR_IRQ0 + 7, hwint07); set_intr_gate(INT_VECTOR_IRQ8 + 0, hwint08); set_intr_gate(INT_VECTOR_IRQ8 + 1, hwint09); set_intr_gate(INT_VECTOR_IRQ8 + 2, hwint10); set_intr_gate(INT_VECTOR_IRQ8 + 3, hwint11); set_intr_gate(INT_VECTOR_IRQ8 + 4, hwint12); set_intr_gate(INT_VECTOR_IRQ8 + 5, hwint13); set_intr_gate(INT_VECTOR_IRQ8 + 6, hd_intr);//hard disk interrupt set_intr_gate(INT_VECTOR_IRQ8 + 7, hwint15); //init 80 interrupt set_syscall_gate(INT_VECTOR_SYS_CALL, sys_call); memset((char *)&tss, 0, sizeof(tss)); tss.ss0 = SELECTOR_KERNEL_DS; //¿¿TSS init_descriptor(&gdt[INDEX_TSS], vir2phys(seg2phys(SELECTOR_KERNEL_DS), &tss), sizeof(tss) - 1, DA_386TSS); tss.iobase = sizeof(tss); PROCESS* p_proc = proc_table; t16 selector_ldt = INDEX_LDT_FIRST << 3; //¿¿GDT¿¿¿¿¿¿¿LDT for(i=0;i<NR_SYSTEM_PROCS + NR_USER_PROCS;i++) { init_descriptor(&gdt[selector_ldt>>3], vir2phys(seg2phys(SELECTOR_KERNEL_DS), proc_table[i].ldts), LDT_SIZE * sizeof(DESCRIPTOR) - 1, DA_LDT); p_proc++; selector_ldt += 1 << 3; } }
int new_descriptor (int s) { int desc; struct sockaddr_in sock; DESCRIPTOR_DATA *newd, *td; char ip[MAX_STRING_LENGTH]; struct hostent *from = NULL; socklen_t size; size = sizeof (sock); if ((desc = accept (s, (struct sockaddr *) &sock, &size)) < 0) { perror ("Accept"); return (-1); } nonblock (desc); if ((maxdesc + 1) >= avail_descs) { write (desc, "The game is full. Try later.\n\r", 31); close (desc); return (0); } else if (desc > maxdesc) maxdesc = desc; newd = new struct descriptor_data; init_descriptor (newd, desc); *ip = '\0'; strcpy (ip, inet_ntoa (sock.sin_addr)); newd->strClientIpAddr = str_dup (ip); newd->strClientHostname = str_dup (ip); std::string resolved_hostname = resolved_host (newd->strClientHostname); if (resolved_hostname.empty ()) { from = gethostbyaddr ((char *) &sock.sin_addr, sizeof ((char *) & sock.sin_addr), AF_INET); if (from && *from->h_name != '-') { mysql_safe_query ("INSERT INTO resolved_hosts " "VALUES ('%s', '%s', %d)", ip, from->h_name, (int) time (0)); mem_free (newd->strClientHostname); newd->strClientHostname = str_dup (from->h_name); } else { mysql_safe_query ("INSERT INTO resolved_hosts VALUES ('%s', '%s', %d)", ip, ip, (int) time (0)); } } else { mem_free (newd->strClientHostname); newd->strClientHostname = str_dup (resolved_hostname.c_str ()); newd->resolved = 1; } if (!descriptor_list) descriptor_list = newd; else for (td = descriptor_list; td; td = td->next) { if (!td->next) { newd->next = NULL; td->next = newd; break; } } if (connected > MAX_CONNECTIONS) { SEND_TO_Q ("\r\n" "We apologize for the inconvenience, but the MUD is currently full.\r\n" "\r\n" "Please try back again later. Thank you.\r\n" "\r\n", newd); newd->connected = CON_PENDING_DISC; return (0); } if (!maintenance_lock) SEND_TO_Q (get_text_buffer (NULL, text_list, "greetings"), newd); else SEND_TO_Q (get_text_buffer (NULL, text_list, "greetings.maintenance"), newd); SEND_TO_Q ("Your Selection: ", newd); newd->connected = CON_LOGIN; return (0); }
void switch_ldt_in_gdt() { init_descriptor(&gdt[4], (u32)(ready_task->ldt), sizeof(struct descriptor) * LDT_SIZE - 1, DA_LDT); }