Message-ID: <01BE1264.A6BD3580@PLUM.engr.rendition.com> From: Jay Tseng To: "Eli Zaretskii (E-mail)" Cc: "Djgpp AT Delorie. Com (E-mail)" , "'jay DOT tseng AT rendition DOT com'" Subject: Inline Assembly to access control registers C0 and C3 Date: Tue, 17 Nov 1998 19:58:30 -0800 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="---- =_NextPart_000_01BE1264.A6C4D6A0" Reply-To: djgpp AT delorie DOT com ------ =_NextPart_000_01BE1264.A6C4D6A0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Hi Eli, Help needed. I wrote C code with inline assembly. It accesses control registers CR0 = and CR3. The code is as shown after this message. The problem is that it = runs under WINDOWS DOS environment but fails when runs under pure DOS = environment with error message "Exiting due to signal SIGSEGV, General = Protection Fault at eip=3D........". I use djgcc version 2.1 and = compiled the code with " gcc -fomit-frame-pointer -m386 -Wall ". = Inside the code, I intentionally created v_test0 and v_test3 = corresponding to v_getCR0 and v_getCR3 respectively with minor changes. = In DOS environment, v_test0 and v_test3 went through but failed when = v_getCR0 is encountered. Any idea? By the way the processor is a = Pentium-s 166. Thanks, Jay =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D #include unsigned long result=3D0; void=20 v_test0() { __asm__ __volatile__ ( "movl $0x11111111, %eax\n" "movl %eax, _result\n" ); return; } void=20 v_getCR0() { __asm__ __volatile__ ( "movl %cr0, %eax\n" "movl %eax, _result\n" ); return; } void v_test3() { asm volatile ( "movl $0x22222222, %0\n" : "=3Db" (result) :=20 : "%ebx" , "memory" ); return; } void v_getCR3() { asm volatile ( "movl %%cr3, %0\n" : "=3Db" (result) :=20 : "%ebx" , "memory" ); return; } #define disable() __asm__ __volatile__ ("cli"); void main() { =20 disable(); v_test0(); printf("result=3D0x%x\n", result); v_test3(); printf("result=3D0x%x\n", result); v_getCR0(); printf("result=3Dcr0=3D0x%x\n", result); v_getCR3(); printf("result=3Dcr3=3D0x%x\n", result); return; } =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =20 ------ =_NextPart_000_01BE1264.A6C4D6A0 Content-Type: application/octet-stream; name="junk.c" Content-Transfer-Encoding: base64 I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCnVuc2lnbmVkIGxvbmcgcmVzdWx0PTA7DQoNCg0Kdm9pZCAN CnZfdGVzdDAoKQ0Kew0KDQoJX19hc21fXyBfX3ZvbGF0aWxlX18NCgkoDQoJICJtb3ZsICQweDEx MTExMTExLCAlZWF4XG4iDQoJICJtb3ZsICVlYXgsIF9yZXN1bHRcbiINCgkpOw0KCXJldHVybjsN Cn0NCnZvaWQgDQp2X2dldENSMCgpDQp7DQoNCglfX2FzbV9fIF9fdm9sYXRpbGVfXw0KCSgNCgkg Im1vdmwgJWNyMCwgJWVheFxuIg0KCSAibW92bCAlZWF4LCBfcmVzdWx0XG4iDQoJKTsNCglyZXR1 cm47DQp9DQoNCnZvaWQNCnZfdGVzdDMoKQ0Kew0KDQoJYXNtIHZvbGF0aWxlDQoJKA0KCSAibW92 bCAkMHgyMjIyMjIyMiwgJTBcbiINCgkgOiAiPWIiIChyZXN1bHQpDQoJIDogDQoJIDogIiVlYngi ICwgIm1lbW9yeSINCgkpOw0KCXJldHVybjsNCn0NCnZvaWQNCnZfZ2V0Q1IzKCkNCnsNCg0KCWFz bSB2b2xhdGlsZQ0KCSgNCgkgIm1vdmwgJSVjcjMsICUwXG4iDQoJIDogIj1iIiAocmVzdWx0KQ0K CSA6IA0KCSA6ICIlZWJ4IiAsICJtZW1vcnkiDQoJKTsNCglyZXR1cm47DQp9DQoNCiNkZWZpbmUg ZGlzYWJsZSgpIF9fYXNtX18gX192b2xhdGlsZV9fICgiY2xpIik7DQoNCg0KDQp2b2lkIG1haW4o KQ0Kew0KICAgDQoJZGlzYWJsZSgpOw0KCXZfdGVzdDAoKTsNCglwcmludGYoInJlc3VsdD0weCV4 XG4iLCByZXN1bHQpOw0KCXZfdGVzdDMoKTsNCglwcmludGYoInJlc3VsdD0weCV4XG4iLCByZXN1 bHQpOw0KCXZfZ2V0Q1IwKCk7DQoJcHJpbnRmKCJyZXN1bHQ9Y3IwPTB4JXhcbiIsIHJlc3VsdCk7 DQoJdl9nZXRDUjMoKTsNCglwcmludGYoInJlc3VsdD1jcjM9MHgleFxuIiwgcmVzdWx0KTsNCg0K CXJldHVybjsNCg0KfQ0KDQo= ------ =_NextPart_000_01BE1264.A6C4D6A0--