linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* include/asm-i386/checksum.h
@ 2001-07-03  6:50 Erik Meusel
  2001-07-03  7:41 ` include/asm-i386/checksum.h Keith Owens
  0 siblings, 1 reply; 8+ messages in thread
From: Erik Meusel @ 2001-07-03  6:50 UTC (permalink / raw)
  To: linux-kernel

[-- Attachment #1: Type: TEXT/PLAIN, Size: 533 bytes --]

Hi,

compiling the new 2.4.5 kernel with GCC 3.0 came with several errors and
warnings. One of the most ugly warnings was:

include/asm/checksum.h: warning: multi-line string literals are deprecated

The diff to version 2.4.5 of it is attached.

Regards,
Erik Meusel

P.S.: would it be possible to patch the menuconfig in that way, that it
does look in the whole include-path for the <ncurses.h> and relating
files? they aren't in /usr/include/ in my system and I'm tired of patching
linux/scripts/lxdialog/Makefile all the time. :)

[-- Attachment #2: Type: TEXT/PLAIN, Size: 1657 bytes --]

--- include/asm-i386/checksum.h	Tue Feb  1 08:41:14 2000
+++ /scratch/backup/src/linux/include/asm/checksum.h	Tue Jul  3 08:35:27 2001
@@ -72,18 +72,18 @@
-	__asm__ __volatile__("
-	    movl (%1), %0
-	    subl $4, %2
-	    jbe 2f
-	    addl 4(%1), %0
-	    adcl 8(%1), %0
-	    adcl 12(%1), %0
-1:	    adcl 16(%1), %0
-	    lea 4(%1), %1
-	    decl %2
-	    jne	1b
-	    adcl $0, %0
-	    movl %0, %2
-	    shrl $16, %0
-	    addw %w2, %w0
-	    adcl $0, %0
-	    notl %0
-2:
+	__asm__ __volatile__("\
+	    movl (%1), %0 \
+	    subl $4, %2 \
+	    jbe 2f \
+	    addl 4(%1), %0 \
+	    adcl 8(%1), %0 \
+	    adcl 12(%1), %0 \
+1:	    adcl 16(%1), %0 \
+	    lea 4(%1), %1 \
+	    decl %2 \
+	    jne	1b \
+	    adcl $0, %0 \
+	    movl %0, %2 \
+	    shrl $16, %0 \
+	    addw %w2, %w0 \
+	    adcl $0, %0 \
+	    notl %0 \
+2: \
@@ -105,3 +105,3 @@
-	__asm__("
-		addl %1, %0
-		adcl $0xffff, %0
+	__asm__("\
+		addl %1, %0 \
+		adcl $0xffff, %0 \
@@ -121,5 +121,5 @@
-    __asm__("
-	addl %1, %0
-	adcl %2, %0
-	adcl %3, %0
-	adcl $0, %0
+    __asm__("\
+	addl %1, %0 \
+	adcl %2, %0 \
+	adcl %3, %0 \
+	adcl $0, %0 \
@@ -161,12 +161,12 @@
-	__asm__("
-		addl 0(%1), %0
-		adcl 4(%1), %0
-		adcl 8(%1), %0
-		adcl 12(%1), %0
-		adcl 0(%2), %0
-		adcl 4(%2), %0
-		adcl 8(%2), %0
-		adcl 12(%2), %0
-		adcl %3, %0
-		adcl %4, %0
-		adcl $0, %0
+	__asm__("\
+		addl 0(%1), %0 \
+		adcl 4(%1), %0 \
+		adcl 8(%1), %0 \
+		adcl 12(%1), %0 \
+		adcl 0(%2), %0 \
+		adcl 4(%2), %0 \
+		adcl 8(%2), %0 \
+		adcl 12(%2), %0 \
+		adcl %3, %0 \
+		adcl %4, %0 \
+		adcl $0, %0 \

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: include/asm-i386/checksum.h
  2001-07-03  6:50 include/asm-i386/checksum.h Erik Meusel
@ 2001-07-03  7:41 ` Keith Owens
  2001-07-03 11:58   ` include/asm-i386/checksum.h Erik Meusel
  2001-07-03 13:05   ` include/asm-i386/checksum.h Erik Meusel
  0 siblings, 2 replies; 8+ messages in thread
From: Keith Owens @ 2001-07-03  7:41 UTC (permalink / raw)
  To: Erik Meusel; +Cc: linux-kernel

On Tue, 3 Jul 2001 08:50:32 +0200 (CEST), 
Erik Meusel <erik@wh58-709.st.uni-magdeburg.de> wrote:
>P.S.: would it be possible to patch the menuconfig in that way, that it
>does look in the whole include-path for the <ncurses.h> and relating
>files? they aren't in /usr/include/ in my system and I'm tired of patching
>linux/scripts/lxdialog/Makefile all the time. :)

Where is it on your system?  What patch do you apply?


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: include/asm-i386/checksum.h
  2001-07-03  7:41 ` include/asm-i386/checksum.h Keith Owens
@ 2001-07-03 11:58   ` Erik Meusel
  2001-07-03 13:58     ` include/asm-i386/checksum.h J . A . Magallon
  2001-07-03 13:05   ` include/asm-i386/checksum.h Erik Meusel
  1 sibling, 1 reply; 8+ messages in thread
From: Erik Meusel @ 2001-07-03 11:58 UTC (permalink / raw)
  To: Keith Owens; +Cc: linux-kernel

[-- Attachment #1: Type: TEXT/PLAIN, Size: 530 bytes --]

On Tue, 3 Jul 2001, Keith Owens wrote:

> >P.S.: would it be possible to patch the menuconfig in that way, that it
> >does look in the whole include-path for the <ncurses.h> and relating
> >files? they aren't in /usr/include/ in my system and I'm tired of patching
> >linux/scripts/lxdialog/Makefile all the time. :)
> Where is it on your system?  What patch do you apply?
It is in /usr/local/include/ since I installed it myself, months ago.
The patch is attached. Just made silly to use /usr/local/ instead of /usr/.

mfg, Erik

[-- Attachment #2: Type: TEXT/PLAIN, Size: 968 bytes --]

--- /tmp/linux/scripts/lxdialog/Makefile	Mon Jun 19 22:45:52 2000
+++ /scratch/backup/src/linux/scripts/lxdialog/Makefile	Tue Jul  3 06:56:28 2001
@@ -4,2 +4,2 @@
-ifeq (/usr/include/ncurses/ncurses.h, $(wildcard /usr/include/ncurses/ncurses.h))
-        HOSTCFLAGS += -I/usr/include/ncurses -DCURSES_LOC="<ncurses.h>"
+ifeq (/usr/local/include/ncurses.h, $(wildcard /usr/local/include/ncurses.h))
+        HOSTCFLAGS += -I/usr/local/include -DCURSES_LOC="<ncurses.h>"
@@ -7,2 +7,2 @@
-ifeq (/usr/include/ncurses/curses.h, $(wildcard /usr/include/ncurses/curses.h))
-        HOSTCFLAGS += -I/usr/include/ncurses -DCURSES_LOC="<ncurses/curses.h>"
+ifeq (/usr/local/include/curses.h, $(wildcard /usr/local/include/curses.h))
+        HOSTCFLAGS += -I/usr/local/include -DCURSES_LOC="<curses.h>"
@@ -10 +10 @@
-ifeq (/usr/include/ncurses.h, $(wildcard /usr/include/ncurses.h))
+ifeq (/usr/local/include/ncurses.h, $(wildcard /usr/local/include/ncurses.h))

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: include/asm-i386/checksum.h
  2001-07-03  7:41 ` include/asm-i386/checksum.h Keith Owens
  2001-07-03 11:58   ` include/asm-i386/checksum.h Erik Meusel
@ 2001-07-03 13:05   ` Erik Meusel
  1 sibling, 0 replies; 8+ messages in thread
From: Erik Meusel @ 2001-07-03 13:05 UTC (permalink / raw)
  To: Keith Owens; +Cc: linux-kernel

[-- Attachment #1: Type: TEXT/PLAIN, Size: 192 bytes --]

And the same thing again, this time with include/asm-i386/floppy.h.
Patch is attached. I'm sorry to send this bit by bit, but I don't have the
time to do it all in one right now ;)

mfg, Erik

[-- Attachment #2: Type: TEXT/PLAIN, Size: 789 bytes --]

--- /tmp/linux/include/asm-i386/floppy.h	Sat May 26 03:01:38 2001
+++ include/asm/floppy.h	Tue Jul  3 14:37:40 2001
@@ -78,21 +78,21 @@
-       "testl %1,%1
-	je 3f
-1:	inb %w4,%b0
-	andb $160,%b0
-	cmpb $160,%b0
-	jne 2f
-	incw %w4
-	testl %3,%3
-	jne 4f
-	inb %w4,%b0
-	movb %0,(%2)
-	jmp 5f
-4:     	movb (%2),%0
-	outb %b0,%w4
-5:	decw %w4
-	outb %0,$0x80
-	decl %1
-	incl %2
-	testl %1,%1
-	jne 1b
-3:	inb %w4,%b0
+       "testl %1,%1 \
+	je 3f \
+1:	inb %w4,%b0 \
+	andb $160,%b0 \
+	cmpb $160,%b0 \
+	jne 2f \
+	incw %w4 \
+	testl %3,%3 \
+	jne 4f \
+	inb %w4,%b0 \
+	movb %0,(%2) \
+	jmp 5f \
+4:     	movb (%2),%0 \
+	outb %b0,%w4 \
+5:	decw %w4 \
+	outb %0,$0x80 \
+	decl %1 \
+	incl %2 \
+	testl %1,%1 \
+	jne 1b \
+3:	inb %w4,%b0 \

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: include/asm-i386/checksum.h
  2001-07-03 11:58   ` include/asm-i386/checksum.h Erik Meusel
@ 2001-07-03 13:58     ` J . A . Magallon
  2001-07-03 14:05       ` include/asm-i386/checksum.h Erik Meusel
  2001-07-03 19:16       ` include/asm-i386/checksum.h Erik Meusel
  0 siblings, 2 replies; 8+ messages in thread
From: J . A . Magallon @ 2001-07-03 13:58 UTC (permalink / raw)
  To: Erik Meusel; +Cc: Keith Owens, linux-kernel


On 20010703 Erik Meusel wrote:
>On Tue, 3 Jul 2001, Keith Owens wrote:
>
>> >P.S.: would it be possible to patch the menuconfig in that way, that it
>> >does look in the whole include-path for the <ncurses.h> and relating
>> >files? they aren't in /usr/include/ in my system and I'm tired of patching
>> >linux/scripts/lxdialog/Makefile all the time. :)
>> Where is it on your system?  What patch do you apply?
>It is in /usr/local/include/ since I installed it myself, months ago.
>The patch is attached. Just made silly to use /usr/local/ instead of /usr/.
>

make a couple symlinks and you will not have to touch kernel makefiles:
ln -s /usr/local/include/ncurses /usr/include


-- 
J.A. Magallon                           #  Let the source be with you...        
mailto:jamagallon@able.es
Mandrake Linux release 8.1 (Cooker) for i586
Linux werewolf 2.4.5-ac23 #1 SMP Tue Jul 3 01:58:06 CEST 2001 i686

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: include/asm-i386/checksum.h
  2001-07-03 13:58     ` include/asm-i386/checksum.h J . A . Magallon
@ 2001-07-03 14:05       ` Erik Meusel
  2001-07-03 19:16       ` include/asm-i386/checksum.h Erik Meusel
  1 sibling, 0 replies; 8+ messages in thread
From: Erik Meusel @ 2001-07-03 14:05 UTC (permalink / raw)
  To: J . A . Magallon; +Cc: Keith Owens, linux-kernel

On Tue, 3 Jul 2001, J . A . Magallon wrote:

> make a couple symlinks and you will not have to touch kernel makefiles:
> ln -s /usr/local/include/ncurses /usr/include
That's the thing I wanted to work around, but ok. It was just a
suggestion.

mfg, Erik


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: include/asm-i386/checksum.h
  2001-07-03 13:58     ` include/asm-i386/checksum.h J . A . Magallon
  2001-07-03 14:05       ` include/asm-i386/checksum.h Erik Meusel
@ 2001-07-03 19:16       ` Erik Meusel
  2001-07-05 19:08         ` arch/i386/kernel/semaphore.c Erik Meusel
  1 sibling, 1 reply; 8+ messages in thread
From: Erik Meusel @ 2001-07-03 19:16 UTC (permalink / raw)
  To: linux-kernel; +Cc: torvalds

[-- Attachment #1: Type: TEXT/PLAIN, Size: 314 bytes --]

Ok.

Sending dozens of patches today, I was asked if I could mail the whole
files, not only the patch and send it Cc'ed to you, Linus.

Here they are:
linux/include/asm-i386/checksum.h and
linux/include/asm-i386/floppy.h
both based on stable linux-2.4.5.

Well, have a lot of fun and thanks in advance!

mfg, Erik

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: Type: TEXT/x-chdr; name="checksum.h", Size: 5116 bytes --]

#ifndef _I386_CHECKSUM_H
#define _I386_CHECKSUM_H


/*
 * computes the checksum of a memory block at buff, length len,
 * and adds in "sum" (32-bit)
 *
 * returns a 32-bit number suitable for feeding into itself
 * or csum_tcpudp_magic
 *
 * this function must be called with even lengths, except
 * for the last fragment, which may be odd
 *
 * it's best to have buff aligned on a 32-bit boundary
 */
asmlinkage unsigned int csum_partial(const unsigned char * buff, int len, unsigned int sum);

/*
 * the same as csum_partial, but copies from src while it
 * checksums, and handles user-space pointer exceptions correctly, when needed.
 *
 * here even more important to align src and dst on a 32-bit (or even
 * better 64-bit) boundary
 */

asmlinkage unsigned int csum_partial_copy_generic( const char *src, char *dst, int len, int sum,
						   int *src_err_ptr, int *dst_err_ptr);

/*
 *	Note: when you get a NULL pointer exception here this means someone
 *	passed in an incorrect kernel address to one of these functions. 
 *	
 *	If you use these functions directly please don't forget the 
 *	verify_area().
 */
extern __inline__
unsigned int csum_partial_copy_nocheck ( const char *src, char *dst,
					int len, int sum)
{
	return csum_partial_copy_generic ( src, dst, len, sum, NULL, NULL);
}

extern __inline__
unsigned int csum_partial_copy_from_user ( const char *src, char *dst,
						int len, int sum, int *err_ptr)
{
	return csum_partial_copy_generic ( src, dst, len, sum, err_ptr, NULL);
}

/*
 * These are the old (and unsafe) way of doing checksums, a warning message will be
 * printed if they are used and an exeption occurs.
 *
 * these functions should go away after some time.
 */

#define csum_partial_copy_fromuser csum_partial_copy
unsigned int csum_partial_copy( const char *src, char *dst, int len, int sum);

/*
 *	This is a version of ip_compute_csum() optimized for IP headers,
 *	which always checksum on 4 octet boundaries.
 *
 *	By Jorge Cwik <jorge@laser.satlink.net>, adapted for linux by
 *	Arnt Gulbrandsen.
 */
static inline unsigned short ip_fast_csum(unsigned char * iph,
					  unsigned int ihl) {
	unsigned int sum;

	__asm__ __volatile__("\
	    movl (%1), %0 \
	    subl $4, %2 \
	    jbe 2f \
	    addl 4(%1), %0 \
	    adcl 8(%1), %0 \
	    adcl 12(%1), %0 \
1:	    adcl 16(%1), %0 \
	    lea 4(%1), %1 \
	    decl %2 \
	    jne	1b \
	    adcl $0, %0 \
	    movl %0, %2 \
	    shrl $16, %0 \
	    addw %w2, %w0 \
	    adcl $0, %0 \
	    notl %0 \
2: \
	    "
	/* Since the input registers which are loaded with iph and ipl
	   are modified, we must also specify them as outputs, or gcc
	   will assume they contain their original values. */
	: "=r" (sum), "=r" (iph), "=r" (ihl)
	: "1" (iph), "2" (ihl));
	return(sum);
}

/*
 *	Fold a partial checksum
 */

static inline unsigned int csum_fold(unsigned int sum)
{
	__asm__("\
		addl %1, %0 \
		adcl $0xffff, %0 \
		"
		: "=r" (sum)
		: "r" (sum << 16), "0" (sum & 0xffff0000)
	);
	return (~sum) >> 16;
}
 
static inline unsigned long csum_tcpudp_nofold(unsigned long saddr,
						   unsigned long daddr,
						   unsigned short len,
						   unsigned short proto,
						   unsigned int sum) 
{
    __asm__("\
	addl %1, %0 \
	adcl %2, %0 \
	adcl %3, %0 \
	adcl $0, %0 \
	"
	: "=r" (sum)
	: "g" (daddr), "g"(saddr), "g"((ntohs(len)<<16)+proto*256), "0"(sum));
    return sum;
}

/*
 * computes the checksum of the TCP/UDP pseudo-header
 * returns a 16-bit checksum, already complemented
 */
static inline unsigned short int csum_tcpudp_magic(unsigned long saddr,
						   unsigned long daddr,
						   unsigned short len,
						   unsigned short proto,
						   unsigned int sum) 
{
	return csum_fold(csum_tcpudp_nofold(saddr,daddr,len,proto,sum));
}

/*
 * this routine is used for miscellaneous IP-like checksums, mainly
 * in icmp.c
 */

static inline unsigned short ip_compute_csum(unsigned char * buff, int len) {
    return csum_fold (csum_partial(buff, len, 0));
}

#define _HAVE_ARCH_IPV6_CSUM
static __inline__ unsigned short int csum_ipv6_magic(struct in6_addr *saddr,
						     struct in6_addr *daddr,
						     __u32 len,
						     unsigned short proto,
						     unsigned int sum) 
{
	__asm__("\
		addl 0(%1), %0 \
		adcl 4(%1), %0 \
		adcl 8(%1), %0 \
		adcl 12(%1), %0 \
		adcl 0(%2), %0 \
		adcl 4(%2), %0 \
		adcl 8(%2), %0 \
		adcl 12(%2), %0 \
		adcl %3, %0 \
		adcl %4, %0 \
		adcl $0, %0 \
		"
		: "=&r" (sum)
		: "r" (saddr), "r" (daddr), 
		  "r"(htonl(len)), "r"(htonl(proto)), "0"(sum));

	return csum_fold(sum);
}

/* 
 *	Copy and checksum to user
 */
#define HAVE_CSUM_COPY_USER
static __inline__ unsigned int csum_and_copy_to_user (const char *src, char *dst,
				    int len, int sum, int *err_ptr)
{
	if (access_ok(VERIFY_WRITE, dst, len))
		return csum_partial_copy_generic(src, dst, len, sum, NULL, err_ptr);

	if (len)
		*err_ptr = -EFAULT;

	return -1; /* invalid checksum */
}

#endif

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: Type: TEXT/x-chdr; name="floppy.h", Size: 7589 bytes --]

/*
 * Architecture specific parts of the Floppy driver
 *
 * This file is subject to the terms and conditions of the GNU General Public
 * License.  See the file "COPYING" in the main directory of this archive
 * for more details.
 *
 * Copyright (C) 1995
 */
#ifndef __ASM_I386_FLOPPY_H
#define __ASM_I386_FLOPPY_H

#include <linux/vmalloc.h>


/*
 * The DMA channel used by the floppy controller cannot access data at
 * addresses >= 16MB
 *
 * Went back to the 1MB limit, as some people had problems with the floppy
 * driver otherwise. It doesn't matter much for performance anyway, as most
 * floppy accesses go through the track buffer.
 */
#define _CROSS_64KB(a,s,vdma) \
(!vdma && ((unsigned long)(a)/K_64 != ((unsigned long)(a) + (s) - 1) / K_64))

#define CROSS_64KB(a,s) _CROSS_64KB(a,s,use_virtual_dma & 1)


#define SW fd_routine[use_virtual_dma&1]
#define CSW fd_routine[can_use_virtual_dma & 1]


#define fd_inb(port)			inb_p(port)
#define fd_outb(port,value)		outb_p(port,value)

#define fd_request_dma()        CSW._request_dma(FLOPPY_DMA,"floppy")
#define fd_free_dma()           CSW._free_dma(FLOPPY_DMA)
#define fd_enable_irq()         enable_irq(FLOPPY_IRQ)
#define fd_disable_irq()        disable_irq(FLOPPY_IRQ)
#define fd_free_irq()		free_irq(FLOPPY_IRQ, NULL)
#define fd_get_dma_residue()    SW._get_dma_residue(FLOPPY_DMA)
#define fd_dma_mem_alloc(size)	SW._dma_mem_alloc(size)
#define fd_dma_setup(addr, size, mode, io) SW._dma_setup(addr, size, mode, io)

#define FLOPPY_CAN_FALLBACK_ON_NODMA

static int virtual_dma_count;
static int virtual_dma_residue;
static char *virtual_dma_addr;
static int virtual_dma_mode;
static int doing_pdma;

static void floppy_hardint(int irq, void *dev_id, struct pt_regs * regs)
{
	register unsigned char st;

#undef TRACE_FLPY_INT
#define NO_FLOPPY_ASSEMBLER

#ifdef TRACE_FLPY_INT
	static int calls=0;
	static int bytes=0;
	static int dma_wait=0;
#endif
	if(!doing_pdma) {
		floppy_interrupt(irq, dev_id, regs);
		return;
	}

#ifdef TRACE_FLPY_INT
	if(!calls)
		bytes = virtual_dma_count;
#endif

#ifndef NO_FLOPPY_ASSEMBLER
	__asm__ (
       "testl %1,%1 \
	je 3f \
1:	inb %w4,%b0 \
	andb $160,%b0 \
	cmpb $160,%b0 \
	jne 2f \
	incw %w4 \
	testl %3,%3 \
	jne 4f \
	inb %w4,%b0 \
	movb %0,(%2) \
	jmp 5f \
4:     	movb (%2),%0 \
	outb %b0,%w4 \
5:	decw %w4 \
	outb %0,$0x80 \
	decl %1 \
	incl %2 \
	testl %1,%1 \
	jne 1b \
3:	inb %w4,%b0 \
2:	"
       : "=a" ((char) st), 
       "=c" ((long) virtual_dma_count), 
       "=S" ((long) virtual_dma_addr)
       : "b" ((long) virtual_dma_mode),
       "d" ((short) virtual_dma_port+4), 
       "1" ((long) virtual_dma_count),
       "2" ((long) virtual_dma_addr));
#else	
	{
		register int lcount;
		register char *lptr;

		st = 1;
		for(lcount=virtual_dma_count, lptr=virtual_dma_addr; 
		    lcount; lcount--, lptr++) {
			st=inb(virtual_dma_port+4) & 0xa0 ;
			if(st != 0xa0) 
				break;
			if(virtual_dma_mode)
				outb_p(*lptr, virtual_dma_port+5);
			else
				*lptr = inb_p(virtual_dma_port+5);
		}
		virtual_dma_count = lcount;
		virtual_dma_addr = lptr;
		st = inb(virtual_dma_port+4);
	}
#endif

#ifdef TRACE_FLPY_INT
	calls++;
#endif
	if(st == 0x20)
		return;
	if(!(st & 0x20)) {
		virtual_dma_residue += virtual_dma_count;
		virtual_dma_count=0;
#ifdef TRACE_FLPY_INT
		printk("count=%x, residue=%x calls=%d bytes=%d dma_wait=%d\n", 
		       virtual_dma_count, virtual_dma_residue, calls, bytes,
		       dma_wait);
		calls = 0;
		dma_wait=0;
#endif
		doing_pdma = 0;
		floppy_interrupt(irq, dev_id, regs);
		return;
	}
#ifdef TRACE_FLPY_INT
	if(!virtual_dma_count)
		dma_wait++;
#endif
}

static void fd_disable_dma(void)
{
	if(! (can_use_virtual_dma & 1))
		disable_dma(FLOPPY_DMA);
	doing_pdma = 0;
	virtual_dma_residue += virtual_dma_count;
	virtual_dma_count=0;
}

static int vdma_request_dma(unsigned int dmanr, const char * device_id)
{
	return 0;
}

static void vdma_nop(unsigned int dummy)
{
}


static int vdma_get_dma_residue(unsigned int dummy)
{
	return virtual_dma_count + virtual_dma_residue;
}


static int fd_request_irq(void)
{
	if(can_use_virtual_dma)
		return request_irq(FLOPPY_IRQ, floppy_hardint,SA_INTERRUPT,
						   "floppy", NULL);
	else
		return request_irq(FLOPPY_IRQ, floppy_interrupt,
						   SA_INTERRUPT|SA_SAMPLE_RANDOM,
						   "floppy", NULL);	

}

static unsigned long dma_mem_alloc(unsigned long size)
{
	return __get_dma_pages(GFP_KERNEL,get_order(size));
}


static unsigned long vdma_mem_alloc(unsigned long size)
{
	return (unsigned long) vmalloc(size);

}

#define nodma_mem_alloc(size) vdma_mem_alloc(size)

static void _fd_dma_mem_free(unsigned long addr, unsigned long size)
{
	if((unsigned int) addr >= (unsigned int) high_memory)
		return vfree((void *)addr);
	else
		free_pages(addr, get_order(size));		
}

#define fd_dma_mem_free(addr, size)  _fd_dma_mem_free(addr, size) 

static void _fd_chose_dma_mode(char *addr, unsigned long size)
{
	if(can_use_virtual_dma == 2) {
		if((unsigned int) addr >= (unsigned int) high_memory ||
		   virt_to_bus(addr) >= 0x1000000 ||
		   _CROSS_64KB(addr, size, 0))
			use_virtual_dma = 1;
		else
			use_virtual_dma = 0;
	} else {
		use_virtual_dma = can_use_virtual_dma & 1;
	}
}

#define fd_chose_dma_mode(addr, size) _fd_chose_dma_mode(addr, size)


static int vdma_dma_setup(char *addr, unsigned long size, int mode, int io)
{
	doing_pdma = 1;
	virtual_dma_port = io;
	virtual_dma_mode = (mode  == DMA_MODE_WRITE);
	virtual_dma_addr = addr;
	virtual_dma_count = size;
	virtual_dma_residue = 0;
	return 0;
}

static int hard_dma_setup(char *addr, unsigned long size, int mode, int io)
{
#ifdef FLOPPY_SANITY_CHECK
	if (CROSS_64KB(addr, size)) {
		printk("DMA crossing 64-K boundary %p-%p\n", addr, addr+size);
		return -1;
	}
#endif
	/* actual, physical DMA */
	doing_pdma = 0;
	clear_dma_ff(FLOPPY_DMA);
	set_dma_mode(FLOPPY_DMA,mode);
	set_dma_addr(FLOPPY_DMA,virt_to_bus(addr));
	set_dma_count(FLOPPY_DMA,size);
	enable_dma(FLOPPY_DMA);
	return 0;
}

struct fd_routine_l {
	int (*_request_dma)(unsigned int dmanr, const char * device_id);
	void (*_free_dma)(unsigned int dmanr);
	int (*_get_dma_residue)(unsigned int dummy);
	unsigned long (*_dma_mem_alloc) (unsigned long size);
	int (*_dma_setup)(char *addr, unsigned long size, int mode, int io);
} fd_routine[] = {
	{
		request_dma,
		free_dma,
		get_dma_residue,
		dma_mem_alloc,
		hard_dma_setup
	},
	{
		vdma_request_dma,
		vdma_nop,
		vdma_get_dma_residue,
		vdma_mem_alloc,
		vdma_dma_setup
	}
};


static int FDC1 = 0x3f0;
static int FDC2 = -1;

/*
 * Floppy types are stored in the rtc's CMOS RAM and so rtc_lock
 * is needed to prevent corrupted CMOS RAM in case "insmod floppy"
 * coincides with another rtc CMOS user.		Paul G.
 */
#define FLOPPY0_TYPE	({				\
	unsigned long flags;				\
	unsigned char val;				\
	spin_lock_irqsave(&rtc_lock, flags);		\
	val = (CMOS_READ(0x10) >> 4) & 15;		\
	spin_unlock_irqrestore(&rtc_lock, flags);	\
	val;						\
})

#define FLOPPY1_TYPE	({				\
	unsigned long flags;				\
	unsigned char val;				\
	spin_lock_irqsave(&rtc_lock, flags);		\
	val = CMOS_READ(0x10) & 15;			\
	spin_unlock_irqrestore(&rtc_lock, flags);	\
	val;						\
})

#define N_FDC 2
#define N_DRIVE 8

#define FLOPPY_MOTOR_MASK 0xf0

#define AUTO_DMA


#endif /* __ASM_I386_FLOPPY_H */

^ permalink raw reply	[flat|nested] 8+ messages in thread

* arch/i386/kernel/semaphore.c
  2001-07-03 19:16       ` include/asm-i386/checksum.h Erik Meusel
@ 2001-07-05 19:08         ` Erik Meusel
  0 siblings, 0 replies; 8+ messages in thread
From: Erik Meusel @ 2001-07-05 19:08 UTC (permalink / raw)
  To: linux-kernel; +Cc: torvalds, ac9410

[-- Attachment #1: Type: TEXT/PLAIN, Size: 105 bytes --]

Hi,

I patched semaphore.c to compile cleanly and without any warning when
using GCC 3.0.

Regards,
Erik

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: Type: TEXT/x-csrc; name="semaphore.c", Size: 6449 bytes --]

/*
 * i386 semaphore implementation.
 *
 * (C) Copyright 1999 Linus Torvalds
 *
 * Portions Copyright 1999 Red Hat, Inc.
 *
 *	This program is free software; you can redistribute it and/or
 *	modify it under the terms of the GNU General Public License
 *	as published by the Free Software Foundation; either version
 *	2 of the License, or (at your option) any later version.
 *
 * rw semaphores implemented November 1999 by Benjamin LaHaise <bcrl@redhat.com>
 */
#include <linux/config.h>
#include <linux/sched.h>
#include <asm/semaphore.h>

/*
 * Semaphores are implemented using a two-way counter:
 * The "count" variable is decremented for each process
 * that tries to acquire the semaphore, while the "sleeping"
 * variable is a count of such acquires.
 *
 * Notably, the inline "up()" and "down()" functions can
 * efficiently test if they need to do any extra work (up
 * needs to do something only if count was negative before
 * the increment operation.
 *
 * "sleeping" and the contention routine ordering is
 * protected by the semaphore spinlock.
 *
 * Note that these functions are only called when there is
 * contention on the lock, and as such all this is the
 * "non-critical" part of the whole semaphore business. The
 * critical part is the inline stuff in <asm/semaphore.h>
 * where we want to avoid any extra jumps and calls.
 */

/*
 * Logic:
 *  - only on a boundary condition do we need to care. When we go
 *    from a negative count to a non-negative, we wake people up.
 *  - when we go from a non-negative count to a negative do we
 *    (a) synchronize with the "sleeper" count and (b) make sure
 *    that we're on the wakeup list before we synchronize so that
 *    we cannot lose wakeup events.
 */

void __up(struct semaphore *sem)
{
	wake_up(&sem->wait);
}

static spinlock_t semaphore_lock = SPIN_LOCK_UNLOCKED;

void __down(struct semaphore * sem)
{
	struct task_struct *tsk = current;
	DECLARE_WAITQUEUE(wait, tsk);
	tsk->state = TASK_UNINTERRUPTIBLE;
	add_wait_queue_exclusive(&sem->wait, &wait);

	spin_lock_irq(&semaphore_lock);
	sem->sleepers++;
	for (;;) {
		int sleepers = sem->sleepers;

		/*
		 * Add "everybody else" into it. They aren't
		 * playing, because we own the spinlock.
		 */
		if (!atomic_add_negative(sleepers - 1, &sem->count)) {
			sem->sleepers = 0;
			break;
		}
		sem->sleepers = 1;	/* us - see -1 above */
		spin_unlock_irq(&semaphore_lock);

		schedule();
		tsk->state = TASK_UNINTERRUPTIBLE;
		spin_lock_irq(&semaphore_lock);
	}
	spin_unlock_irq(&semaphore_lock);
	remove_wait_queue(&sem->wait, &wait);
	tsk->state = TASK_RUNNING;
	wake_up(&sem->wait);
}

int __down_interruptible(struct semaphore * sem)
{
	int retval = 0;
	struct task_struct *tsk = current;
	DECLARE_WAITQUEUE(wait, tsk);
	tsk->state = TASK_INTERRUPTIBLE;
	add_wait_queue_exclusive(&sem->wait, &wait);

	spin_lock_irq(&semaphore_lock);
	sem->sleepers ++;
	for (;;) {
		int sleepers = sem->sleepers;

		/*
		 * With signals pending, this turns into
		 * the trylock failure case - we won't be
		 * sleeping, and we* can't get the lock as
		 * it has contention. Just correct the count
		 * and exit.
		 */
		if (signal_pending(current)) {
			retval = -EINTR;
			sem->sleepers = 0;
			atomic_add(sleepers, &sem->count);
			break;
		}

		/*
		 * Add "everybody else" into it. They aren't
		 * playing, because we own the spinlock. The
		 * "-1" is because we're still hoping to get
		 * the lock.
		 */
		if (!atomic_add_negative(sleepers - 1, &sem->count)) {
			sem->sleepers = 0;
			break;
		}
		sem->sleepers = 1;	/* us - see -1 above */
		spin_unlock_irq(&semaphore_lock);

		schedule();
		tsk->state = TASK_INTERRUPTIBLE;
		spin_lock_irq(&semaphore_lock);
	}
	spin_unlock_irq(&semaphore_lock);
	tsk->state = TASK_RUNNING;
	remove_wait_queue(&sem->wait, &wait);
	wake_up(&sem->wait);
	return retval;
}

/*
 * Trylock failed - make sure we correct for
 * having decremented the count.
 *
 * We could have done the trylock with a
 * single "cmpxchg" without failure cases,
 * but then it wouldn't work on a 386.
 */
int __down_trylock(struct semaphore * sem)
{
	int sleepers;
	unsigned long flags;

	spin_lock_irqsave(&semaphore_lock, flags);
	sleepers = sem->sleepers + 1;
	sem->sleepers = 0;

	/*
	 * Add "everybody else" and us into it. They aren't
	 * playing, because we own the spinlock.
	 */
	if (!atomic_add_negative(sleepers, &sem->count))
		wake_up(&sem->wait);

	spin_unlock_irqrestore(&semaphore_lock, flags);
	return 1;
}


/*
 * The semaphore operations have a special calling sequence that
 * allow us to do a simpler in-line version of them. These routines
 * need to convert that sequence back into the C sequence when
 * there is contention on the semaphore.
 *
 * %ecx contains the semaphore pointer on entry. Save the C-clobbered
 * registers (%eax, %edx and %ecx) except %eax when used as a return
 * value..
 */
asm(
".text\n"
".align 4\n"
".globl __down_failed\n"
"__down_failed:\n\t"
	"pushl %eax\n\t"
	"pushl %edx\n\t"
	"pushl %ecx\n\t"
	"call __down\n\t"
	"popl %ecx\n\t"
	"popl %edx\n\t"
	"popl %eax\n\t"
	"ret"
);

asm(
".text\n"
".align 4\n"
".globl __down_failed_interruptible\n"
"__down_failed_interruptible:\n\t"
	"pushl %edx\n\t"
	"pushl %ecx\n\t"
	"call __down_interruptible\n\t"
	"popl %ecx\n\t"
	"popl %edx\n\t"
	"ret"
);

asm(
".text\n"
".align 4\n"
".globl __down_failed_trylock\n"
"__down_failed_trylock:\n\t"
	"pushl %edx\n\t"
	"pushl %ecx\n\t"
	"call __down_trylock\n\t"
	"popl %ecx\n\t"
	"popl %edx\n\t"
	"ret"
);

asm(
".text\n"
".align 4\n"
".globl __up_wakeup\n"
"__up_wakeup:\n\t"
	"pushl %eax\n\t"
	"pushl %edx\n\t"
	"pushl %ecx\n\t"
	"call __up\n\t"
	"popl %ecx\n\t"
	"popl %edx\n\t"
	"popl %eax\n\t"
	"ret"
);

/*
 * rw spinlock fallbacks
 */
#if defined(CONFIG_SMP)
asm(
" \
.align	4 \
.globl	__write_lock_failed \
__write_lock_failed: \
	" LOCK "addl	$" RW_LOCK_BIAS_STR ",(%eax) \
1:	cmpl	$" RW_LOCK_BIAS_STR ",(%eax) \
	jne	1b \
\
	" LOCK "subl	$" RW_LOCK_BIAS_STR ",(%eax) \
	jnz	__write_lock_failed \
	ret \
\
\
.align	4 \
.globl	__read_lock_failed \
__read_lock_failed: \
	lock ; incl	(%eax) \
1:	cmpl	$1,(%eax) \
	js	1b \
\
	lock ; decl	(%eax) \
	js	__read_lock_failed \
	ret \
"
);
#endif

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2001-07-05 19:08 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2001-07-03  6:50 include/asm-i386/checksum.h Erik Meusel
2001-07-03  7:41 ` include/asm-i386/checksum.h Keith Owens
2001-07-03 11:58   ` include/asm-i386/checksum.h Erik Meusel
2001-07-03 13:58     ` include/asm-i386/checksum.h J . A . Magallon
2001-07-03 14:05       ` include/asm-i386/checksum.h Erik Meusel
2001-07-03 19:16       ` include/asm-i386/checksum.h Erik Meusel
2001-07-05 19:08         ` arch/i386/kernel/semaphore.c Erik Meusel
2001-07-03 13:05   ` include/asm-i386/checksum.h Erik Meusel

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).