TASK_PRIVILEGE and level0() removed
- there are no tasks running, we don't need TASK_PRIVILEGE priviledge anymore - as there is no ring 1 anymore, there is no need for level0() to call sensitive code from ring 1 in ring 0 - 286 related macros removed as clean up
This commit is contained in:
		
							parent
							
								
									ebba20a65d
								
							
						
					
					
						commit
						391fd926ff
					
				| @ -24,7 +24,6 @@ | |||||||
| /* Fixed system call vector. */ | /* Fixed system call vector. */ | ||||||
| #define KERN_CALL_VECTOR  32	/* system calls are made with int SYSVEC */ | #define KERN_CALL_VECTOR  32	/* system calls are made with int SYSVEC */ | ||||||
| #define IPC_VECTOR        33	/* interrupt vector for ipc */ | #define IPC_VECTOR        33	/* interrupt vector for ipc */ | ||||||
| #define LEVEL0_VECTOR     34	/* for execution of a function at level 0 */ |  | ||||||
| 
 | 
 | ||||||
| /* Suitable irq bases for hardware interrupts.  Reprogram the 8259(s) from
 | /* Suitable irq bases for hardware interrupts.  Reprogram the 8259(s) from
 | ||||||
|  * the PC BIOS defaults since the BIOS doesn't respect all the processor's |  * the PC BIOS defaults since the BIOS doesn't respect all the processor's | ||||||
|  | |||||||
| @ -409,7 +409,6 @@ PRIVATE struct gate_table_s gate_table_ioapic[] = { | |||||||
| PRIVATE struct gate_table_s gate_table_common[] = { | PRIVATE struct gate_table_s gate_table_common[] = { | ||||||
| 	{ ipc_entry, IPC_VECTOR, USER_PRIVILEGE }, | 	{ ipc_entry, IPC_VECTOR, USER_PRIVILEGE }, | ||||||
| 	{ kernel_call_entry, KERN_CALL_VECTOR, USER_PRIVILEGE }, | 	{ kernel_call_entry, KERN_CALL_VECTOR, USER_PRIVILEGE }, | ||||||
| 	{ level0_call, LEVEL0_VECTOR, TASK_PRIVILEGE }, |  | ||||||
| 	{ NULL, 0, 0} | 	{ NULL, 0, 0} | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -74,7 +74,7 @@ struct proc *p; | |||||||
| 	} | 	} | ||||||
| 	case VMCTL_FLUSHTLB: | 	case VMCTL_FLUSHTLB: | ||||||
| 	{ | 	{ | ||||||
| 		level0(reload_cr3); | 		reload_cr3(); | ||||||
| 		return OK; | 		return OK; | ||||||
| 	} | 	} | ||||||
|   } |   } | ||||||
|  | |||||||
| @ -23,7 +23,7 @@ PUBLIC int do_int86(struct proc * caller, message * m_ptr) | |||||||
|   data_copy(caller->p_endpoint, (vir_bytes) m_ptr->INT86_REG86, |   data_copy(caller->p_endpoint, (vir_bytes) m_ptr->INT86_REG86, | ||||||
| 	KERNEL, (vir_bytes) ®86, sizeof(reg86)); | 	KERNEL, (vir_bytes) ®86, sizeof(reg86)); | ||||||
| 
 | 
 | ||||||
|   level0(int86); |   int86(); | ||||||
| 
 | 
 | ||||||
|   /* Copy results back to the caller */ |   /* Copy results back to the caller */ | ||||||
|   data_copy(KERNEL, (vir_bytes) ®86, |   data_copy(KERNEL, (vir_bytes) ®86, | ||||||
|  | |||||||
| @ -33,6 +33,7 @@ PUBLIC int do_sdevio(struct proc * caller, message *m_ptr) | |||||||
|   struct priv *privp; |   struct priv *privp; | ||||||
|   struct io_range *iorp; |   struct io_range *iorp; | ||||||
|   struct proc *destproc; |   struct proc *destproc; | ||||||
|  |   int retval; | ||||||
| 
 | 
 | ||||||
|   /* Allow safe copies and accesses to SELF */ |   /* Allow safe copies and accesses to SELF */ | ||||||
|   if ((m_ptr->DIO_REQUEST & _DIO_SAFEMASK) != _DIO_SAFE && |   if ((m_ptr->DIO_REQUEST & _DIO_SAFEMASK) != _DIO_SAFE && | ||||||
| @ -97,7 +98,7 @@ PUBLIC int do_sdevio(struct proc * caller, message *m_ptr) | |||||||
|   } |   } | ||||||
|      /* current process must be target for phys_* to be OK */ |      /* current process must be target for phys_* to be OK */ | ||||||
| 
 | 
 | ||||||
|   vm_set_cr3(destproc); |   switch_address_space(destproc); | ||||||
| 
 | 
 | ||||||
|   switch (req_type) |   switch (req_type) | ||||||
|   { |   { | ||||||
| @ -122,14 +123,16 @@ PUBLIC int do_sdevio(struct proc * caller, message *m_ptr) | |||||||
| 		kprintf( | 		kprintf( | ||||||
| 		"do_sdevio: I/O port check failed for proc %d, port 0x%x\n", | 		"do_sdevio: I/O port check failed for proc %d, port 0x%x\n", | ||||||
| 			m_ptr->m_source, port); | 			m_ptr->m_source, port); | ||||||
| 		return EPERM; | 		retval = EPERM; | ||||||
|  | 		goto return_error; | ||||||
| 	} | 	} | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   if (port & (size-1)) |   if (port & (size-1)) | ||||||
|   { |   { | ||||||
| 	kprintf("do_devio: unaligned port 0x%x (size %d)\n", port, size); | 	kprintf("do_devio: unaligned port 0x%x (size %d)\n", port, size); | ||||||
| 	return EPERM; | 	retval = EPERM; | ||||||
|  | 	goto return_error; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /* Perform device I/O for bytes and words. Longs are not supported. */ |   /* Perform device I/O for bytes and words. Longs are not supported. */ | ||||||
| @ -137,19 +140,29 @@ PUBLIC int do_sdevio(struct proc * caller, message *m_ptr) | |||||||
|       switch (req_type) { |       switch (req_type) { | ||||||
|       case _DIO_BYTE: phys_insb(port, phys_buf, count); break;  |       case _DIO_BYTE: phys_insb(port, phys_buf, count); break;  | ||||||
|       case _DIO_WORD: phys_insw(port, phys_buf, count); break;  |       case _DIO_WORD: phys_insw(port, phys_buf, count); break;  | ||||||
|       default: return(EINVAL); |       default: | ||||||
|  |   		retval = EINVAL; | ||||||
|  | 		goto return_error; | ||||||
|       }  |       }  | ||||||
|   } else if (req_dir == _DIO_OUTPUT) {  |   } else if (req_dir == _DIO_OUTPUT) {  | ||||||
|       switch (req_type) { |       switch (req_type) { | ||||||
|       case _DIO_BYTE: phys_outsb(port, phys_buf, count); break;  |       case _DIO_BYTE: phys_outsb(port, phys_buf, count); break;  | ||||||
|       case _DIO_WORD: phys_outsw(port, phys_buf, count); break;  |       case _DIO_WORD: phys_outsw(port, phys_buf, count); break;  | ||||||
|       default: return(EINVAL); |       default: | ||||||
|  |   		retval = EINVAL; | ||||||
|  | 		goto return_error; | ||||||
|       }  |       }  | ||||||
|   } |   } | ||||||
|   else { |   else { | ||||||
|       return(EINVAL); | 	  retval = EINVAL; | ||||||
|  | 	  goto return_error; | ||||||
|   } |   } | ||||||
|   return(OK); |   retval = OK; | ||||||
|  | 
 | ||||||
|  | return_error: | ||||||
|  |   /* switch back to the address of the process which made the call */ | ||||||
|  |   switch_address_space(caller); | ||||||
|  |   return retval; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #endif /* USE_SDEVIO */ | #endif /* USE_SDEVIO */ | ||||||
|  | |||||||
| @ -22,10 +22,8 @@ | |||||||
| #define SS_INDEX             5	/* kernel SS (386: monitor SS at startup) */ | #define SS_INDEX             5	/* kernel SS (386: monitor SS at startup) */ | ||||||
| #define CS_INDEX             6	/* kernel CS */ | #define CS_INDEX             6	/* kernel CS */ | ||||||
| #define MON_CS_INDEX         7	/* temp for BIOS (386: monitor CS at startup) */ | #define MON_CS_INDEX         7	/* temp for BIOS (386: monitor CS at startup) */ | ||||||
| #define DS_286_INDEX         8	/* scratch 16-bit source segment */ | #define TSS_INDEX            8	/* kernel TSS */ | ||||||
| #define ES_286_INDEX         9	/* scratch 16-bit destination segment */ | #define FIRST_LDT_INDEX      9	/* rest of descriptors are LDT's */ | ||||||
| #define TSS_INDEX           10	/* kernel TSS */ |  | ||||||
| #define FIRST_LDT_INDEX     11	/* rest of descriptors are LDT's */ |  | ||||||
| 
 | 
 | ||||||
| /* Descriptor structure offsets. */ | /* Descriptor structure offsets. */ | ||||||
| #define DESC_BASE            2	/* to base_low */ | #define DESC_BASE            2	/* to base_low */ | ||||||
| @ -42,17 +40,14 @@ | |||||||
| #define DS_SELECTOR		DS_INDEX * DESC_SIZE | #define DS_SELECTOR		DS_INDEX * DESC_SIZE | ||||||
| #define ES_SELECTOR		ES_INDEX * DESC_SIZE | #define ES_SELECTOR		ES_INDEX * DESC_SIZE | ||||||
| /* flat DS is less privileged ES */ | /* flat DS is less privileged ES */ | ||||||
| #define FLAT_DS_SELECTOR	ES_SELECTOR | TASK_PRIVILEGE | #define FLAT_DS_SELECTOR	ES_SELECTOR | ||||||
| #define SS_SELECTOR		SS_INDEX * DESC_SIZE | #define SS_SELECTOR		SS_INDEX * DESC_SIZE | ||||||
| #define CS_SELECTOR		CS_INDEX * DESC_SIZE | #define CS_SELECTOR		CS_INDEX * DESC_SIZE | ||||||
| #define MON_CS_SELECTOR		MON_CS_INDEX * DESC_SIZE | #define MON_CS_SELECTOR		MON_CS_INDEX * DESC_SIZE | ||||||
| #define TSS_SELECTOR		TSS_INDEX * DESC_SIZE | #define TSS_SELECTOR		TSS_INDEX * DESC_SIZE | ||||||
| #define DS_286_SELECTOR		DS_286_INDEX*DESC_SIZE | TASK_PRIVILEGE |  | ||||||
| #define ES_286_SELECTOR		ES_286_INDEX*DESC_SIZE | TASK_PRIVILEGE |  | ||||||
| 
 | 
 | ||||||
| /* Privileges. */ | /* Privileges. */ | ||||||
| #define INTR_PRIVILEGE       0	/* kernel and interrupt handlers */ | #define INTR_PRIVILEGE       0	/* kernel and interrupt handlers */ | ||||||
| #define TASK_PRIVILEGE       1	/* kernel tasks */ |  | ||||||
| #define USER_PRIVILEGE       3	/* servers and user processes */ | #define USER_PRIVILEGE       3	/* servers and user processes */ | ||||||
| #define RPL_MASK             0x03	/* bits in selector RPL */ | #define RPL_MASK             0x03	/* bits in selector RPL */ | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -31,14 +31,13 @@ | |||||||
| .globl	mem_rdw	/* copy one word from [segment:offset] */ | .globl	mem_rdw	/* copy one word from [segment:offset] */ | ||||||
| .globl	reset	/* reset the system */ | .globl	reset	/* reset the system */ | ||||||
| .globl	halt_cpu/* halts the current cpu when idle */ | .globl	halt_cpu/* halts the current cpu when idle */ | ||||||
| .globl	level0	/* call a function at level 0 */ |  | ||||||
| .globl	read_cpu_flags	/* read the cpu flags */ | .globl	read_cpu_flags	/* read the cpu flags */ | ||||||
| .globl	read_cr0	/* read cr0 */ | .globl	read_cr0	/* read cr0 */ | ||||||
| .globl	read_cr2	/* read cr2 */ | .globl	read_cr2	/* read cr2 */ | ||||||
| .globl	getcr3val
 | .globl	getcr3val
 | ||||||
| .globl	write_cr0	/* write a value in cr0 */ | .globl	write_cr0	/* write a value in cr0 */ | ||||||
|  | .globl	read_cr3
 | ||||||
| .globl	read_cr4
 | .globl	read_cr4
 | ||||||
| .globl  thecr3
 |  | ||||||
| .globl	write_cr4
 | .globl	write_cr4
 | ||||||
| 
 | 
 | ||||||
| .globl	catch_pagefaults
 | .globl	catch_pagefaults
 | ||||||
| @ -614,33 +613,6 @@ halt_cpu: | |||||||
| 	cli | 	cli | ||||||
| 	ret | 	ret | ||||||
| 
 | 
 | ||||||
| /*===========================================================================*/ |  | ||||||
| /*			      level0					     */ |  | ||||||
| /*===========================================================================*/ |  | ||||||
| /* |  | ||||||
|  * PUBLIC void level0(void (*func)(void))  |  | ||||||
|  * Call a function at permission level 0.  This allows kernel tasks to do  |  | ||||||
|  * things that are only possible at the most privileged CPU level.  |  | ||||||
|  */  |  | ||||||
| level0: |  | ||||||
| 	/* check whether we are already running in kernel, the kernel cs |  | ||||||
| 	 * selector has 3 lower bits zeroed */ |  | ||||||
| 	mov	%cs, %ax |  | ||||||
| 	cmpw	$CS_SELECTOR, %ax |  | ||||||
| 	jne	0f |  | ||||||
| 
 |  | ||||||
| 	/* call the function directly as if it was a normal function call */ |  | ||||||
| 	mov	4(%esp), %eax |  | ||||||
| 	call	*%eax |  | ||||||
| 	ret |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 	/* if not runnig in the kernel yet, trap to kernel */ |  | ||||||
| 0: |  | ||||||
| 	mov	4(%esp), %eax |  | ||||||
| 	int	$LEVEL0_VECTOR |  | ||||||
| 	ret |  | ||||||
| 
 |  | ||||||
| /*===========================================================================*/ | /*===========================================================================*/ | ||||||
| /*			      read_flags				     */ | /*			      read_flags				     */ | ||||||
| /*===========================================================================*/ | /*===========================================================================*/ | ||||||
| @ -727,6 +699,19 @@ read_cr2: | |||||||
| 	mov	%cr2, %eax | 	mov	%cr2, %eax | ||||||
| 	ret | 	ret | ||||||
| 
 | 
 | ||||||
|  | /*===========================================================================*/ | ||||||
|  | /*			      read_cr3					     */ | ||||||
|  | /*===========================================================================*/ | ||||||
|  | /* PUBLIC unsigned long read_cr3(void); */ | ||||||
|  | read_cr3: | ||||||
|  | 	push	%ebp | ||||||
|  | 	mov	%esp, %ebp | ||||||
|  | 
 | ||||||
|  | 	/* DO NOT CHANGE THE OPERAND!!! gas2ack does not handle it yet */ | ||||||
|  | 	mov	%cr3, %eax | ||||||
|  | 	pop	%ebp | ||||||
|  | 	ret | ||||||
|  | 
 | ||||||
| /*===========================================================================*/ | /*===========================================================================*/ | ||||||
| /*			      read_cr4					     */ | /*			      read_cr4					     */ | ||||||
| /*===========================================================================*/ | /*===========================================================================*/ | ||||||
| @ -761,7 +746,6 @@ write_cr4: | |||||||
| /* PUBLIC unsigned long getcr3val(void); */ | /* PUBLIC unsigned long getcr3val(void); */ | ||||||
| getcr3val: | getcr3val: | ||||||
| 	mov	%cr3, %eax | 	mov	%cr3, %eax | ||||||
| 	mov	%eax, thecr3 |  | ||||||
| 	ret | 	ret | ||||||
| 
 | 
 | ||||||
| /* | /* | ||||||
|  | |||||||
| @ -52,8 +52,8 @@ PUBLIC void vm_init(struct proc *newptproc) | |||||||
| { | { | ||||||
| 	if(vm_running) | 	if(vm_running) | ||||||
| 		minix_panic("vm_init: vm_running", NO_NUM); | 		minix_panic("vm_init: vm_running", NO_NUM); | ||||||
| 	vm_set_cr3(newptproc); | 	switch_address_space(newptproc); | ||||||
| 	level0(vm_enable_paging); | 	vm_enable_paging(); | ||||||
| 	vm_running = 1; | 	vm_running = 1; | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
| @ -127,7 +127,7 @@ PUBLIC void vm_init(struct proc *newptproc) | |||||||
| 		PTR = I386_BIG_PAGE_SIZE*PDE + offset;			\ | 		PTR = I386_BIG_PAGE_SIZE*PDE + offset;			\ | ||||||
| 		REMAIN = MIN(REMAIN, I386_BIG_PAGE_SIZE - offset); 	\ | 		REMAIN = MIN(REMAIN, I386_BIG_PAGE_SIZE - offset); 	\ | ||||||
| 		if(1 || mustinvl) {					\ | 		if(1 || mustinvl) {					\ | ||||||
| 			level0(reload_cr3); 				\ | 			reload_cr3(); 					\ | ||||||
| 		}							\ | 		}							\ | ||||||
| 	}								\ | 	}								\ | ||||||
| } | } | ||||||
| @ -164,7 +164,7 @@ PRIVATE int lin_lin_copy(struct proc *srcproc, vir_bytes srclinaddr, | |||||||
| 
 | 
 | ||||||
| 	vmassert(ptproc); | 	vmassert(ptproc); | ||||||
| 	vmassert(proc_ptr); | 	vmassert(proc_ptr); | ||||||
| 	vmassert(read_cr3() == ptproc->p_seg.p_cr3); | 	vmassert(getcr3val() == ptproc->p_seg.p_cr3); | ||||||
| 
 | 
 | ||||||
| 	procslot = ptproc->p_nr; | 	procslot = ptproc->p_nr; | ||||||
| 
 | 
 | ||||||
| @ -238,25 +238,6 @@ PRIVATE u32_t phys_get32(phys_bytes addr) | |||||||
| 	return v; | 	return v; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| PRIVATE u32_t vm_cr3;	/* temp arg to level0() func */ |  | ||||||
| 
 |  | ||||||
| PRIVATE void set_cr3() |  | ||||||
| { |  | ||||||
| 	write_cr3(vm_cr3); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| PUBLIC void vm_set_cr3(struct proc *newptproc) |  | ||||||
| { |  | ||||||
| 	int u = 0; |  | ||||||
| 	if(!intr_disabled()) { lock; u = 1; } |  | ||||||
| 	vm_cr3= newptproc->p_seg.p_cr3; |  | ||||||
| 	if(vm_cr3) { |  | ||||||
| 		level0(set_cr3); |  | ||||||
| 		ptproc = newptproc; |  | ||||||
| 	} |  | ||||||
| 	if(u) { unlock; } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| PRIVATE char *cr0_str(u32_t e) | PRIVATE char *cr0_str(u32_t e) | ||||||
| { | { | ||||||
| 	static char str[80]; | 	static char str[80]; | ||||||
| @ -632,8 +613,6 @@ int delivermsg(struct proc *rp) | |||||||
| 
 | 
 | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| 	vm_set_cr3(rp); |  | ||||||
| 
 |  | ||||||
| 	PHYS_COPY_CATCH(vir2phys(&rp->p_delivermsg), | 	PHYS_COPY_CATCH(vir2phys(&rp->p_delivermsg), | ||||||
| 		rp->p_delivermsg_lin, sizeof(message), addr); | 		rp->p_delivermsg_lin, sizeof(message), addr); | ||||||
| 
 | 
 | ||||||
| @ -724,15 +703,6 @@ PRIVATE void vm_print(u32_t *root) | |||||||
| 	return; | 	return; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| u32_t thecr3; |  | ||||||
| 
 |  | ||||||
| u32_t read_cr3(void) |  | ||||||
| { |  | ||||||
| 	level0(getcr3val); |  | ||||||
| 	return thecr3; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| /*===========================================================================*
 | /*===========================================================================*
 | ||||||
|  *				lin_memset				     * |  *				lin_memset				     * | ||||||
|  *===========================================================================*/ |  *===========================================================================*/ | ||||||
| @ -1058,7 +1028,7 @@ PUBLIC int arch_enable_paging(void) | |||||||
| 	 * lapic address. Bad things would happen. It is unfortunate but such is | 	 * lapic address. Bad things would happen. It is unfortunate but such is | ||||||
| 	 * life | 	 * life | ||||||
| 	 */ | 	 */ | ||||||
| 	level0(i386_watchdog_start); | 	i386_watchdog_start(); | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| 	return OK; | 	return OK; | ||||||
|  | |||||||
| @ -86,7 +86,6 @@ begbss: | |||||||
| 
 | 
 | ||||||
| .globl	restart
 | .globl	restart
 | ||||||
| .globl reload_cr3
 | .globl reload_cr3
 | ||||||
| .globl write_cr3
 |  | ||||||
| 
 | 
 | ||||||
| .globl	divide_error
 | .globl	divide_error
 | ||||||
| .globl	single_step_exception
 | .globl	single_step_exception
 | ||||||
| @ -131,8 +130,6 @@ begbss: | |||||||
| .globl	hwint14
 | .globl	hwint14
 | ||||||
| .globl	hwint15
 | .globl	hwint15
 | ||||||
| 
 | 
 | ||||||
| .globl	level0_call
 |  | ||||||
| 
 |  | ||||||
| /* Exported variables. */ | /* Exported variables. */ | ||||||
| .globl	begbss
 | .globl	begbss
 | ||||||
| .globl	begdata
 | .globl	begdata
 | ||||||
| @ -706,41 +703,6 @@ no_fpu_available: | |||||||
| 	pop	%ebp | 	pop	%ebp | ||||||
| 	ret | 	ret | ||||||
| 
 | 
 | ||||||
| /*===========================================================================*/ |  | ||||||
| /*				write_cr3				     */ |  | ||||||
| /*===========================================================================*/ |  | ||||||
| /* PUBLIC void write_cr3(unsigned long value); */ |  | ||||||
| write_cr3: |  | ||||||
| 	push    %ebp |  | ||||||
| 	mov     %esp, %ebp |  | ||||||
| 	mov	8(%ebp), %eax |  | ||||||
| 	mov	%cr3, %ecx |  | ||||||
| 	cmp	%ecx, %eax |  | ||||||
| 	jz	0f |  | ||||||
| 	mov	%eax, %cr3 |  | ||||||
| 	movl	$0, dirtypde |  | ||||||
| 0: |  | ||||||
| 	pop     %ebp |  | ||||||
| 	ret |  | ||||||
| 
 |  | ||||||
| /*===========================================================================*/ |  | ||||||
| /*				level0_call				     */ |  | ||||||
| /*===========================================================================*/ |  | ||||||
| level0_call: |  | ||||||
| /* |  | ||||||
|  * which level0 function to call was passed here by putting it in %eax |  | ||||||
|  */ |  | ||||||
| 	SAVE_PROCESS_CTX(0) |  | ||||||
| 	/* for stack trace */ |  | ||||||
| 	movl	$0, %ebp |  | ||||||
| 	/* |  | ||||||
| 	 * the function to call is in %eax, set in userspace. SAVE_PROCESS_CTX() |  | ||||||
| 	 * does not clobber this register so we can use it straightaway |  | ||||||
| 	 */ |  | ||||||
| 	call	*%eax |  | ||||||
| 	jmp	restart |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| /*===========================================================================*/ | /*===========================================================================*/ | ||||||
| /*				reload_cr3				     */ | /*				reload_cr3				     */ | ||||||
| /*===========================================================================*/ | /*===========================================================================*/ | ||||||
|  | |||||||
| @ -152,11 +152,7 @@ PUBLIC void prot_init(void) | |||||||
|   	 kinfo.code_base, kinfo.code_size, INTR_PRIVILEGE); |   	 kinfo.code_base, kinfo.code_size, INTR_PRIVILEGE); | ||||||
|   init_dataseg(&gdt[DS_INDEX], |   init_dataseg(&gdt[DS_INDEX], | ||||||
|   	 kinfo.data_base, kinfo.data_size, INTR_PRIVILEGE); |   	 kinfo.data_base, kinfo.data_size, INTR_PRIVILEGE); | ||||||
|   init_dataseg(&gdt[ES_INDEX], 0L, 0, TASK_PRIVILEGE); |   init_dataseg(&gdt[ES_INDEX], 0L, 0, INTR_PRIVILEGE); | ||||||
| 
 |  | ||||||
|   /* Build scratch descriptors for functions in klib88. */ |  | ||||||
|   init_dataseg(&gdt[DS_286_INDEX], 0L, 0, TASK_PRIVILEGE); |  | ||||||
|   init_dataseg(&gdt[ES_286_INDEX], 0L, 0, TASK_PRIVILEGE); |  | ||||||
| 
 | 
 | ||||||
|   /* Build local descriptors in GDT for LDT's in process table.
 |   /* Build local descriptors in GDT for LDT's in process table.
 | ||||||
|    * The LDT's are allocated at compile time in the process table, and |    * The LDT's are allocated at compile time in the process table, and | ||||||
| @ -214,7 +210,6 @@ PUBLIC void idt_init(void) | |||||||
| 		{ simd_exception, SIMD_EXCEPTION_VECTOR, INTR_PRIVILEGE }, | 		{ simd_exception, SIMD_EXCEPTION_VECTOR, INTR_PRIVILEGE }, | ||||||
| 		{ ipc_entry, IPC_VECTOR, USER_PRIVILEGE }, | 		{ ipc_entry, IPC_VECTOR, USER_PRIVILEGE }, | ||||||
| 		{ kernel_call_entry, KERN_CALL_VECTOR, USER_PRIVILEGE }, | 		{ kernel_call_entry, KERN_CALL_VECTOR, USER_PRIVILEGE }, | ||||||
| 		{ level0_call, LEVEL0_VECTOR, TASK_PRIVILEGE }, |  | ||||||
| 		{ NULL, 0, 0} | 		{ NULL, 0, 0} | ||||||
| 	}; | 	}; | ||||||
| 
 | 
 | ||||||
| @ -273,7 +268,6 @@ PUBLIC void alloc_segments(register struct proc *rp) | |||||||
| { | { | ||||||
| /* This is called at system initialization from main() and by do_newmap(). 
 | /* This is called at system initialization from main() and by do_newmap(). 
 | ||||||
|  * The code has a separate function because of all hardware-dependencies. |  * The code has a separate function because of all hardware-dependencies. | ||||||
|  * Note that IDLE is part of the kernel and gets TASK_PRIVILEGE here. |  | ||||||
|  */ |  */ | ||||||
|   phys_bytes code_bytes; |   phys_bytes code_bytes; | ||||||
|   phys_bytes data_bytes; |   phys_bytes data_bytes; | ||||||
| @ -285,9 +279,6 @@ PUBLIC void alloc_segments(register struct proc *rp) | |||||||
|           code_bytes = data_bytes;	/* common I&D, poor protect */ |           code_bytes = data_bytes;	/* common I&D, poor protect */ | ||||||
|       else |       else | ||||||
|           code_bytes = (phys_bytes) rp->p_memmap[T].mem_len << CLICK_SHIFT; |           code_bytes = (phys_bytes) rp->p_memmap[T].mem_len << CLICK_SHIFT; | ||||||
|       if( (iskernelp(rp))) |  | ||||||
| 	privilege = TASK_PRIVILEGE; |  | ||||||
|       else |  | ||||||
|       privilege = USER_PRIVILEGE; |       privilege = USER_PRIVILEGE; | ||||||
|       init_codeseg(&rp->p_seg.p_ldt[CS_LDT_INDEX], |       init_codeseg(&rp->p_seg.p_ldt[CS_LDT_INDEX], | ||||||
|           (phys_bytes) rp->p_memmap[T].mem_phys << CLICK_SHIFT, |           (phys_bytes) rp->p_memmap[T].mem_phys << CLICK_SHIFT, | ||||||
| @ -319,9 +310,6 @@ for (rp = BEG_PROC_ADDR; rp < END_PROC_ADDR; ++rp) { | |||||||
| 		if (isemptyp(rp)) | 		if (isemptyp(rp)) | ||||||
| 			continue; | 			continue; | ||||||
| 
 | 
 | ||||||
|       if( (iskernelp(rp))) |  | ||||||
| 	privilege = TASK_PRIVILEGE; |  | ||||||
|       else |  | ||||||
| 	privilege = USER_PRIVILEGE; | 	privilege = USER_PRIVILEGE; | ||||||
| 
 | 
 | ||||||
| 	cs = (CS_LDT_INDEX*DESC_SIZE) | TI | privilege; | 	cs = (CS_LDT_INDEX*DESC_SIZE) | TI | privilege; | ||||||
|  | |||||||
| @ -50,7 +50,6 @@ _PROTOTYPE( void level0_call, (void) ); | |||||||
| /* memory.c */ | /* memory.c */ | ||||||
| _PROTOTYPE( void i386_freepde, (int pde)); | _PROTOTYPE( void i386_freepde, (int pde)); | ||||||
| _PROTOTYPE( void getcr3val, (void)); | _PROTOTYPE( void getcr3val, (void)); | ||||||
| _PROTOTYPE( void vm_set_cr3, (struct proc *)); |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| /* exception.c */ | /* exception.c */ | ||||||
| @ -67,16 +66,15 @@ struct exception_frame { | |||||||
| _PROTOTYPE( void exception, (struct exception_frame * frame)); | _PROTOTYPE( void exception, (struct exception_frame * frame)); | ||||||
| 
 | 
 | ||||||
| /* klib386.s */ | /* klib386.s */ | ||||||
| _PROTOTYPE( void level0, (void (*func)(void))                           ); |  | ||||||
| _PROTOTYPE( void monitor, (void)                                        ); | _PROTOTYPE( void monitor, (void)                                        ); | ||||||
| _PROTOTYPE( void reset, (void)                                          ); | _PROTOTYPE( void reset, (void)                                          ); | ||||||
| _PROTOTYPE( void int86, (void)                     			); | _PROTOTYPE( void int86, (void)                     			); | ||||||
| _PROTOTYPE( reg_t read_cr0, (void)					); | _PROTOTYPE( reg_t read_cr0, (void)					); | ||||||
| _PROTOTYPE( reg_t read_cr2, (void)					); | _PROTOTYPE( reg_t read_cr2, (void)					); | ||||||
| _PROTOTYPE( void write_cr0, (unsigned long value)                       ); | _PROTOTYPE( void write_cr0, (unsigned long value)                       ); | ||||||
|  | _PROTOTYPE( unsigned long read_cr3, (void)                              ); | ||||||
| _PROTOTYPE( unsigned long read_cr4, (void)                              ); | _PROTOTYPE( unsigned long read_cr4, (void)                              ); | ||||||
| _PROTOTYPE( void write_cr4, (unsigned long value)                       ); | _PROTOTYPE( void write_cr4, (unsigned long value)                       ); | ||||||
| _PROTOTYPE( void write_cr3, (unsigned long value)                       ); |  | ||||||
| _PROTOTYPE( unsigned long read_cpu_flags, (void)                        ); | _PROTOTYPE( unsigned long read_cpu_flags, (void)                        ); | ||||||
| _PROTOTYPE( void phys_insb, (U16_t port, phys_bytes buf, size_t count)  ); | _PROTOTYPE( void phys_insb, (U16_t port, phys_bytes buf, size_t count)  ); | ||||||
| _PROTOTYPE( void phys_insw, (U16_t port, phys_bytes buf, size_t count)  ); | _PROTOTYPE( void phys_insw, (U16_t port, phys_bytes buf, size_t count)  ); | ||||||
|  | |||||||
| @ -31,7 +31,7 @@ FORWARD _PROTOTYPE( void ser_debug, (int c)); | |||||||
| 
 | 
 | ||||||
| PUBLIC void arch_monitor(void) | PUBLIC void arch_monitor(void) | ||||||
| { | { | ||||||
| 	level0(monitor); | 	monitor(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| PUBLIC int cpu_has_tsc; | PUBLIC int cpu_has_tsc; | ||||||
| @ -103,7 +103,7 @@ PUBLIC void arch_shutdown(int how) | |||||||
| 		u16_t magic = STOP_MEM_CHECK; | 		u16_t magic = STOP_MEM_CHECK; | ||||||
| 		phys_copy(vir2phys(&magic), SOFT_RESET_FLAG_ADDR, | 		phys_copy(vir2phys(&magic), SOFT_RESET_FLAG_ADDR, | ||||||
|        	 	SOFT_RESET_FLAG_SIZE); |        	 	SOFT_RESET_FLAG_SIZE); | ||||||
| 		level0(reset); | 		reset(); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Tomas Hruby
						Tomas Hruby