[PATCH] Separation C and assembly functions to different files

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

-Files arch/i86/kernel/bios16.c and arch/i86/kernel/printreg.c
 are now only assembly.
-File arch/i86/lib/memmove.c is now only C.
-Files arch/i86/drivers/char/bell.c and arch/i86/kernel/system.c
 now have conditional compilation to select the appropiate inline
 assembly style.
-Small fixes in other files.

The kernel was compiled with BCC and tested with QEMU.
Code size reduced in 112 bytes and data size reduced in 4 bytes.

Juan
diff -Nur elks.orig/arch/i86/drivers/block/doshd.c elks/arch/i86/drivers/block/doshd.c
--- elks.orig/arch/i86/drivers/block/doshd.c	2015-06-11 13:27:21.000000000 -0500
+++ elks/arch/i86/drivers/block/doshd.c	2015-06-11 13:35:38.000000000 -0500
@@ -70,6 +70,21 @@
 static int revalidate_hddisk(int, int);
 #endif
 
+static struct biosparms bdt;
+
+/* Useful defines for accessing the above structure. */
+
+#define CARRY_SET (bdt.fl & 0x1)
+#define BD_IRQ bdt.irq
+#define BD_AX bdt.ax
+#define BD_BX bdt.bx
+#define BD_CX bdt.cx
+#define BD_DX bdt.dx
+#define BD_SI bdt.si
+#define BD_DI bdt.di
+#define BD_ES bdt.es
+#define BD_FL bdt.fl
+
 static struct drive_infot {
     int cylinders;
     int sectors;
@@ -146,7 +161,7 @@
 	BD_AX = BIOSHD_DRIVE_PARMS;
 	BD_DX = drive + 0x80;
 	BD_IRQ = BIOSHD_INT;
-	call_bios();
+	call_bios(&bdt);
 	if (!CARRY_SET) {
 	    drivep->cylinders = ((BD_CX >> 8) | ((BD_CX & 0xC0) << 2)) + 1;
 	    drivep->heads = (BD_DX >> 8) + 1;
@@ -216,7 +231,7 @@
     BD_AX = BIOSHD_DRIVE_PARMS;
     BD_DX = 0;			/* only the number of floppies */
     BD_IRQ = BIOSHD_INT;
-    call_bios();
+    call_bios(&bdt);
     ndrives = (CARRY_SET) ? 0 : BD_DX & 0xff;
 
 #else
@@ -233,7 +248,7 @@
 
 #ifdef CONFIG_HW_USE_INT13_FOR_FLOPPY
 
-	call_bios();
+	call_bios(&bdt);
 	if ((!CARRY_SET) && ((BD_AX & 0xff00) == 0))
 	    drive_info[drive + 2] = fd_types[BD_BX - 1];
 	else
@@ -241,7 +256,7 @@
 
 #else
 
-	if ((arch_cpu > 1) && (call_bios(), (!CARRY_SET)) && (BD_AX != 0x100)) {
+	if ((arch_cpu > 1) && (call_bios(&bdt), (!CARRY_SET)) && (BD_AX != 0x100)) {
 
 /* Some XT's return strange results - Al
  * The arch_cpu is a safety check
@@ -292,7 +307,7 @@
     BD_IRQ = BIOSHD_INT;
     BD_AX = BIOSHD_RESET;
     BD_DX = hd_drive_map[DEVICE_NR(minor)];
-    call_bios();
+    call_bios(&bdt);
 
 /* Dont log this fail - its fine
  */
@@ -326,7 +341,7 @@
 	BD_FL = 0;
 
 	set_irq();
-	call_bios();
+	call_bios(&bdt);
 	if (CARRY_SET) {
 	    if (((BD_AX >> 8) == 0x04) && (count == MAX_ERRS - 1))
 		break;		/* Sector not found */
@@ -438,7 +453,7 @@
 	BD_IRQ = BIOSHD_INT;
 	BD_AX = BIOSHD_DRIVE_PARMS;
 	BD_DX = hd_drive_map[target];	/* Head 0, drive number */
-	call_bios();
+	call_bios(&bdt);
 	if (!CARRY_SET) {
 	    drivep->sectors = (BD_CX & 0x3f);
 	    drivep->cylinders = ((BD_CX >> 8) | ((BD_CX & 0xC0) << 2)) + 1;
@@ -728,7 +743,7 @@
 		   cylinder, head, sector, drive, req->rq_cmd);
 	    debug1("blocks %d\n", this_pass);
 	    set_irq();
-	    call_bios();
+	    call_bios(&bdt);
 	    if (CARRY_SET) {
 		reset_bioshd(MINOR(req->rq_dev));
 		dma_avail = 1;
diff -Nur elks.orig/arch/i86/drivers/char/bell.c elks/arch/i86/drivers/char/bell.c
--- elks.orig/arch/i86/drivers/char/bell.c	2015-06-11 13:27:37.000000000 -0500
+++ elks/arch/i86/drivers/char/bell.c	2015-06-11 13:35:38.000000000 -0500
@@ -10,8 +10,8 @@
 
 #define BELL_FREQUENCY 800
 #define BELL_PERIOD (1193181/BELL_FREQUENCY)
-#define BELL_PERIOD_L (BELL_PERIOD & 0xFF)
-#define BELL_PERIOD_H (BELL_PERIOD / 256)
+#define BELL_PERIOD_L (unsigned char)(BELL_PERIOD & 0xFF)
+#define BELL_PERIOD_H (unsigned char)(BELL_PERIOD / 256)
 #define SPEAKER_PORT (0x61)
 #define TIMER2_PORT (0x42)
 #define TIMER_CONTROL_PORT (0x43)
@@ -21,6 +21,7 @@
  */
 static void sound(void)
 {
+#ifdef __BCC__
     asm(\
 	"\tin	al,0x61\n" \
 	"\tor	al,#3\n" \
@@ -32,6 +33,13 @@
 	"\tmov	al,#0x05\n" \
 	"\tout	0x42,al\n" \
 	);
+#endif
+#ifdef __ia16__
+    outb(inb(SPEAKER_PORT) | 0x03, SPEAKER_PORT);
+    outb(0xB6, TIMER_CONTROL_PORT);
+    outb(BELL_PERIOD_L, TIMER2_PORT);
+    outb(BELL_PERIOD_H, TIMER2_PORT);
+#endif
 }
 
 /*
@@ -39,11 +47,16 @@
  */
 static void nosound(void)
 {
+#ifdef __BCC__
     asm(\
 	"\tin	al,0x61\n" \
 	"\tand	al,#0xFC\n" \
 	"\tout	0x61,al\n" \
 	);
+#endif
+#ifdef __ia16__
+    outb(inb(SPEAKER_PORT) & ~0x03, SPEAKER_PORT);
+#endif
 }
 
 /*
diff -Nur elks.orig/arch/i86/kernel/asm-offsets.c elks/arch/i86/kernel/asm-offsets.c
--- elks.orig/arch/i86/kernel/asm-offsets.c	2015-06-11 13:27:37.000000000 -0500
+++ elks/arch/i86/kernel/asm-offsets.c	2015-06-11 13:41:22.000000000 -0500
@@ -12,7 +12,7 @@
 #endif
 #endif
 
-extern int TASK_KRNL_SP, TASK_USER_SP, TASK_USER_SS;
+extern int TASK_KRNL_SP, TASK_USER_SP, TASK_USER_SS, TASK_USER_DS;
 extern int TASK_KSTKTOP, TASK_KSTKT_SI;
 
 void asm_offsets(void)
@@ -20,6 +20,7 @@
     TASK_KRNL_SP = offsetof(struct task_struct, t_regs.ksp);
     TASK_USER_SP = offsetof(struct task_struct, t_regs.sp);
     TASK_USER_SS = offsetof(struct task_struct, t_regs.ss);
+    TASK_USER_DS = offsetof(struct task_struct, t_regs.ds);
     TASK_KSTKTOP = offsetof(struct task_struct, t_kstack) + KSTACK_BYTES;
     TASK_KSTKT_SI = offsetof(struct task_struct, t_kstack) + KSTACK_BYTES - 2;
 }
diff -Nur elks.orig/arch/i86/kernel/bios16.c elks/arch/i86/kernel/bios16.c
--- elks.orig/arch/i86/kernel/bios16.c	2015-06-11 13:27:21.000000000 -0500
+++ elks/arch/i86/kernel/bios16.c	2015-06-11 13:35:38.000000000 -0500
@@ -8,16 +8,6 @@
  */
 
 #include <linuxmt/config.h>
-#include <linuxmt/types.h>
-#include <linuxmt/biosparm.h>
-
-static struct biosparms bdt;
-
-/*
- *	The external interface is a pointer..
- */
-
-struct biosparms *bios_data_table=&bdt;
 
 /*
  *	Quick drop into assembler for this one.
@@ -37,24 +27,25 @@
 #ifdef CONFIG_ROMCODE
  #define stashed_ds	[0]
 #else 
-    .extern    stashed_ds
+	.extern stashed_ds
 #endif	
 	
 	.globl  _call_bios
 
 _call_bios:
-	pushf			
+	push bp
+	mov  bp,sp
 
 ! Things we want to save - direction flag BP ES
 
-	push bp		
-	push es	
+	pushf
+	push es
 	push si
 	push di
 
 ! DS already saved in stashed_ds
 
-	mov bx, #_bdt
+	mov bx,4[bp]
 
 !	Load the register block from the table	
 
@@ -84,9 +75,9 @@
 
 !	Make some breathing room
 
- 	pushf
- 	push bx
+	pushf
 	push ds
+	push bx
 
 !	Stack is now returned FL, BX, DS
 
@@ -102,10 +93,11 @@
 
 ! ***** We can now use the bios data table again *****
 
-	mov bx, #_bdt
+	mov bx,sp
+	seg ss
+	mov bx,18[bx]
 
- 	pop 18[bx]         ! Save the old DS
- 	mov 2[bx],ax       ! Save the old AX
+	mov 2[bx],ax       ! Save the old AX
 	pop 4[bx]          ! Save the old BX
 	mov 6[bx], cx
 	mov 8[bx], dx
@@ -113,6 +105,7 @@
 	mov 12[bx], di
 	mov 14[bx], bp
 	mov 16[bx], es
+	pop 18[bx]         ! Save the old DS
 	pop 20[bx]         ! Pop the returned flags off
 
 !	Restore things we must save
@@ -120,8 +113,8 @@
 	pop di
 	pop si
 	pop es
-	pop bp
 	popf
+	pop bp
 	ret
 
 #endasm
diff -Nur elks.orig/arch/i86/kernel/mkentry.sh elks/arch/i86/kernel/mkentry.sh
--- elks.orig/arch/i86/kernel/mkentry.sh	2015-06-11 13:27:37.000000000 -0500
+++ elks/arch/i86/kernel/mkentry.sh	2015-06-11 13:35:38.000000000 -0500
@@ -70,7 +70,7 @@
 
       if( depends_on[callno] != "" )
       {
-         if( callno < maxstd )
+         if( callno < maxno )
          {
             str = "\t.word _no_syscall";
             printf "#else\n%-25s ! %3d - %s\n", str, callno, assigned_to[callno]
diff -Nur elks.orig/arch/i86/kernel/printreg.c elks/arch/i86/kernel/printreg.c
--- elks.orig/arch/i86/kernel/printreg.c	2015-06-11 13:27:37.000000000 -0500
+++ elks/arch/i86/kernel/printreg.c	2015-06-11 13:35:38.000000000 -0500
@@ -1,21 +1,16 @@
 #include <linuxmt/config.h>
-#include <linuxmt/kernel.h>
-#include <linuxmt/types.h>
 
 /* This file contains print_regs, which will dump out all of the registers
  * and print them out.  This is probably one of the sickest routines ever
  * written :) - Chad
  */
 
-void print_regs2(__u16 ax,__u16 bx,__u16 cx,__u16 dx,__u16 di,__u16 si,
-		 __u16 cs,__u16 ds,__u16 es,__u16 ss,__u16 bp)
-{
-    printk("AX=%x BX=%x CX=%x DX=%x DI=%x SI=%x\n", ax, bx, cx, dx, di, si);
-    printk("CS=%x DS=%x ES=%x SS=%x BP=%x\n", cs, ds, es, ss, bp);
-}
+/*void print_regs(void);*/
+/*void printsp(void);*/
 
 #ifndef S_SPLINT_S
 #asm
+	.extern	_printk
 	.globl _print_regs
 
 _print_regs:
@@ -30,7 +25,9 @@
 	push cx
 	push bx
 	push ax
-	call _print_regs2
+	push #fmtprg
+	call _printk
+	pop ax
 	pop ax
 	pop bx
 	pop cx
@@ -59,6 +56,8 @@
 	.data
 msg:	.ascii	"SP=%x:%x\n"
 	.byte	0
+fmtprg:	.ascii	"AX=%x BX=%x CX=%x DX=%x DI=%x SI=%x\nCS=%x DS=%x ES=%x SS=%x BP=%x\n"
+	.byte	0
 
 #endasm
 #endif
diff -Nur elks.orig/arch/i86/kernel/system.c elks/arch/i86/kernel/system.c
--- elks.orig/arch/i86/kernel/system.c	2015-06-11 13:27:37.000000000 -0500
+++ elks/arch/i86/kernel/system.c	2015-06-11 13:35:38.000000000 -0500
@@ -57,16 +57,21 @@
 
 /* Stubs for functions needed elsewhere */
 
-#ifndef S_SPLINT_S
-#asm
-	export _hard_reset_now
-
-_hard_reset_now:
-
-	mov ax,#0x40		! No memory check on reboot
-	mov ds, ax
-	mov [0x72],#0x1234
-	jmp #0xffff:0
-
-#endasm
+void hard_reset_now(void)
+{
+#ifdef __BCC__
+    asm(\
+	"\tmov ax,#0x40\n" \
+	"\tmov ds, ax\n" \
+	"\tmov [0x72],#0x1234\n" \
+	"\tjmp #0xffff:0\n" \
+	);
+#endif
+#ifdef __ia16__
+    asm("movw $64,%ax\n\t"
+	"movw %ax,%ds\n\t"
+	"movw $4660,114\n\t"
+	"jmp 65535:0\n\t"
+	);
 #endif
+}
diff -Nur elks.orig/arch/i86/lib/fmemset.s elks/arch/i86/lib/fmemset.s
--- elks.orig/arch/i86/lib/fmemset.s	2015-04-26 11:39:15.000000000 -0500
+++ elks/arch/i86/lib/fmemset.s	2015-06-11 13:35:38.000000000 -0500
@@ -27,3 +27,32 @@
 	pop	es
 	pop	bp
 	ret
+
+!
+! blt_forth( soff, sseg, doff, dseg, bytes )
+! for to > from
+!
+	.globl _blt_forth
+
+_blt_forth:
+	push	bp
+	mov	bp, sp
+	push	es
+	push	ds
+	push	si
+	push	di
+	pushf
+	lds	si, [bp+4]
+	les	di, [bp+8]
+	mov	cx, [bp+12]
+	std
+	rep
+	movsb
+	popf
+	pop	di
+	pop	si
+	pop	ds
+	pop	es
+	pop	bp
+	ret
+
diff -Nur elks.orig/arch/i86/lib/memmove.c elks/arch/i86/lib/memmove.c
--- elks.orig/arch/i86/lib/memmove.c	2015-04-26 11:39:15.000000000 -0500
+++ elks/arch/i86/lib/memmove.c	2015-06-11 13:35:38.000000000 -0500
@@ -7,7 +7,7 @@
 
 #include <linuxmt/mm.h>
 
-static void blt_forth(unsigned,unsigned,unsigned,unsigned,unsigned);
+void blt_forth(unsigned,unsigned,unsigned,unsigned,unsigned);
 
 void far_memmove(unsigned sseg, unsigned soff, unsigned dseg, unsigned doff,
 		 unsigned bytes)
@@ -27,34 +27,3 @@
     }
 }
 
-#ifndef S_SPLINT_S
-#asm
-	.text
-				! blt_forth( soff, sseg, doff, dseg, bytes )
-				! for to > from
-	.even
-
-_blt_forth:
-	push	bp
-	mov	bp, sp
-	push	es
-	push	ds
-	push	si
-	push	di
-	pushf
-	lds	si, [bp+4]
-	les	di, [bp+8]
-	mov	cx, [bp+12]
-	std
-	rep
-	movsb
-	popf
-	pop	di
-	pop	si
-	pop	ds
-	pop	es
-	pop	bp
-	ret
-
-#endasm
-#endif
diff -Nur elks.orig/include/linuxmt/biosparm.h elks/include/linuxmt/biosparm.h
--- elks.orig/include/linuxmt/biosparm.h	2015-04-26 11:39:15.000000000 -0500
+++ elks/include/linuxmt/biosparm.h	2015-06-11 13:35:38.000000000 -0500
@@ -43,25 +43,7 @@
     unsigned short fl;		/* 20 */
 };
 
-/* Useful defines for accessing the above structure. */
-
-#define CARRY_SET (bios_data_table->fl & 0x1)
-#define SEGMENT(addr) (((unsigned long)addr) >> 4)
-#define OFFSET(addr) (((unsigned long)addr) & 0xf)
-#define BD_IRQ bios_data_table->irq
-#define BD_AX bios_data_table->ax
-#define BD_BX bios_data_table->bx
-#define BD_CX bios_data_table->cx
-#define BD_DX bios_data_table->dx
-#define BD_SI bios_data_table->si
-#define BD_DI bios_data_table->di
-#define BD_ES bios_data_table->es
-#define BD_FL bios_data_table->fl
-
 /* exported functions */
-extern void call_bios(void);
-
-/* Some globals that we need */
-extern struct biosparms *bios_data_table;
+extern void call_bios(struct biosparms *);
 
 #endif
diff -Nur elks.orig/kernel/time.c elks/kernel/time.c
--- elks.orig/kernel/time.c	2015-04-26 11:39:15.000000000 -0500
+++ elks/kernel/time.c	2015-06-11 13:35:38.000000000 -0500
@@ -26,7 +26,7 @@
 
 #include <arch/types.h>
 #include <linuxmt/time.h>
-#include <linuxmt/timex.h>
+#include <linuxmt/sched.h>
 #include <linuxmt/errno.h>
 #include <linuxmt/mm.h>
 
@@ -34,7 +34,6 @@
 #include <arch/system.h>
 #include <arch/segment.h>
 
-#include <linuxmt/sched.h>
 
 /* this is the structure holding the base time (in UTC, of course) */
 struct timeval xtime;

[Index of Archives]     [Kernel]     [Linux ia64]     [DCCP]     [Linux for ARM]     [Yosemite News]     [Linux SCSI]     [Linux Hams]

  Powered by Linux