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;
 
 {$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
 
@@ -293,6 +298,12 @@ begin
   signal:=temp;
 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] = (
    'ABRT','FPE ','ILL ','SEGV','TERM','ALRM','HUP ',
@@ -337,6 +348,13 @@ traceback_exit:
   exit(0);
 end;
 
+function c_raise(sig : longint) : longint;
+           cdecl;[public,alias : '_raise'];
+  begin
+     c_raise:=_raise(sig);
+  end;
+  
+
 {****************************************************************************
                                  Exceptions
 ****************************************************************************}
@@ -612,7 +630,7 @@ asm
 end;
 end;
 
-procedure djgpp_exception_toggle;
+procedure djgpp_exception_toggle;[alias : '___djgpp_exception_toggle'];
 var
   _except : tseginfo;
   i : longint;
@@ -706,7 +724,7 @@ begin
 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
   `_exit' directly, or else we crash the machine in nested programs.
   We only toggle the handlers if the original keyboard handler is intact
@@ -724,23 +742,25 @@ begin
   dpmi_set_coprocessor_emulation(1);
 end;
 
+{ _exit in dpmiexcp.c
+  is already present in v2prt0.as  PM}
 
 { used by dos.pp for swap vectors }
-procedure dpmi_swap_in;[alias : 'swap_in'];
+procedure dpmi_swap_in;[public,alias : 'swap_in'];
 begin
   if not (exceptions_on) then
    djgpp_exception_toggle;
 end;
 
 
-procedure dpmi_swap_out;[alias : 'swap_out'];
+procedure dpmi_swap_out;[public,alias : 'swap_out'];
 begin
   if (exceptions_on) then
    djgpp_exception_toggle;
 end;
 
 
-procedure djgpp_exception_setup;
+procedure djgpp_exception_setup;[alias : '___djgpp_exception_setup'];
 var
   temp_kbd,
   temp_npx    : pointer;
@@ -872,7 +892,20 @@ begin
   djgpp_set_ctrl_c:=oldenable;
 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;
 var
   tempendtext,
@@ -897,7 +930,11 @@ begin
 end.
 {
   $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
     * setjmp/longjmp -> dmpi_setjmp/dpmi_longjmp to solve systemunit
       conflict

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

@@ -485,6 +485,13 @@ begin
   getmem(dos_argv0,strlen(cp)+1);
   if (dos_argv0 = nil) then halt;
   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;
 
      procedure syscopytodos(addr : longint; len : longint);
@@ -1057,7 +1064,11 @@ Begin
 End.
 {
   $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 !!
       (again the asmmode problem !!!
       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
         .align  2
 ___exit:
+/* special exit from dpmiexcp.c */
+        .global __exit
+__exit:
         movb    4(%esp), %al
 exit:
         movb    %al, %cl
@@ -669,7 +672,8 @@ additions made by Pierre Muller*/
         .comm   ___dpmi_error,2
 
 /* 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:
    pushl %ebp; movl %esp,%ebp
 
@@ -688,7 +692,7 @@ ___dpmi_allocate_ldt_descriptors:
         ret $4
 
 /* from file dpmi0008.s */
-        .globl ___dpmi_set_segment_limit
+/*        .globl ___dpmi_set_segment_limit */
 ___dpmi_set_segment_limit:
    pushl %ebp; movl %esp,%ebp
 
@@ -709,7 +713,7 @@ ___dpmi_set_segment_limit:
         popl %ebp
         ret $8
 
-        .globl ___dpmi_get_version
+/*        .globl ___dpmi_get_version */
 ___dpmi_get_version:
    pushl %ebp; movl %esp,%ebp
 
@@ -735,7 +739,7 @@ ___dpmi_get_version:
         popl %ebp
         ret $4
 
-        .globl ___dpmi_get_segment_base_address
+/*         .globl ___dpmi_get_segment_base_address*/
 ___dpmi_get_segment_base_address:
    pushl %ebp; movl %esp,%ebp
 
@@ -859,19 +863,32 @@ _setup_go32_info_block:
         movzbw -7(%ebp),%ax
         orw %ax,%dx
         movw %dx,U_SYSTEM_GO32_INFO_BLOCK+38
+        call copy_to_c_go32_info_block
         leave
         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
+/* __go32_info_block for C programs */
+        .align 2
+        .globl __go32_info_block
+.comm   __go32_info_block,40
+        .globl ___PROXY
 ___PROXY:
         .ascii " !proxy\0"
-.globl ___PROXY_LEN
+        .globl ___PROXY_LEN
         .align 2
 ___PROXY_LEN:
         .long 7
 .text
         .align 2
-.globl ___prt1_startup
+        .globl ___prt1_startup
 ___prt1_startup:
         pushl %ebp
         movl %esp,%ebp
@@ -914,6 +931,7 @@ ___prt1_startup:
    call exit
         .align 2,0x90
 /* .comm U_SYSTEM_DOS_ARGV0,4 */
+.comm ___dos_argv0,4
 .comm ___crt0_argc,4
 .comm ___crt0_argv,4
         .globl ___environ_changed
@@ -1109,6 +1127,7 @@ _pascal_start:
         movl    %esp,%ebx
         movl    12(%ebx),%eax
         movl    %eax,U_SYSTEM_ENVP
+        movl    %eax,_environ
         movl    8(%ebx),%eax
         movl    %eax,_args
         movl    4(%ebx),%eax
@@ -1140,6 +1159,9 @@ _run_mode:
         .globl  _core_selector
 _core_selector:
         .word   0
+        .globl  _environ
+_environ:
+         .long 0
 
 /* Here Pierre Muller added all what was in crt1.c  */
 /* in assembler                                     */
@@ -1171,7 +1193,11 @@ __dos_ds:
 
 /*
   $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
     * remake3 works again with go32v2
     - removed some "optimizes" from daniel which were wrong