00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 .globl scheduler_wrapper
00021
00022
00023 .extern current_thread
00024 .extern kernel_tss
00025
00026 .text
00027
00028
00029
00030 .extern eloziom
00031 .macro eoi_iret
00032
00033 push %eax
00034 movb $0x20, %al
00035 outb %al, $0x20
00036 pop %eax
00037
00038 iret
00039 .endm
00040
00041 .equ thread_ksp, 0
00042 .equ thread_tsp, 4
00043 .equ thread_isp, 8
00044
00045 .lcomm Temp_DS_Storage, 4
00046 .lcomm Temp_SS_Storage, 4
00047 .lcomm Temp_ESP_Storage, 4
00048 .lcomm Scheduler_First_Run, 4
00049
00050 .macro context_save
00051
00052 pushl %ds
00053 pushl %ss
00054 pushl $0x10
00055 pushl $0x10
00056 popl %ds
00057 popl %ss
00058 popl (Temp_SS_Storage)
00059 popl (Temp_DS_Storage)
00060
00061 cmpl $0, (Scheduler_First_Run)
00062 je skip_run
00063
00064 movl %esp, (Temp_ESP_Storage)
00065
00066 mov (current_thread), %esp
00067 mov thread_ksp(%esp), %esp
00068
00069 pushl (Temp_ESP_Storage)
00070 pusha
00071 pushl (Temp_DS_Storage)
00072 pushl %es
00073 pushl %fs
00074 pushl %gs
00075
00076 movl (current_thread), %eax
00077 mov %esp, thread_ksp(%eax)
00078
00079 movl (current_thread), %eax
00080 movl (Temp_ESP_Storage), %ebx
00081 movl %ebx, thread_tsp(%eax)
00082 skip_run:
00083 movl $1, (Scheduler_First_Run)
00084 .endm
00085
00086
00087 .extern pr
00088 .macro context_restore
00089
00090 mov (current_thread), %esp
00091 mov thread_ksp(%esp), %esp
00092
00093 movl (current_thread), %eax
00094 addl $0x34, thread_ksp(%eax)
00095
00096 movl (current_thread), %eax
00097 movl thread_isp(%eax), %ecx
00098 movl $kernel_tss, %eax
00099 movl %ecx, 4(%eax)
00100
00101
00102 popl %gs
00103 popl %fs
00104 popl %es
00105 popl %ds
00106 popa
00107
00108 popl %esp
00109 .endm
00110
00111 .lcomm Temp_Stack, 0x400
00112
00113 .macro scheduler_run
00114
00115 mov $Temp_Stack, %esp
00116 pushl $0x10
00117 popl %es
00118 pushl $0x10
00119 popl %fs
00120 pushl $0x10
00121 popl %gs
00122 addl $0x400, %esp
00123 call choose_next_thread
00124 .endm
00125
00126
00127 scheduler_wrapper:
00128 context_save
00129 scheduler_run
00130
00131 context_restore
00132 eoi_iret
00133
00134 .data
00135
00136 .bss
00137
00138
00139
00140
00141
00142
00143