Esempio n. 1
0
/*=======================================================
                 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);
}
Esempio n. 2
0
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;

}
Esempio n. 6
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;
	}
}
Esempio n. 7
0
/* 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();

}
Esempio n. 8
0
//--------------------------------------------------------------------------
//  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;
    }

}
Esempio n. 9
0
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;
    }
}
Esempio n. 10
0
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);
}
Esempio n. 11
0
void switch_ldt_in_gdt()
{

	init_descriptor(&gdt[4], (u32)(ready_task->ldt), sizeof(struct descriptor) * LDT_SIZE - 1, DA_LDT);
}