forked from Bananymous/banan-os
				
			
		
			
				
	
	
		
			56 lines
		
	
	
		
			781 B
		
	
	
	
		
			ArmAsm
		
	
	
	
			
		
		
	
	
			56 lines
		
	
	
		
			781 B
		
	
	
	
		
			ArmAsm
		
	
	
	
| # uint32_t read_ip()
 | |
| .global read_ip
 | |
| read_ip:
 | |
| 	popl %eax
 | |
| 	jmp *%eax
 | |
| 
 | |
| # void start_kernel_thread()
 | |
| .global start_kernel_thread
 | |
| start_kernel_thread:
 | |
| 	call get_thread_start_sp
 | |
| 	movl %eax, %esp
 | |
| 
 | |
| 	# STACK LAYOUT
 | |
| 	#   on_exit arg
 | |
| 	#   on_exit func
 | |
| 	#   entry arg
 | |
| 	#   entry func
 | |
| 
 | |
| 	movl 4(%esp), %edi
 | |
| 	movl 0(%esp), %esi
 | |
| 
 | |
| 	subl $12, %esp
 | |
| 	pushl %edi
 | |
| 	sti
 | |
| 	call *%esi
 | |
| 	addl $16, %esp
 | |
| 
 | |
| 	movl 12(%esp), %edi
 | |
| 	movl  8(%esp), %esi
 | |
| 
 | |
| 	subl $12, %esp
 | |
| 	pushl %edi
 | |
| 	call *%esi
 | |
| 	addl $16, %esp
 | |
| 
 | |
| 
 | |
| .global start_userspace_thread
 | |
| start_userspace_thread:
 | |
| 	call load_thread_sse
 | |
| 
 | |
| 	call get_thread_start_sp
 | |
| 	movl %eax, %esp
 | |
| 
 | |
| 	# ds, es = user data
 | |
| 	movw $(0x20 | 3), %bx
 | |
| 	movw %bx, %ds
 | |
| 	movw %bx, %es
 | |
| 	# gs = thread local
 | |
| 	movw $(0x30 | 3), %bx
 | |
| 	movw %bx, %gs
 | |
| 	# fs = 0
 | |
| 	xorw %bx, %bx
 | |
| 	movw %bx, %fs
 | |
| 
 | |
| 	iret
 |