Browse Source

+ added some special code for C interface
to avoid loading of crt1.o or dpmiexcp.o from the libc.a

pierre 27 years ago
parent
commit
c6ab5b1702
3 changed files with 89 additions and 15 deletions
  1. 43 6
      rtl/dos/go32v2/dpmiexcp.pp
  2. 12 1
      rtl/dos/go32v2/system.pp
  3. 34 8
      rtl/dos/go32v2/v2prt0.as

+ 43 - 6
rtl/dos/go32v2/dpmiexcp.pp

@@ -16,6 +16,11 @@
 Unit DPMIExcp;
 Unit DPMIExcp;
 
 
 {$define UseRMcbrk}
 {$define UseRMcbrk}
+{ If linking to C code we must avoid loading of the dpmiexcp.o
+  in libc.a from the equivalent C code
+  => all global functions from dpmiexcp.c must be aliased PM
+
+    Problem this is only valid for DJGPP v2.01 }
 
 
 interface
 interface
 
 
@@ -293,6 +298,12 @@ begin
   signal:=temp;
   signal:=temp;
 end;
 end;
 
 
+{ C counter part }
+function c_signal(sig : longint;func : SignalHandler) : SignalHandler;
+            cdecl;[public,alias : '_signal'];
+  begin
+     c_signal:=signal(sig,func);
+  end;
 
 
 const signames : array [0..14] of string[4] = (
 const signames : array [0..14] of string[4] = (
    'ABRT','FPE ','ILL ','SEGV','TERM','ALRM','HUP ',
    'ABRT','FPE ','ILL ','SEGV','TERM','ALRM','HUP ',
@@ -337,6 +348,13 @@ traceback_exit:
   exit(0);
   exit(0);
 end;
 end;
 
 
+function c_raise(sig : longint) : longint;
+           cdecl;[public,alias : '_raise'];
+  begin
+     c_raise:=_raise(sig);
+  end;
+  
+
 {****************************************************************************
 {****************************************************************************
                                  Exceptions
                                  Exceptions
 ****************************************************************************}
 ****************************************************************************}
@@ -612,7 +630,7 @@ asm
 end;
 end;
 end;
 end;
 
 
-procedure djgpp_exception_toggle;
+procedure djgpp_exception_toggle;[alias : '___djgpp_exception_toggle'];
 var
 var
   _except : tseginfo;
   _except : tseginfo;
   i : longint;
   i : longint;
@@ -706,7 +724,7 @@ begin
 end;
 end;
 
 
 
 
-procedure dpmiexcp_exit{(status : longint)};[alias : 'excep_exit'];
+procedure dpmiexcp_exit{(status : longint)};[public,alias : 'excep_exit'];
 { We need to restore hardware interrupt handlers even if somebody calls
 { We need to restore hardware interrupt handlers even if somebody calls
   `_exit' directly, or else we crash the machine in nested programs.
   `_exit' directly, or else we crash the machine in nested programs.
   We only toggle the handlers if the original keyboard handler is intact
   We only toggle the handlers if the original keyboard handler is intact
@@ -724,23 +742,25 @@ begin
   dpmi_set_coprocessor_emulation(1);
   dpmi_set_coprocessor_emulation(1);
 end;
 end;
 
 
+{ _exit in dpmiexcp.c
+  is already present in v2prt0.as  PM}
 
 
 { used by dos.pp for swap vectors }
 { used by dos.pp for swap vectors }
-procedure dpmi_swap_in;[alias : 'swap_in'];
+procedure dpmi_swap_in;[public,alias : 'swap_in'];
 begin
 begin
   if not (exceptions_on) then
   if not (exceptions_on) then
    djgpp_exception_toggle;
    djgpp_exception_toggle;
 end;
 end;
 
 
 
 
-procedure dpmi_swap_out;[alias : 'swap_out'];
+procedure dpmi_swap_out;[public,alias : 'swap_out'];
 begin
 begin
   if (exceptions_on) then
   if (exceptions_on) then
    djgpp_exception_toggle;
    djgpp_exception_toggle;
 end;
 end;
 
 
 
 
-procedure djgpp_exception_setup;
+procedure djgpp_exception_setup;[alias : '___djgpp_exception_setup'];
 var
 var
   temp_kbd,
   temp_kbd,
   temp_npx    : pointer;
   temp_npx    : pointer;
@@ -872,7 +892,20 @@ begin
   djgpp_set_ctrl_c:=oldenable;
   djgpp_set_ctrl_c:=oldenable;
 end;
 end;
 
 
+function c_djgpp_set_ctrl_c(enable : longint) : boolean;
+            cdecl;[public,alias : '___djgpp_set_ctrl_c'];
 
 
+  var
+     e : boolean;
+     
+  begin
+     asm
+        movl enable,%eax
+        movb %al,e
+     end;
+     c_djgpp_set_ctrl_c:=djgpp_set_ctrl_c(e);
+  end;
+  
 procedure InitDPMIExcp;
 procedure InitDPMIExcp;
 var
 var
   tempendtext,
   tempendtext,
@@ -897,7 +930,11 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.7  1998-08-15 17:01:13  peter
+  Revision 1.8  1998-08-19 10:56:33  pierre
+    + added some special code for C interface
+      to avoid loading of crt1.o or dpmiexcp.o from the libc.a
+
+  Revision 1.7  1998/08/15 17:01:13  peter
     * smartlinking the units works now
     * smartlinking the units works now
     * setjmp/longjmp -> dmpi_setjmp/dpmi_longjmp to solve systemunit
     * setjmp/longjmp -> dmpi_setjmp/dpmi_longjmp to solve systemunit
       conflict
       conflict

+ 12 - 1
rtl/dos/go32v2/system.pp

@@ -485,6 +485,13 @@ begin
   getmem(dos_argv0,strlen(cp)+1);
   getmem(dos_argv0,strlen(cp)+1);
   if (dos_argv0 = nil) then halt;
   if (dos_argv0 = nil) then halt;
   strcopy(dos_argv0, cp);
   strcopy(dos_argv0, cp);
+  { update ___dos_argv0 also }
+{$ASMMODE DIRECT}
+  asm
+     movl U_SYSTEM_DOS_ARGV0,%eax
+     movl %eax,___dos_argv0
+  end;
+{$ASMMODE ATT}
 end;
 end;
 
 
      procedure syscopytodos(addr : longint; len : longint);
      procedure syscopytodos(addr : longint; len : longint);
@@ -1057,7 +1064,11 @@ Begin
 End.
 End.
 {
 {
   $Log$
   $Log$
-  Revision 1.14  1998-08-04 14:34:38  pierre
+  Revision 1.15  1998-08-19 10:56:34  pierre
+    + added some special code for C interface
+      to avoid loading of crt1.o or dpmiexcp.o from the libc.a
+
+  Revision 1.14  1998/08/04 14:34:38  pierre
     * small bug fix to get it compiled with bugfix version !!
     * small bug fix to get it compiled with bugfix version !!
       (again the asmmode problem !!!
       (again the asmmode problem !!!
       Peter it was really not the best idea you had !!)
       Peter it was really not the best idea you had !!)

+ 34 - 8
rtl/dos/go32v2/v2prt0.as

@@ -345,6 +345,9 @@ no_memory:
         .global ___exit
         .global ___exit
         .align  2
         .align  2
 ___exit:
 ___exit:
+/* special exit from dpmiexcp.c */
+        .global __exit
+__exit:
         movb    4(%esp), %al
         movb    4(%esp), %al
 exit:
 exit:
         movb    %al, %cl
         movb    %al, %cl
@@ -669,7 +672,8 @@ additions made by Pierre Muller*/
         .comm   ___dpmi_error,2
         .comm   ___dpmi_error,2
 
 
 /* from dpmi0000.s */
 /* from dpmi0000.s */
-        .globl ___dpmi_allocate_ldt_descriptors
+/*        .globl ___dpmi_allocate_ldt_descriptors */
+/* using pascal convention => not usabel by C code */
 ___dpmi_allocate_ldt_descriptors:
 ___dpmi_allocate_ldt_descriptors:
    pushl %ebp; movl %esp,%ebp
    pushl %ebp; movl %esp,%ebp
 
 
@@ -688,7 +692,7 @@ ___dpmi_allocate_ldt_descriptors:
         ret $4
         ret $4
 
 
 /* from file dpmi0008.s */
 /* from file dpmi0008.s */
-        .globl ___dpmi_set_segment_limit
+/*        .globl ___dpmi_set_segment_limit */
 ___dpmi_set_segment_limit:
 ___dpmi_set_segment_limit:
    pushl %ebp; movl %esp,%ebp
    pushl %ebp; movl %esp,%ebp
 
 
@@ -709,7 +713,7 @@ ___dpmi_set_segment_limit:
         popl %ebp
         popl %ebp
         ret $8
         ret $8
 
 
-        .globl ___dpmi_get_version
+/*        .globl ___dpmi_get_version */
 ___dpmi_get_version:
 ___dpmi_get_version:
    pushl %ebp; movl %esp,%ebp
    pushl %ebp; movl %esp,%ebp
 
 
@@ -735,7 +739,7 @@ ___dpmi_get_version:
         popl %ebp
         popl %ebp
         ret $4
         ret $4
 
 
-        .globl ___dpmi_get_segment_base_address
+/*         .globl ___dpmi_get_segment_base_address*/
 ___dpmi_get_segment_base_address:
 ___dpmi_get_segment_base_address:
    pushl %ebp; movl %esp,%ebp
    pushl %ebp; movl %esp,%ebp
 
 
@@ -859,19 +863,32 @@ _setup_go32_info_block:
         movzbw -7(%ebp),%ax
         movzbw -7(%ebp),%ax
         orw %ax,%dx
         orw %ax,%dx
         movw %dx,U_SYSTEM_GO32_INFO_BLOCK+38
         movw %dx,U_SYSTEM_GO32_INFO_BLOCK+38
+        call copy_to_c_go32_info_block
         leave
         leave
         ret
         ret
-.globl ___PROXY
+        
+copy_to_c_go32_info_block:
+        leal U_SYSTEM_GO32_INFO_BLOCK,%esi
+        leal __go32_info_block,%edi
+        movl $10,%ecx
+        rep
+        movsl
+        ret
 .data
 .data
+/* __go32_info_block for C programs */
+        .align 2
+        .globl __go32_info_block
+.comm   __go32_info_block,40
+        .globl ___PROXY
 ___PROXY:
 ___PROXY:
         .ascii " !proxy\0"
         .ascii " !proxy\0"
-.globl ___PROXY_LEN
+        .globl ___PROXY_LEN
         .align 2
         .align 2
 ___PROXY_LEN:
 ___PROXY_LEN:
         .long 7
         .long 7
 .text
 .text
         .align 2
         .align 2
-.globl ___prt1_startup
+        .globl ___prt1_startup
 ___prt1_startup:
 ___prt1_startup:
         pushl %ebp
         pushl %ebp
         movl %esp,%ebp
         movl %esp,%ebp
@@ -914,6 +931,7 @@ ___prt1_startup:
    call exit
    call exit
         .align 2,0x90
         .align 2,0x90
 /* .comm U_SYSTEM_DOS_ARGV0,4 */
 /* .comm U_SYSTEM_DOS_ARGV0,4 */
+.comm ___dos_argv0,4
 .comm ___crt0_argc,4
 .comm ___crt0_argc,4
 .comm ___crt0_argv,4
 .comm ___crt0_argv,4
         .globl ___environ_changed
         .globl ___environ_changed
@@ -1109,6 +1127,7 @@ _pascal_start:
         movl    %esp,%ebx
         movl    %esp,%ebx
         movl    12(%ebx),%eax
         movl    12(%ebx),%eax
         movl    %eax,U_SYSTEM_ENVP
         movl    %eax,U_SYSTEM_ENVP
+        movl    %eax,_environ
         movl    8(%ebx),%eax
         movl    8(%ebx),%eax
         movl    %eax,_args
         movl    %eax,_args
         movl    4(%ebx),%eax
         movl    4(%ebx),%eax
@@ -1140,6 +1159,9 @@ _run_mode:
         .globl  _core_selector
         .globl  _core_selector
 _core_selector:
 _core_selector:
         .word   0
         .word   0
+        .globl  _environ
+_environ:
+         .long 0
 
 
 /* Here Pierre Muller added all what was in crt1.c  */
 /* Here Pierre Muller added all what was in crt1.c  */
 /* in assembler                                     */
 /* in assembler                                     */
@@ -1171,7 +1193,11 @@ __dos_ds:
 
 
 /*
 /*
   $Log$
   $Log$
-  Revision 1.2  1998-05-22 00:39:38  peter
+  Revision 1.3  1998-08-19 10:56:35  pierre
+    + added some special code for C interface
+      to avoid loading of crt1.o or dpmiexcp.o from the libc.a
+
+  Revision 1.2  1998/05/22 00:39:38  peter
     * go32v1, go32v2 recompiles with the new objects
     * go32v1, go32v2 recompiles with the new objects
     * remake3 works again with go32v2
     * remake3 works again with go32v2
     - removed some "optimizes" from daniel which were wrong
     - removed some "optimizes" from daniel which were wrong