diff --git a/compiler/x86/cx86innr.inc b/compiler/x86/cx86innr.inc index a65e4733b3..fd0fc71cf0 100644 --- a/compiler/x86/cx86innr.inc +++ b/compiler/x86/cx86innr.inc @@ -19,4 +19,10 @@ in_x86_outportw = fpc_in_cpu_first+4, in_x86_outportl = fpc_in_cpu_first+5, in_x86_cli = fpc_in_cpu_first+6, - in_x86_sti = fpc_in_cpu_first+7 + in_x86_sti = fpc_in_cpu_first+7, + in_x86_get_cs = fpc_in_cpu_first+8, + in_x86_get_ss = fpc_in_cpu_first+9, + in_x86_get_ds = fpc_in_cpu_first+10, + in_x86_get_es = fpc_in_cpu_first+11, + in_x86_get_fs = fpc_in_cpu_first+12, + in_x86_get_gs = fpc_in_cpu_first+13 diff --git a/compiler/x86/nx86inl.pas b/compiler/x86/nx86inl.pas index 6ae0326f6b..d4f0196448 100644 --- a/compiler/x86/nx86inl.pas +++ b/compiler/x86/nx86inl.pas @@ -139,6 +139,17 @@ implementation in_x86_cli, in_x86_sti: resultdef:=voidtype; + in_x86_get_cs, + in_x86_get_ss, + in_x86_get_ds, + in_x86_get_es, + in_x86_get_fs, + in_x86_get_gs: +{$ifdef i8086} + resultdef:=u16inttype; +{$else i8086} + resultdef:=s32inttype; +{$endif i8086} else Result:=inherited pass_typecheck_cpu; end; @@ -151,7 +162,13 @@ implementation case inlinenumber of in_x86_inportb, in_x86_inportw, - in_x86_inportl: + in_x86_inportl, + in_x86_get_cs, + in_x86_get_ss, + in_x86_get_ds, + in_x86_get_es, + in_x86_get_fs, + in_x86_get_gs: expectloc:=LOC_REGISTER; in_x86_outportb, in_x86_outportw, @@ -448,6 +465,13 @@ implementation hlcg.ungetcpuregister(current_asmdata.CurrAsmList,dreg); end; + procedure get_segreg(segreg:tregister); + begin + location_reset(location,LOC_REGISTER,def_cgsize(resultdef)); + location.register:=hlcg.getintregister(current_asmdata.CurrAsmList,resultdef); + current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(A_MOV,TCGSize2OpSize[def_cgsize(resultdef)],segreg,location.register)); + end; + begin case inlinenumber of in_x86_inportb: @@ -466,6 +490,18 @@ implementation current_asmdata.CurrAsmList.concat(taicpu.op_none(A_CLI)); in_x86_sti: current_asmdata.CurrAsmList.concat(taicpu.op_none(A_STI)); + in_x86_get_cs: + get_segreg(NR_CS); + in_x86_get_ss: + get_segreg(NR_SS); + in_x86_get_ds: + get_segreg(NR_DS); + in_x86_get_es: + get_segreg(NR_ES); + in_x86_get_fs: + get_segreg(NR_FS); + in_x86_get_gs: + get_segreg(NR_GS); else inherited pass_generate_code_cpu; end; diff --git a/rtl/i386/cpuh.inc b/rtl/i386/cpuh.inc index 69b78c5644..7c16f38907 100644 --- a/rtl/i386/cpuh.inc +++ b/rtl/i386/cpuh.inc @@ -34,3 +34,9 @@ procedure fpc_x86_outportw(port : word;data : word);[internproc:fpc_in_x86_outpo procedure fpc_x86_outportl(port : word;data : longint);[internproc:fpc_in_x86_outportl]; procedure fpc_x86_cli;[internproc:fpc_in_x86_cli]; procedure fpc_x86_sti;[internproc:fpc_in_x86_sti]; +function fpc_x86_get_cs:longint;[internproc:fpc_in_x86_get_cs]; +function fpc_x86_get_ss:longint;[internproc:fpc_in_x86_get_ss]; +function fpc_x86_get_ds:longint;[internproc:fpc_in_x86_get_ds]; +function fpc_x86_get_es:longint;[internproc:fpc_in_x86_get_es]; +function fpc_x86_get_fs:longint;[internproc:fpc_in_x86_get_fs]; +function fpc_x86_get_gs:longint;[internproc:fpc_in_x86_get_gs]; diff --git a/rtl/i386/cpuinnr.inc b/rtl/i386/cpuinnr.inc index af367bffe8..5ae1c3e43b 100644 --- a/rtl/i386/cpuinnr.inc +++ b/rtl/i386/cpuinnr.inc @@ -20,3 +20,9 @@ fpc_in_x86_outportl = fpc_in_cpu_first+5; fpc_in_x86_cli = fpc_in_cpu_first+6; fpc_in_x86_sti = fpc_in_cpu_first+7; + fpc_in_x86_get_cs = fpc_in_cpu_first+8; + fpc_in_x86_get_ss = fpc_in_cpu_first+9; + fpc_in_x86_get_ds = fpc_in_cpu_first+10; + fpc_in_x86_get_es = fpc_in_cpu_first+11; + fpc_in_x86_get_fs = fpc_in_cpu_first+12; + fpc_in_x86_get_gs = fpc_in_cpu_first+13; \ No newline at end of file diff --git a/rtl/i8086/cpuh.inc b/rtl/i8086/cpuh.inc index eb85c4783a..e3647ffb5f 100644 --- a/rtl/i8086/cpuh.inc +++ b/rtl/i8086/cpuh.inc @@ -34,3 +34,9 @@ procedure fpc_x86_outportw(port : word;data : word);[internproc:fpc_in_x86_outpo //procedure fpc_x86_outportl(port : word;data : longint);[internproc:fpc_in_x86_outportl]; procedure fpc_x86_cli;[internproc:fpc_in_x86_cli]; procedure fpc_x86_sti;[internproc:fpc_in_x86_sti]; +function fpc_x86_get_cs:word;[internproc:fpc_in_x86_get_cs]; +function fpc_x86_get_ss:word;[internproc:fpc_in_x86_get_ss]; +function fpc_x86_get_ds:word;[internproc:fpc_in_x86_get_ds]; +function fpc_x86_get_es:word;[internproc:fpc_in_x86_get_es]; +function fpc_x86_get_fs:word;[internproc:fpc_in_x86_get_fs]; +function fpc_x86_get_gs:word;[internproc:fpc_in_x86_get_gs]; diff --git a/rtl/i8086/cpuinnr.inc b/rtl/i8086/cpuinnr.inc index b15cf925d6..7d49c54153 100644 --- a/rtl/i8086/cpuinnr.inc +++ b/rtl/i8086/cpuinnr.inc @@ -20,3 +20,9 @@ // fpc_in_x86_outportl = fpc_in_cpu_first+5; fpc_in_x86_cli = fpc_in_cpu_first+6; fpc_in_x86_sti = fpc_in_cpu_first+7; + fpc_in_x86_get_cs = fpc_in_cpu_first+8; + fpc_in_x86_get_ss = fpc_in_cpu_first+9; + fpc_in_x86_get_ds = fpc_in_cpu_first+10; + fpc_in_x86_get_es = fpc_in_cpu_first+11; + fpc_in_x86_get_fs = fpc_in_cpu_first+12; + fpc_in_x86_get_gs = fpc_in_cpu_first+13; \ No newline at end of file diff --git a/rtl/x86_64/cpuh.inc b/rtl/x86_64/cpuh.inc index f516cab7e1..b8e12bc8a2 100644 --- a/rtl/x86_64/cpuh.inc +++ b/rtl/x86_64/cpuh.inc @@ -25,3 +25,9 @@ procedure fpc_x86_outportw(port : word;data : word);[internproc:fpc_in_x86_outpo procedure fpc_x86_outportl(port : word;data : longint);[internproc:fpc_in_x86_outportl]; procedure fpc_x86_cli;[internproc:fpc_in_x86_cli]; procedure fpc_x86_sti;[internproc:fpc_in_x86_sti]; +function fpc_x86_get_cs:longint;[internproc:fpc_in_x86_get_cs]; +function fpc_x86_get_ss:longint;[internproc:fpc_in_x86_get_ss]; +function fpc_x86_get_ds:longint;[internproc:fpc_in_x86_get_ds]; +function fpc_x86_get_es:longint;[internproc:fpc_in_x86_get_es]; +function fpc_x86_get_fs:longint;[internproc:fpc_in_x86_get_fs]; +function fpc_x86_get_gs:longint;[internproc:fpc_in_x86_get_gs]; diff --git a/rtl/x86_64/cpuinnr.inc b/rtl/x86_64/cpuinnr.inc index af367bffe8..5ae1c3e43b 100644 --- a/rtl/x86_64/cpuinnr.inc +++ b/rtl/x86_64/cpuinnr.inc @@ -20,3 +20,9 @@ fpc_in_x86_outportl = fpc_in_cpu_first+5; fpc_in_x86_cli = fpc_in_cpu_first+6; fpc_in_x86_sti = fpc_in_cpu_first+7; + fpc_in_x86_get_cs = fpc_in_cpu_first+8; + fpc_in_x86_get_ss = fpc_in_cpu_first+9; + fpc_in_x86_get_ds = fpc_in_cpu_first+10; + fpc_in_x86_get_es = fpc_in_cpu_first+11; + fpc_in_x86_get_fs = fpc_in_cpu_first+12; + fpc_in_x86_get_gs = fpc_in_cpu_first+13; \ No newline at end of file