2 meinOS - A unix-like x86 microkernel operating system
3 Copyright (C) 2008 Janosch Gräf <janosch.graef@gmx.net>
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
30 * @return 0=Success; -1=Failure
33 cpu_t
*cpu
= cpu_this
;
36 tss_t
*tss
= malloc(sizeof(tss_t
));
37 if (tss
==NULL
) return -1;
38 memset(tss
,0,sizeof(tss_t
));
39 tss
->ss0
= IDX2SEL(2,PRIV_KERNEL
);
40 tss
->esp0
= (uint32_t)(cpu
->stack
+cpu
->stacksize
-4)+sizeof(struct vm86_segmentregs
);
41 tss
->iopb_offset
= offsetof(tss_t
,iopb
);
44 // create TSS descriptor
45 int index
= GDT_TSSDESC
+cpu_getid();
46 gdt_set_descriptor(index
,sizeof(tss_t
)-1,tss
,GDT_PRESENT
|GDT_TSS
,PRIV_USER
);
47 gdt
[index
].flags
&= 0x0F;
49 // load TSS descriptor
50 selector_t selector
= {
55 asm("ltr %0"::"a"(selector
));