* 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 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
* 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
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).