Fix loading CS segment for AMD64 architecture
This commit is contained in:
parent
b31aa82872
commit
7011d456e9
|
@ -235,30 +235,42 @@ ArLoadSegment(IN USHORT Segment,
|
||||||
switch(Segment)
|
switch(Segment)
|
||||||
{
|
{
|
||||||
case SEGMENT_CS:
|
case SEGMENT_CS:
|
||||||
asm volatile("movl %0, %%cs"
|
/* Load CS Segment */
|
||||||
|
asm volatile("mov %0, %%rax\n"
|
||||||
|
"push %%rax\n"
|
||||||
|
"lea label(%%rip), %%rax\n"
|
||||||
|
"push %%rax\n"
|
||||||
|
"lretq\n"
|
||||||
|
"label:"
|
||||||
:
|
:
|
||||||
: "r" (Source));
|
: "ri" ((ULONGLONG)Source)
|
||||||
|
: "rax");
|
||||||
break;
|
break;
|
||||||
case SEGMENT_DS:
|
case SEGMENT_DS:
|
||||||
|
/* Load DS Segment */
|
||||||
asm volatile("movl %0, %%ds"
|
asm volatile("movl %0, %%ds"
|
||||||
:
|
:
|
||||||
: "r" (Source));
|
: "r" (Source));
|
||||||
break;
|
break;
|
||||||
case SEGMENT_ES:
|
case SEGMENT_ES:
|
||||||
|
/* Load ES Segment */
|
||||||
asm volatile("movl %0, %%es"
|
asm volatile("movl %0, %%es"
|
||||||
:
|
:
|
||||||
: "r" (Source));
|
: "r" (Source));
|
||||||
break;
|
break;
|
||||||
case SEGMENT_FS:
|
case SEGMENT_FS:
|
||||||
|
/* Load FS Segment */
|
||||||
asm volatile("movl %0, %%fs"
|
asm volatile("movl %0, %%fs"
|
||||||
:
|
:
|
||||||
: "r" (Source));
|
: "r" (Source));
|
||||||
break;
|
break;
|
||||||
case SEGMENT_GS:
|
case SEGMENT_GS:
|
||||||
|
/* Load GS Segment */
|
||||||
asm volatile("movl %0, %%gs"
|
asm volatile("movl %0, %%gs"
|
||||||
:
|
:
|
||||||
: "r" (Source));
|
: "r" (Source));
|
||||||
break;
|
break;
|
||||||
|
/* Load SS Segment */
|
||||||
case SEGMENT_SS:
|
case SEGMENT_SS:
|
||||||
asm volatile("movl %0, %%ss"
|
asm volatile("movl %0, %%ss"
|
||||||
:
|
:
|
||||||
|
|
Loading…
Reference in New Issue