Commit 33206b5f authored by Linus Torvalds's avatar Linus Torvalds

Import 2.3.99pre4-2

parent 0f15b079
...@@ -88,7 +88,7 @@ CPPFLAGS += -D__SMP__ ...@@ -88,7 +88,7 @@ CPPFLAGS += -D__SMP__
endif endif
CFLAGS := $(CPPFLAGS) -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer CFLAGS := $(CPPFLAGS) -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
AFLAGS := $(CPPFLAGS) -D__ASSEMBLY__ -traditional AFLAGS := -D__ASSEMBLY__ $(CPPFLAGS)
# use '-fno-strict-aliasing', but only if the compiler can take it # use '-fno-strict-aliasing', but only if the compiler can take it
CFLAGS += $(shell if $(CC) -fno-strict-aliasing -S -o /dev/null -xc /dev/null >/dev/null 2>&1; then echo "-fno-strict-aliasing"; fi) CFLAGS += $(shell if $(CC) -fno-strict-aliasing -S -o /dev/null -xc /dev/null >/dev/null 2>&1; then echo "-fno-strict-aliasing"; fi)
...@@ -185,9 +185,9 @@ include arch/$(ARCH)/Makefile ...@@ -185,9 +185,9 @@ include arch/$(ARCH)/Makefile
export NETWORKS DRIVERS LIBS HEAD LDFLAGS LINKFLAGS MAKEBOOT ASFLAGS export NETWORKS DRIVERS LIBS HEAD LDFLAGS LINKFLAGS MAKEBOOT ASFLAGS
.S.s: .S.s:
$(CPP) $(AFLAGS) -o $*.s $< $(CPP) $(AFLAGS) -traditional -o $*.s $<
.S.o: .S.o:
$(CC) $(AFLAGS) -c -o $*.o $< $(CC) $(AFLAGS) -traditional -c -o $*.o $<
Version: dummy Version: dummy
@rm -f include/linux/compile.h @rm -f include/linux/compile.h
......
...@@ -48,7 +48,7 @@ first_rule: sub_dirs ...@@ -48,7 +48,7 @@ first_rule: sub_dirs
$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$@) -S $< -o $@ $(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$@) -S $< -o $@
%.i: %.c %.i: %.c
$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$@) -E $< > $@ $(CPP) $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$@) $< > $@
%.o: %.c %.o: %.c
$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$@) -c -o $@ $< $(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$@) -c -o $@ $<
......
...@@ -11,9 +11,9 @@ ...@@ -11,9 +11,9 @@
LINKFLAGS = -static -T bootloader.lds #-N -relax LINKFLAGS = -static -T bootloader.lds #-N -relax
.S.s: .S.s:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -traditional -E -o $*.o $< $(CPP) $(AFLAGS) -traditional -o $*.o $<
.S.o: .S.o:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -traditional -c -o $*.o $< $(CC) $(AFLAGS) -traditional -c -o $*.o $<
OBJECTS = head.o main.o OBJECTS = head.o main.o
BPOBJECTS = head.o bootp.o BPOBJECTS = head.o bootp.o
......
...@@ -8,9 +8,9 @@ ...@@ -8,9 +8,9 @@
# Note 2! The CFLAGS definitions are now in the main makefile... # Note 2! The CFLAGS definitions are now in the main makefile...
.S.s: .S.s:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -E -o $*.s $< $(CPP) $(AFLAGS) -o $*.s $<
.S.o: .S.o:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -c -o $*.o $< $(CC) $(AFLAGS) -c -o $*.o $<
O_TARGET := kernel.o O_TARGET := kernel.o
O_OBJS := entry.o traps.o process.o osf_sys.o irq.o irq_alpha.o \ O_OBJS := entry.o traps.o process.o osf_sys.o irq.o irq_alpha.o \
......
...@@ -59,12 +59,12 @@ MX_OBJS := $(sort $(filter $(export-objs), $(obj-m))) ...@@ -59,12 +59,12 @@ MX_OBJS := $(sort $(filter $(export-objs), $(obj-m)))
all: kernel.o $(HEAD_OBJ) init_task.o all: kernel.o $(HEAD_OBJ) init_task.o
$(HEAD_OBJ): $(HEAD_OBJ:.o=.S) $(HEAD_OBJ): $(HEAD_OBJ:.o=.S)
$(CC) -D__ASSEMBLY__ $(AFLAGS) -DTEXTADDR=$(TEXTADDR) -traditional -c $(HEAD_OBJ:.o=.S) -o $@ $(CC) $(AFLAGS) -DTEXTADDR=$(TEXTADDR) -traditional -c $(HEAD_OBJ:.o=.S) -o $@
include $(TOPDIR)/Rules.make include $(TOPDIR)/Rules.make
.S.o: .S.o:
$(CC) -D__ASSEMBLY__ $(AFLAGS) $(AFLAGS_$@) -c -o $*.o $< $(CC) $(AFLAGS) $(AFLAGS_$@) -c -o $*.o $<
# Spell out some dependencies that `make dep' doesn't spot # Spell out some dependencies that `make dep' doesn't spot
entry-armv.o: calls.S ../lib/constants.h entry-armv.o: calls.S ../lib/constants.h
......
...@@ -37,7 +37,7 @@ L_OBJS += $(L_OBJS_$(MACHINE)) ...@@ -37,7 +37,7 @@ L_OBJS += $(L_OBJS_$(MACHINE))
include $(TOPDIR)/Rules.make include $(TOPDIR)/Rules.make
.S.o: .S.o:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -traditional -c -o $*.o $< $(CC) $(AFLAGS) -traditional -c -o $*.o $<
constants.h: getconsdata.o extractconstants.pl constants.h: getconsdata.o extractconstants.pl
$(PERL) extractconstants.pl $(OBJDUMP) > $@ $(PERL) extractconstants.pl $(OBJDUMP) > $@
......
...@@ -34,7 +34,7 @@ endif ...@@ -34,7 +34,7 @@ endif
include $(TOPDIR)/Rules.make include $(TOPDIR)/Rules.make
.S.o: .S.o:
$(CC) -D__ASSEMBLY__ $(AFLAGS) $(AFLAGS_$@) -traditional -c -o $*.o $< $(CC) $(AFLAGS) $(AFLAGS_$@) -traditional -c -o $*.o $<
# Special dependencies # Special dependencies
fault-armv.o: fault-common.c fault-armv.o: fault-common.c
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
# Note 2! The CFLAGS definitions are now in the main makefile... # Note 2! The CFLAGS definitions are now in the main makefile...
.S.o: .S.o:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -traditional -c $< -o $*.o $(CC) $(AFLAGS) -traditional -c $< -o $*.o
all: kernel.o head.o init_task.o all: kernel.o head.o init_task.o
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
# #
.S.o: .S.o:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -traditional -c $< -o $*.o $(CC) $(AFLAGS) -traditional -c $< -o $*.o
L_TARGET = lib.a L_TARGET = lib.a
L_OBJS = checksum.o old-checksum.o delay.o \ L_OBJS = checksum.o old-checksum.o delay.o \
......
...@@ -10,7 +10,7 @@ PARANOID = -DPARANOID ...@@ -10,7 +10,7 @@ PARANOID = -DPARANOID
CFLAGS := $(CFLAGS) $(PARANOID) $(DEBUG) -fno-builtin $(MATH_EMULATION) CFLAGS := $(CFLAGS) $(PARANOID) $(DEBUG) -fno-builtin $(MATH_EMULATION)
.S.o: .S.o:
$(CC) -D__ASSEMBLY__ $(AFLAGS) $(PARANOID) -c $< $(CC) $(AFLAGS) $(PARANOID) -c $<
# From 'C' language sources: # From 'C' language sources:
C_OBJS =fpu_entry.o errors.o \ C_OBJS =fpu_entry.o errors.o \
......
...@@ -11,9 +11,9 @@ ...@@ -11,9 +11,9 @@
LINKFLAGS = -static -T bootloader.lds LINKFLAGS = -static -T bootloader.lds
.S.s: .S.s:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -traditional -E -o $*.o $< $(CPP) $(AFLAGS) -traditional -o $*.o $<
.S.o: .S.o:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -traditional -c -o $*.o $< $(CC) $(AFLAGS) -traditional -c -o $*.o $<
OBJECTS = bootloader.o OBJECTS = bootloader.o
TARGETS = TARGETS =
......
...@@ -6,9 +6,9 @@ ...@@ -6,9 +6,9 @@
# #
.S.s: .S.s:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -E -o $*.s $< $(CPP) $(AFLAGS) -o $*.s $<
.S.o: .S.o:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -c -o $*.o $< $(CC) $(AFLAGS) -c -o $*.o $<
all: dig.a all: dig.a
......
...@@ -3,9 +3,9 @@ ...@@ -3,9 +3,9 @@
# #
.S.s: .S.s:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -E -o $*.s $< $(CPP) $(AFLAGS) -o $*.s $<
.S.o: .S.o:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -c -o $*.o $< $(CC) $(AFLAGS) -c -o $*.o $<
all: ia32.o all: ia32.o
......
...@@ -13,7 +13,7 @@ MOD_SUB_DIRS := $(SUB_DIRS) ...@@ -13,7 +13,7 @@ MOD_SUB_DIRS := $(SUB_DIRS)
ALL_SUB_DIRS := $(SUB_DIRS) ALL_SUB_DIRS := $(SUB_DIRS)
.S.o: .S.o:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -traditional -c $< -o $*.o $(CC) $(AFLAGS) -traditional -c $< -o $*.o
L_TARGET = kdb.a L_TARGET = kdb.a
L_OBJS = kdbsupport.o kdb_io.o kdb_bt.o kdb_traps.o L_OBJS = kdbsupport.o kdb_io.o kdb_bt.o kdb_traps.o
......
...@@ -8,9 +8,9 @@ ...@@ -8,9 +8,9 @@
# Note 2! The CFLAGS definitions are now in the main makefile... # Note 2! The CFLAGS definitions are now in the main makefile...
.S.s: .S.s:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -E -o $*.s $< $(CPP) $(AFLAGS) -o $*.s $<
.S.o: .S.o:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -c -o $*.o $< $(CC) $(AFLAGS) -c -o $*.o $<
all: kernel.o head.o init_task.o all: kernel.o head.o init_task.o
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
# #
.S.o: .S.o:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -c $< -o $@ $(CC) $(AFLAGS) -c $< -o $@
OBJS = __divdi3.o __divsi3.o __udivdi3.o __udivsi3.o \ OBJS = __divdi3.o __divsi3.o __udivdi3.o __udivsi3.o \
__moddi3.o __modsi3.o __umoddi3.o __umodsi3.o \ __moddi3.o __modsi3.o __umoddi3.o __umodsi3.o \
......
...@@ -10,9 +10,9 @@ CFLAGS := $(CFLAGS) -DCONFIG_SGI_SN1 -DSN1 -DSN -DSOFTSDV \ ...@@ -10,9 +10,9 @@ CFLAGS := $(CFLAGS) -DCONFIG_SGI_SN1 -DSN1 -DSN -DSOFTSDV \
AFLAGS := $(AFLAGS) -DCONFIG_SGI_SN1 -DSN1 -DSOFTSDV AFLAGS := $(AFLAGS) -DCONFIG_SGI_SN1 -DSN1 -DSOFTSDV
.S.s: .S.s:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -E -o $*.s $< $(CPP) $(AFLAGS) -o $*.s $<
.S.o: .S.o:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -c -o $*.o $< $(CC) $(AFLAGS) -c -o $*.o $<
all: sn.a all: sn.a
......
...@@ -10,9 +10,9 @@ CFLAGS := $(CFLAGS) -DCONFIG_SGI_SN1 -DSN1 -DSN -DSOFTSDV \ ...@@ -10,9 +10,9 @@ CFLAGS := $(CFLAGS) -DCONFIG_SGI_SN1 -DSN1 -DSN -DSOFTSDV \
AFLAGS := $(AFLAGS) -DCONFIG_SGI_SN1 -DSN1 -DSOFTSDV AFLAGS := $(AFLAGS) -DCONFIG_SGI_SN1 -DSN1 -DSOFTSDV
.S.s: .S.s:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -E -o $*.s $< $(CPP) $(AFLAGS) -o $*.s $<
.S.o: .S.o:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -c -o $*.o $< $(CC) $(AFLAGS) -c -o $*.o $<
all: sn1.a all: sn1.a
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
# Note 2! The CFLAGS definitions are now in the main makefile... # Note 2! The CFLAGS definitions are now in the main makefile...
.S.o: .S.o:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -traditional -c -o $*.o $< $(CC) $(AFLAGS) -traditional -c -o $*.o $<
OS_TARGET := fpsp.o OS_TARGET := fpsp.o
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
# for more details. # for more details.
.S.o: .S.o:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -traditional -c -o $*.o $< $(CC) $(AFLAGS) -traditional -c -o $*.o $<
OS_TARGET := ifpsp.o OS_TARGET := ifpsp.o
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
# Note 2! The CFLAGS definitions are now in the main makefile... # Note 2! The CFLAGS definitions are now in the main makefile...
.S.o: .S.o:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -traditional -c $< -o $*.o $(CC) $(AFLAGS) -traditional -c $< -o $*.o
ifndef CONFIG_SUN3 ifndef CONFIG_SUN3
all: head.o kernel.o all: head.o kernel.o
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
# #
.S.o: .S.o:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -traditional -c $< -o $@ $(CC) $(AFLAGS) -traditional -c $< -o $@
L_TARGET = lib.a L_TARGET = lib.a
L_OBJS = ashrdi3.o lshrdi3.o checksum.o memcpy.o memcmp.o memset.o semaphore.o L_OBJS = ashrdi3.o lshrdi3.o checksum.o memcpy.o memcmp.o memset.o semaphore.o
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
# Note 2! The CFLAGS definitions are now in the main makefile... # Note 2! The CFLAGS definitions are now in the main makefile...
.S.o: .S.o:
$(CC) $(EXTRA_CFLAGS) -D__ASSEMBLY__ $(AFLAGS) -traditional -c $< -o $*.o $(CC) $(EXTRA_CFLAGS) $(AFLAGS) -traditional -c $< -o $*.o
#EXTRA_CFLAGS=-DFPU_EMU_DEBUG #EXTRA_CFLAGS=-DFPU_EMU_DEBUG
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
# Note 2! The CFLAGS definitions are now in the main makefile... # Note 2! The CFLAGS definitions are now in the main makefile...
.S.o: .S.o:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -traditional -Wa,-m68020 -c $< -o $*.o $(CC) $(AFLAGS) -traditional -Wa,-m68020 -c $< -o $*.o
O_TARGET := sun3.o O_TARGET := sun3.o
O_OBJS := config.o idprom.o mmu_emu.o sun3ints.o leds.o dvma.o sbus.o intersil.o O_OBJS := config.o idprom.o mmu_emu.o sun3ints.o leds.o dvma.o sbus.o intersil.o
......
...@@ -16,9 +16,9 @@ ...@@ -16,9 +16,9 @@
.c.o: .c.o:
$(CC) $(CFLAGS) -DINITRD_OFFSET=$(IOFF) -DINITRD_SIZE=$(ISZ) -DZIMAGE_OFFSET=$(ZOFF) -DZIMAGE_SIZE=$(ZSZ) -D__BOOTER__ -c -o $*.o $< $(CC) $(CFLAGS) -DINITRD_OFFSET=$(IOFF) -DINITRD_SIZE=$(ISZ) -DZIMAGE_OFFSET=$(ZOFF) -DZIMAGE_SIZE=$(ZSZ) -D__BOOTER__ -c -o $*.o $<
.S.s: .S.s:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -traditional -E -o $*.o $< $(CPP) $(AFLAGS) -traditional -o $*.o $<
.S.o: .S.o:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -traditional -c -o $*.o $< $(CC) $(AFLAGS) -traditional -c -o $*.o $<
ZOFF = 0 ZOFF = 0
ZSZ = 0 ZSZ = 0
......
...@@ -12,9 +12,9 @@ ...@@ -12,9 +12,9 @@
.c.o: .c.o:
$(CC) $(CFLAGS) -DKERNELBASE=$(KERNELBASE) -c -o $*.o $< $(CC) $(CFLAGS) -DKERNELBASE=$(KERNELBASE) -c -o $*.o $<
.S.s: .S.s:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -traditional -E -o $*.o $< $(CPP) $(AFLAGS) -traditional -o $*.o $<
.S.o: .S.o:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -traditional -c -o $*.o $< $(CC) $(AFLAGS) -traditional -c -o $*.o $<
CFLAGS = $(CPPFLAGS) -O -fno-builtin -DSTDC_HEADERS CFLAGS = $(CPPFLAGS) -O -fno-builtin -DSTDC_HEADERS
LD_ARGS = -Ttext 0x00400000 LD_ARGS = -Ttext 0x00400000
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
# #
.S.o: .S.o:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -c $< -o $*.o $(CC) $(AFLAGS) -c $< -o $*.o
O_TARGET = lib.o O_TARGET = lib.o
O_OBJS = checksum.o string.o strcase.o O_OBJS = checksum.o string.o strcase.o
......
...@@ -16,9 +16,9 @@ ...@@ -16,9 +16,9 @@
.c.o: .c.o:
$(CC) $(CFLAGS) -DINITRD_OFFSET=$(IOFF) -DINITRD_SIZE=$(ISZ) -DZIMAGE_OFFSET=$(ZOFF) -DZIMAGE_SIZE=$(ZSZ) -c -o $*.o $< $(CC) $(CFLAGS) -DINITRD_OFFSET=$(IOFF) -DINITRD_SIZE=$(ISZ) -DZIMAGE_OFFSET=$(ZOFF) -DZIMAGE_SIZE=$(ZSZ) -c -o $*.o $<
.S.s: .S.s:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -traditional -E -o $*.o $< $(CPP) $(AFLAGS) -traditional -o $*.o $<
.S.o: .S.o:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -traditional -c -o $*.o $< $(CC) $(AFLAGS) -traditional -c -o $*.o $<
ZOFF = 0 ZOFF = 0
ZSZ = 0 ZSZ = 0
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
# #
.S.o: .S.o:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -traditional -c $< -o $*.o $(CC) $(AFLAGS) -traditional -c $< -o $*.o
O_TARGET := kernel.o O_TARGET := kernel.o
O_OBJS := process.o signal.o entry.o traps.o irq.o irq_onchip.o \ O_OBJS := process.o signal.o entry.o traps.o irq.o irq_onchip.o \
...@@ -29,7 +29,7 @@ all: kernel.o head.o init_task.o ...@@ -29,7 +29,7 @@ all: kernel.o head.o init_task.o
entry.o: entry.S entry.o: entry.S
head.o: head.S head.o: head.S
$(CC) -D__ASSEMBLY__ $(AFLAGS) -traditional -c $*.S -o $*.o $(CC) $(AFLAGS) -traditional -c $*.S -o $*.o
clean: clean:
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
# #
.S.o: .S.o:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -traditional -c $< -o $*.o $(CC) $(AFLAGS) -traditional -c $< -o $*.o
L_TARGET = lib.a L_TARGET = lib.a
L_OBJS = delay.o memcpy.o memset.o memmove.o memchr.o old-checksum.o \ L_OBJS = delay.o memcpy.o memset.o memmove.o memchr.o old-checksum.o \
......
# $Id: config.in,v 1.91 2000/03/24 10:00:05 davem Exp $ # $Id: config.in,v 1.92 2000/03/29 11:56:48 davem Exp $
# For a description of the syntax of this configuration file, # For a description of the syntax of this configuration file,
# see the Configure script. # see the Configure script.
# #
......
...@@ -8,10 +8,10 @@ ...@@ -8,10 +8,10 @@
# Note 2! The CFLAGS definitions are now in the main makefile... # Note 2! The CFLAGS definitions are now in the main makefile...
.S.s: .S.s:
$(CPP) -D__ASSEMBLY__ $(AFLAGS) -ansi $< -o $*.s $(CPP) $(AFLAGS) -ansi $< -o $*.s
.S.o: .S.o:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -ansi -c $< -o $*.o $(CC) $(AFLAGS) -ansi -c $< -o $*.o
all: kernel.o head.o init_task.o all: kernel.o head.o init_task.o
...@@ -47,7 +47,7 @@ O_OBJS += ebus.o ...@@ -47,7 +47,7 @@ O_OBJS += ebus.o
endif endif
head.o: head.S head.o: head.S
$(CC) -D__ASSEMBLY__ $(AFLAGS) -ansi -c $*.S -o $*.o $(CC) $(AFLAGS) -ansi -c $*.S -o $*.o
check_asm: dummy check_asm: dummy
@echo "/* Automatically generated. Do not edit. */" > asm_offsets.h @echo "/* Automatically generated. Do not edit. */" > asm_offsets.h
...@@ -62,7 +62,7 @@ check_asm: dummy ...@@ -62,7 +62,7 @@ check_asm: dummy
@echo "#undef __SMP__" >> tmp.c @echo "#undef __SMP__" >> tmp.c
@echo "#undef CONFIG_SMP" >> tmp.c @echo "#undef CONFIG_SMP" >> tmp.c
@echo "#include <linux/sched.h>" >> tmp.c @echo "#include <linux/sched.h>" >> tmp.c
$(CC) $(CPPFLAGS) -E tmp.c -o tmp.i $(CPP) $(CPPFLAGS) tmp.c -o tmp.i
@echo "/* Automatically generated. Do not edit. */" > check_asm.c @echo "/* Automatically generated. Do not edit. */" > check_asm.c
@echo "#include <linux/config.h>" >> check_asm.c @echo "#include <linux/config.h>" >> check_asm.c
@echo "#undef __SMP__" >> check_asm.c @echo "#undef __SMP__" >> check_asm.c
...@@ -87,7 +87,7 @@ check_asm: dummy ...@@ -87,7 +87,7 @@ check_asm: dummy
@echo "#undef CONFIG_SMP" >> tmp.c @echo "#undef CONFIG_SMP" >> tmp.c
@echo "#define CONFIG_SMP 1" >> tmp.c @echo "#define CONFIG_SMP 1" >> tmp.c
@echo "#include <linux/sched.h>" >> tmp.c @echo "#include <linux/sched.h>" >> tmp.c
$(CC) $(CPPFLAGS) -D__SMP__ -E tmp.c -o tmp.i $(CPP) $(CPPFLAGS) -D__SMP__ tmp.c -o tmp.i
@echo "/* Automatically generated. Do not edit. */" > check_asm.c @echo "/* Automatically generated. Do not edit. */" > check_asm.c
@echo "#include <linux/config.h>" >> check_asm.c @echo "#include <linux/config.h>" >> check_asm.c
@echo "#undef CONFIG_SMP" >> check_asm.c @echo "#undef CONFIG_SMP" >> check_asm.c
......
/* $Id: ioport.c,v 1.36 2000/03/16 08:22:53 anton Exp $ /* $Id: ioport.c,v 1.37 2000/03/28 06:38:19 davem Exp $
* ioport.c: Simple io mapping allocator. * ioport.c: Simple io mapping allocator.
* *
* Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
...@@ -581,6 +581,7 @@ dma_addr_t pci_map_single(struct pci_dev *hwdev, void *ptr, size_t size, int dir ...@@ -581,6 +581,7 @@ dma_addr_t pci_map_single(struct pci_dev *hwdev, void *ptr, size_t size, int dir
{ {
if (direction == PCI_DMA_NONE) if (direction == PCI_DMA_NONE)
BUG(); BUG();
/* IIep is write-through, not flushing. */
return virt_to_bus(ptr); return virt_to_bus(ptr);
} }
...@@ -591,11 +592,15 @@ dma_addr_t pci_map_single(struct pci_dev *hwdev, void *ptr, size_t size, int dir ...@@ -591,11 +592,15 @@ dma_addr_t pci_map_single(struct pci_dev *hwdev, void *ptr, size_t size, int dir
* After this call, reads by the cpu to the buffer are guarenteed to see * After this call, reads by the cpu to the buffer are guarenteed to see
* whatever the device wrote there. * whatever the device wrote there.
*/ */
void pci_unmap_single(struct pci_dev *hwdev, dma_addr_t dma_addr, size_t size, int direction) void pci_unmap_single(struct pci_dev *hwdev, dma_addr_t ba, size_t size,
int direction)
{ {
if (direction == PCI_DMA_NONE) if (direction == PCI_DMA_NONE)
BUG(); BUG();
/* Nothing to do... */ if (direction != PCI_DMA_TODEVICE) {
mmu_inval_dma_area((unsigned long)bus_to_virt(ba),
(size + PAGE_SIZE-1) & PAGE_MASK);
}
} }
/* Map a set of buffers described by scatterlist in streaming /* Map a set of buffers described by scatterlist in streaming
...@@ -613,13 +618,14 @@ void pci_unmap_single(struct pci_dev *hwdev, dma_addr_t dma_addr, size_t size, i ...@@ -613,13 +618,14 @@ void pci_unmap_single(struct pci_dev *hwdev, dma_addr_t dma_addr, size_t size, i
* Device ownership issues as mentioned above for pci_map_single are * Device ownership issues as mentioned above for pci_map_single are
* the same here. * the same here.
*/ */
int pci_map_sg(struct pci_dev *hwdev, struct scatterlist *sg, int nents, int direction) int pci_map_sg(struct pci_dev *hwdev, struct scatterlist *sg, int nents,
int direction)
{ {
int n; int n;
if (direction == PCI_DMA_NONE) if (direction == PCI_DMA_NONE)
BUG(); BUG();
/* IIep is write-through, not flushing. */
for (n = 0; n < nents; n++) { for (n = 0; n < nents; n++) {
sg->dvma_address = virt_to_bus(sg->address); sg->dvma_address = virt_to_bus(sg->address);
sg->dvma_length = sg->length; sg->dvma_length = sg->length;
...@@ -632,15 +638,24 @@ int pci_map_sg(struct pci_dev *hwdev, struct scatterlist *sg, int nents, int dir ...@@ -632,15 +638,24 @@ int pci_map_sg(struct pci_dev *hwdev, struct scatterlist *sg, int nents, int dir
* Again, cpu read rules concerning calls here are the same as for * Again, cpu read rules concerning calls here are the same as for
* pci_unmap_single() above. * pci_unmap_single() above.
*/ */
void pci_unmap_sg(struct pci_dev *hwdev, struct scatterlist *sg, int nhwents, int direction) void pci_unmap_sg(struct pci_dev *hwdev, struct scatterlist *sg, int nents,
int direction)
{ {
int n;
if (direction == PCI_DMA_NONE) if (direction == PCI_DMA_NONE)
BUG(); BUG();
/* Nothing to do... */ if (direction != PCI_DMA_TODEVICE) {
for (n = 0; n < nents; n++) {
mmu_inval_dma_area((unsigned long)sg->address,
(sg->length + PAGE_SIZE-1) & PAGE_MASK);
sg++;
}
}
} }
/* Make physical memory consistent for a single /* Make physical memory consistent for a single
* streaming mode DMA translation after a transfer. * streaming mode DMA translation before or after a transfer.
* *
* If you perform a pci_map_single() but wish to interrogate the * If you perform a pci_map_single() but wish to interrogate the
* buffer using the cpu, yet do not wish to teardown the PCI dma * buffer using the cpu, yet do not wish to teardown the PCI dma
...@@ -652,8 +667,10 @@ void pci_dma_sync_single(struct pci_dev *hwdev, dma_addr_t ba, size_t size, int ...@@ -652,8 +667,10 @@ void pci_dma_sync_single(struct pci_dev *hwdev, dma_addr_t ba, size_t size, int
{ {
if (direction == PCI_DMA_NONE) if (direction == PCI_DMA_NONE)
BUG(); BUG();
mmu_inval_dma_area((unsigned long)bus_to_virt(ba), if (direction != PCI_DMA_TODEVICE) {
(size + PAGE_SIZE-1) & PAGE_MASK); mmu_inval_dma_area((unsigned long)bus_to_virt(ba),
(size + PAGE_SIZE-1) & PAGE_MASK);
}
} }
/* Make physical memory consistent for a set of streaming /* Make physical memory consistent for a set of streaming
...@@ -664,13 +681,16 @@ void pci_dma_sync_single(struct pci_dev *hwdev, dma_addr_t ba, size_t size, int ...@@ -664,13 +681,16 @@ void pci_dma_sync_single(struct pci_dev *hwdev, dma_addr_t ba, size_t size, int
*/ */
void pci_dma_sync_sg(struct pci_dev *hwdev, struct scatterlist *sg, int nents, int direction) void pci_dma_sync_sg(struct pci_dev *hwdev, struct scatterlist *sg, int nents, int direction)
{ {
int n;
if (direction == PCI_DMA_NONE) if (direction == PCI_DMA_NONE)
BUG(); BUG();
while (nents) { if (direction != PCI_DMA_TODEVICE) {
--nents; for (n = 0; n < nents; n++) {
mmu_inval_dma_area((unsigned long)sg->address, mmu_inval_dma_area((unsigned long)sg->address,
(sg->dvma_length + PAGE_SIZE-1) & PAGE_MASK); (sg->length + PAGE_SIZE-1) & PAGE_MASK);
sg++; sg++;
}
} }
} }
#endif CONFIG_PCI #endif CONFIG_PCI
......
/* $Id: setup.c,v 1.116 2000/03/15 23:26:22 anton Exp $ /* $Id: setup.c,v 1.117 2000/03/27 12:14:54 davem Exp $
* linux/arch/sparc/kernel/setup.c * linux/arch/sparc/kernel/setup.c
* *
* Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
...@@ -45,6 +45,8 @@ ...@@ -45,6 +45,8 @@
#include <asm/hardirq.h> #include <asm/hardirq.h>
#include <asm/machines.h> #include <asm/machines.h>
#undef PROM_DEBUG_CONSOLE
struct screen_info screen_info = { struct screen_info screen_info = {
0, 0, /* orig-x, orig-y */ 0, 0, /* orig-x, orig-y */
0, /* unused */ 0, /* unused */
...@@ -282,6 +284,7 @@ struct tt_entry *sparc_ttable; ...@@ -282,6 +284,7 @@ struct tt_entry *sparc_ttable;
struct pt_regs fake_swapper_regs = { 0, 0, 0, 0, { 0, } }; struct pt_regs fake_swapper_regs = { 0, 0, 0, 0, { 0, } };
#ifdef PROM_DEBUG_CONSOLE
static void prom_cons_write(struct console *con, const char *str, unsigned count) static void prom_cons_write(struct console *con, const char *str, unsigned count)
{ {
while (count--) while (count--)
...@@ -291,6 +294,7 @@ static void prom_cons_write(struct console *con, const char *str, unsigned count ...@@ -291,6 +294,7 @@ static void prom_cons_write(struct console *con, const char *str, unsigned count
static struct console prom_console = { static struct console prom_console = {
"PROM", prom_cons_write, 0, 0, 0, 0, 0, CON_PRINTBUFFER, 0, 0, 0 "PROM", prom_cons_write, 0, 0, 0, 0, 0, CON_PRINTBUFFER, 0, 0, 0
}; };
#endif
extern void paging_init(void); extern void paging_init(void);
...@@ -345,6 +349,9 @@ void __init setup_arch(char **cmdline_p) ...@@ -345,6 +349,9 @@ void __init setup_arch(char **cmdline_p)
printk("UNKNOWN!\n"); printk("UNKNOWN!\n");
break; break;
}; };
#ifdef PROM_DEBUG_CONSOLE
register_console(&prom_console);
#endif
#ifdef CONFIG_DUMMY_CONSOLE #ifdef CONFIG_DUMMY_CONSOLE
conswitchp = &dummy_con; conswitchp = &dummy_con;
......
...@@ -13,10 +13,10 @@ lib.a: $(OBJS) ...@@ -13,10 +13,10 @@ lib.a: $(OBJS)
sync sync
.S.s: .S.s:
$(CPP) -D__ASSEMBLY__ $(AFLAGS) -ansi -DST_DIV0=0x2 $< -o $*.s $(CPP) $(AFLAGS) -ansi -DST_DIV0=0x2 $< -o $*.s
.S.o: .S.o:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -ansi -DST_DIV0=0x2 -c $< -o $*.o $(CC) $(AFLAGS) -ansi -DST_DIV0=0x2 -c $< -o $*.o
dep: dep:
......
...@@ -11,10 +11,10 @@ O_TARGET := math-emu.o ...@@ -11,10 +11,10 @@ O_TARGET := math-emu.o
O_OBJS := math.o ashldi3.o O_OBJS := math.o ashldi3.o
.S.s: .S.s:
$(CPP) -D__ASSEMBLY__ $(AFLAGS) -ansi $< -o $*.s $(CPP) $(AFLAGS) -ansi $< -o $*.s
.S.o: .S.o:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -ansi -c $< -o $*.o $(CC) $(AFLAGS) -ansi -c $< -o $*.o
CFLAGS += -I. -I$(TOPDIR)/include/math-emu -w CFLAGS += -I. -I$(TOPDIR)/include/math-emu -w
......
...@@ -7,6 +7,9 @@ ...@@ -7,6 +7,9 @@
# #
# Note 2! The CFLAGS definition is now in the main makefile... # Note 2! The CFLAGS definition is now in the main makefile...
.S.o:
$(CC) $(AFLAGS) -ansi -c -o $*.o $<
O_TARGET := mm.o O_TARGET := mm.o
O_OBJS := fault.o init.o loadmmu.o generic.o extable.o btfixup.o O_OBJS := fault.o init.o loadmmu.o generic.o extable.o btfixup.o
ifeq ($(CONFIG_SUN4),y) ifeq ($(CONFIG_SUN4),y)
...@@ -21,15 +24,3 @@ O_OBJS += sun4c.o ...@@ -21,15 +24,3 @@ O_OBJS += sun4c.o
endif endif
include $(TOPDIR)/Rules.make include $(TOPDIR)/Rules.make
hypersparc.o: hypersparc.S
$(CC) -D__ASSEMBLY__ $(AFLAGS) -ansi -c -o hypersparc.o hypersparc.S
viking.o: viking.S
$(CC) -D__ASSEMBLY__ $(AFLAGS) -ansi -c -o viking.o viking.S
tsunami.o: tsunami.S
$(CC) -D__ASSEMBLY__ $(AFLAGS) -ansi -c -o tsunami.o tsunami.S
swift.o: swift.S
$(CC) -D__ASSEMBLY__ $(AFLAGS) -ansi -c -o swift.o swift.S
# $Id: config.in,v 1.106 2000/03/24 10:00:09 davem Exp $ # $Id: config.in,v 1.107 2000/03/29 11:56:51 davem Exp $
# For a description of the syntax of this configuration file, # For a description of the syntax of this configuration file,
# see the Configure script. # see the Configure script.
# #
......
...@@ -8,10 +8,10 @@ ...@@ -8,10 +8,10 @@
# Note 2! The CFLAGS definitions are now in the main makefile... # Note 2! The CFLAGS definitions are now in the main makefile...
.S.s: .S.s:
$(CPP) -D__ASSEMBLY__ $(AFLAGS) -ansi $< -o $*.s $(CPP) $(AFLAGS) -ansi $< -o $*.s
.S.o: .S.o:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -ansi -c $< -o $*.o $(CC) $(AFLAGS) -ansi -c $< -o $*.o
all: kernel.o head.o init_task.o all: kernel.o head.o init_task.o
...@@ -54,7 +54,7 @@ endif ...@@ -54,7 +54,7 @@ endif
head.o: head.S ttable.S itlb_base.S dtlb_base.S dtlb_backend.S dtlb_prot.S \ head.o: head.S ttable.S itlb_base.S dtlb_base.S dtlb_backend.S dtlb_prot.S \
etrap.S rtrap.S winfixup.S entry.S etrap.S rtrap.S winfixup.S entry.S
$(CC) -D__ASSEMBLY__ $(AFLAGS) -ansi -c $*.S -o $*.o $(CC) $(AFLAGS) -ansi -c $*.S -o $*.o
# #
# This is just to get the dependencies... # This is just to get the dependencies...
...@@ -84,7 +84,7 @@ check_asm: dummy ...@@ -84,7 +84,7 @@ check_asm: dummy
@echo "#undef __SMP__" >> tmp.c @echo "#undef __SMP__" >> tmp.c
@echo "#undef CONFIG_SMP" >> tmp.c @echo "#undef CONFIG_SMP" >> tmp.c
@echo "#include <linux/sched.h>" >> tmp.c @echo "#include <linux/sched.h>" >> tmp.c
$(CC) $(CPPFLAGS) -E tmp.c -o tmp.i $(CPP) $(CPPFLAGS) tmp.c -o tmp.i
@echo "/* Automatically generated. Do not edit. */" > check_asm.c @echo "/* Automatically generated. Do not edit. */" > check_asm.c
@echo "#include <linux/config.h>" >> check_asm.c @echo "#include <linux/config.h>" >> check_asm.c
@echo "#undef __SMP__" >> check_asm.c @echo "#undef __SMP__" >> check_asm.c
...@@ -113,7 +113,7 @@ check_asm: dummy ...@@ -113,7 +113,7 @@ check_asm: dummy
@echo "#undef CONFIG_SMP" >> tmp.c @echo "#undef CONFIG_SMP" >> tmp.c
@echo "#define CONFIG_SMP 1" >> tmp.c @echo "#define CONFIG_SMP 1" >> tmp.c
@echo "#include <linux/sched.h>" >> tmp.c @echo "#include <linux/sched.h>" >> tmp.c
$(CC) $(CPPFLAGS) -D__SMP__ -E tmp.c -o tmp.i $(CPP) $(CPPFLAGS) -D__SMP__ tmp.c -o tmp.i
@echo "/* Automatically generated. Do not edit. */" > check_asm.c @echo "/* Automatically generated. Do not edit. */" > check_asm.c
@echo "#include <linux/config.h>" >> check_asm.c @echo "#include <linux/config.h>" >> check_asm.c
@echo "#undef CONFIG_SMP" >> check_asm.c @echo "#undef CONFIG_SMP" >> check_asm.c
...@@ -138,7 +138,7 @@ check_asm: dummy ...@@ -138,7 +138,7 @@ check_asm: dummy
@rm -f check_asm check_asm.c @rm -f check_asm check_asm.c
@echo -e "\n#else /* SPIN_LOCK_DEBUG */\n" >> asm_offsets.h @echo -e "\n#else /* SPIN_LOCK_DEBUG */\n" >> asm_offsets.h
@echo "#include <linux/sched.h>" > tmp.c @echo "#include <linux/sched.h>" > tmp.c
$(CC) $(CPPFLAGS) -D__SMP__ -DSPIN_LOCK_DEBUG -E tmp.c -o tmp.i $(CPP) $(CPPFLAGS) -D__SMP__ -DSPIN_LOCK_DEBUG tmp.c -o tmp.i
@echo "/* Automatically generated. Do not edit. */" > check_asm.c @echo "/* Automatically generated. Do not edit. */" > check_asm.c
@echo "#include <linux/config.h>" >> check_asm.c @echo "#include <linux/config.h>" >> check_asm.c
@echo "#undef CONFIG_SMP" >> check_asm.c @echo "#undef CONFIG_SMP" >> check_asm.c
......
/* $Id: entry.S,v 1.113 2000/03/06 22:33:42 davem Exp $ /* $Id: entry.S,v 1.115 2000/03/29 09:55:30 davem Exp $
* arch/sparc64/kernel/entry.S: Sparc64 trap low-level entry points. * arch/sparc64/kernel/entry.S: Sparc64 trap low-level entry points.
* *
* Copyright (C) 1995,1997 David S. Miller (davem@caip.rutgers.edu) * Copyright (C) 1995,1997 David S. Miller (davem@caip.rutgers.edu)
...@@ -998,12 +998,12 @@ linux_sparc_syscall32: ...@@ -998,12 +998,12 @@ linux_sparc_syscall32:
mov %i5, %o5 ! IEU1 mov %i5, %o5 ! IEU1
srl %i2, 0, %o2 ! IEU0 Group srl %i2, 0, %o2 ! IEU0 Group
mov %i0, %l5 ! IEU1 andcc %l0, 0x20, %g0 ! IEU0 Group
andcc %l0, 0x20, %g0 ! IEU1 Group
bne,pn %icc, linux_syscall_trace32 ! CTI bne,pn %icc, linux_syscall_trace32 ! CTI
srl %i3, 0, %o3 ! IEU0 mov %i0, %l5 ! IEU1
call %l7 ! CTI Group brk forced call %l7 ! CTI Group brk forced
add %o7, 3f-.-4, %o7 ! IEU0 srl %i3, 0, %o3 ! IEU0
ba,a,pt %xcc, 3f
/* Linux native and SunOS system calls enter here... */ /* Linux native and SunOS system calls enter here... */
.align 32 .align 32
...@@ -1032,30 +1032,31 @@ linux_sparc_syscall: ...@@ -1032,30 +1032,31 @@ linux_sparc_syscall:
mov %i0, %l5 ! IEU0 mov %i0, %l5 ! IEU0
2: call %l7 ! CTI Group brk forced 2: call %l7 ! CTI Group brk forced
mov %i5, %o5 ! IEU0 mov %i5, %o5 ! IEU0
nop
3: stx %o0, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_I0] 3: stx %o0, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_I0]
ret_sys_call: ret_sys_call:
#ifdef SYSCALL_TRACING #ifdef SYSCALL_TRACING
call syscall_trace_exit call syscall_trace_exit
add %sp, STACK_BIAS + REGWIN_SZ, %o1 add %sp, STACK_BIAS + REGWIN_SZ, %o1
#endif #endif
ldx [%curptr + AOFF_task_flags], %l6 ldx [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TSTATE], %g3
ldx [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TNPC], %l1 ! pc = npc
sra %o0, 0, %o0 sra %o0, 0, %o0
mov %ulo(TSTATE_XCARRY | TSTATE_ICARRY), %g2 mov %ulo(TSTATE_XCARRY | TSTATE_ICARRY), %g2
ldx [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TSTATE], %g3
cmp %o0, -ENOIOCTLCMD cmp %o0, -ENOIOCTLCMD
sllx %g2, 32, %g2 sllx %g2, 32, %g2
bgeu,pn %xcc, 1f bgeu,pn %xcc, 1f
andcc %l6, 0x20, %l6
/* System call success, clear Carry condition code. */ andcc %l0, 0x20, %l6
andn %g3, %g2, %g3 andn %g3, %g2, %g3 /* System call success, clear Carry condition code. */
stx %g3, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TSTATE] stx %g3, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TSTATE]
bne,pn %icc, linux_syscall_trace2 bne,pn %icc, linux_syscall_trace2
ldx [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TNPC], %l1 ! pc = npc add %l1, 0x4, %l2 ! npc = npc+4
add %l1, 0x4, %l2 !npc = npc+4
stx %l1, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TPC] stx %l1, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TPC]
b,pt %xcc, rtrap_clr_l6 ba,pt %xcc, rtrap_clr_l6
stx %l2, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TNPC] stx %l2, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TNPC]
1: 1:
/* System call failure, set Carry condition code. /* System call failure, set Carry condition code.
* Also, get abs(errno) to return to the process. * Also, get abs(errno) to return to the process.
...@@ -1066,15 +1067,14 @@ ret_sys_call: ...@@ -1066,15 +1067,14 @@ ret_sys_call:
mov 1, %l6 mov 1, %l6
stx %g3, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TSTATE] stx %g3, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TSTATE]
bne,pn %icc, linux_syscall_trace2 bne,pn %icc, linux_syscall_trace2
ldx [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TNPC], %l1 ! pc = npc add %l1, 0x4, %l2 !npc = npc+4
add %l1, 0x4, %l2 !npc = npc+4
stx %l1, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TPC] stx %l1, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TPC]
b,pt %xcc, rtrap b,pt %xcc, rtrap
stx %l2, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TNPC] stx %l2, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TNPC]
linux_syscall_trace2: linux_syscall_trace2:
call syscall_trace call syscall_trace
add %l1, 0x4, %l2 /* npc = npc+4 */ nop
stx %l1, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TPC] stx %l1, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TPC]
ba,pt %xcc, rtrap ba,pt %xcc, rtrap
stx %l2, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TNPC] stx %l2, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TNPC]
...@@ -1082,6 +1082,9 @@ linux_syscall_trace2: ...@@ -1082,6 +1082,9 @@ linux_syscall_trace2:
.align 32 .align 32
.globl __flushw_user .globl __flushw_user
__flushw_user: __flushw_user:
rdpr %otherwin, %g1
brz,pn %g1, 2f
clr %g2
1: save %sp, -128, %sp 1: save %sp, -128, %sp
rdpr %otherwin, %g1 rdpr %otherwin, %g1
brnz,pt %g1, 1b brnz,pt %g1, 1b
...@@ -1090,4 +1093,4 @@ __flushw_user: ...@@ -1090,4 +1093,4 @@ __flushw_user:
brnz,pt %g2, 1b brnz,pt %g2, 1b
restore %g0, %g0, %g0 restore %g0, %g0, %g0
2: retl 2: retl
mov %g3, %o7 nop
This diff is collapsed.
/* $Id: ioctl32.c,v 1.85 2000/03/23 05:25:41 davem Exp $ /* $Id: ioctl32.c,v 1.87 2000/03/30 02:09:07 davem Exp $
* ioctl32.c: Conversion between 32bit and 64bit native ioctls. * ioctl32.c: Conversion between 32bit and 64bit native ioctls.
* *
* Copyright (C) 1997-2000 Jakub Jelinek (jakub@redhat.com) * Copyright (C) 1997-2000 Jakub Jelinek (jakub@redhat.com)
...@@ -2716,6 +2716,25 @@ COMPATIBLE_IOCTL(SG_GET_TIMEOUT) ...@@ -2716,6 +2716,25 @@ COMPATIBLE_IOCTL(SG_GET_TIMEOUT)
COMPATIBLE_IOCTL(SG_EMULATED_HOST) COMPATIBLE_IOCTL(SG_EMULATED_HOST)
COMPATIBLE_IOCTL(SG_SET_TRANSFORM) COMPATIBLE_IOCTL(SG_SET_TRANSFORM)
COMPATIBLE_IOCTL(SG_GET_TRANSFORM) COMPATIBLE_IOCTL(SG_GET_TRANSFORM)
COMPATIBLE_IOCTL(SG_SET_RESERVED_SIZE)
COMPATIBLE_IOCTL(SG_GET_RESERVED_SIZE)
COMPATIBLE_IOCTL(SG_GET_SCSI_ID)
COMPATIBLE_IOCTL(SG_SET_FORCE_LOW_DMA)
COMPATIBLE_IOCTL(SG_GET_LOW_DMA)
COMPATIBLE_IOCTL(SG_SET_FORCE_PACK_ID)
COMPATIBLE_IOCTL(SG_GET_PACK_ID)
COMPATIBLE_IOCTL(SG_GET_NUM_WAITING)
COMPATIBLE_IOCTL(SG_SET_DEBUG)
COMPATIBLE_IOCTL(SG_GET_SG_TABLESIZE)
COMPATIBLE_IOCTL(SG_GET_COMMAND_Q)
COMPATIBLE_IOCTL(SG_SET_COMMAND_Q)
COMPATIBLE_IOCTL(SG_GET_VERSION_NUM)
COMPATIBLE_IOCTL(SG_NEXT_CMD_LEN)
COMPATIBLE_IOCTL(SG_SCSI_RESET)
COMPATIBLE_IOCTL(SG_IO)
COMPATIBLE_IOCTL(SG_GET_REQUEST_TABLE)
COMPATIBLE_IOCTL(SG_SET_KEEP_ORPHAN)
COMPATIBLE_IOCTL(SG_GET_KEEP_ORPHAN)
/* PPP stuff */ /* PPP stuff */
COMPATIBLE_IOCTL(PPPIOCGFLAGS) COMPATIBLE_IOCTL(PPPIOCGFLAGS)
COMPATIBLE_IOCTL(PPPIOCSFLAGS) COMPATIBLE_IOCTL(PPPIOCSFLAGS)
......
/* $Id: rtrap.S,v 1.48 2000/02/09 11:15:07 davem Exp $ /* $Id: rtrap.S,v 1.49 2000/03/29 09:55:31 davem Exp $
* rtrap.S: Preparing for return from trap on Sparc V9. * rtrap.S: Preparing for return from trap on Sparc V9.
* *
* Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) * Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
...@@ -14,194 +14,207 @@ ...@@ -14,194 +14,207 @@
#include <asm/processor.h> #include <asm/processor.h>
#define PTREGS_OFF (STACK_BIAS + REGWIN_SZ) #define PTREGS_OFF (STACK_BIAS + REGWIN_SZ)
#define RTRAP_PSTATE (PSTATE_RMO|PSTATE_PEF|PSTATE_PRIV|PSTATE_IE)
#define RTRAP_PSTATE_IRQOFF (PSTATE_RMO|PSTATE_PEF|PSTATE_PRIV)
#define RTRAP_PSTATE_AG_IRQOFF (PSTATE_RMO|PSTATE_PEF|PSTATE_PRIV|PSTATE_AG)
#if 0
#define RTRAP_CHECK call rtrap_check; add %sp, (STACK_BIAS+REGWIN_SZ), %o0;
#else
#define RTRAP_CHECK
#endif
.text .text
.align 32 .align 32
__handle_softirq:
call do_softirq
nop
ba,a,pt %xcc, __handle_softirq_continue
nop
__handle_preemption:
call schedule
nop
ba,pt %xcc, __handle_preemption_continue
nop
__handle_user_windows:
wrpr %g0, RTRAP_PSTATE, %pstate
call fault_in_user_windows
add %sp, STACK_BIAS + REGWIN_SZ, %g0
ba,a,pt %xcc, __handle_user_windows_continue
__handle_perfctrs:
/* Don't forget to preserve user window invariants. */
wrpr %g0, RTRAP_PSTATE, %pstate
call update_perfctrs
nop
wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate
ldub [%g6 + AOFF_task_thread + AOFF_thread_w_saved], %o2
brz,pt %o2, __handle_perfctrs_continue
sethi %hi(TSTATE_PEF), %l6
wrpr %g0, RTRAP_PSTATE, %pstate
call fault_in_user_windows
add %sp, STACK_BIAS + REGWIN_SZ, %o0
ba,pt %xcc, __handle_perfctrs_continue
nop
__handle_userfpu:
rd %fprs, %l5
andcc %l5, FPRS_FEF, %g0
be,a,pn %icc, __handle_userfpu_continue
andn %l1, %l6, %l1
ba,a,pt %xcc, __handle_userfpu_continue
__handle_signal:
clr %o0
mov %l5, %o2
mov %l6, %o3
call do_signal
add %sp, STACK_BIAS + REGWIN_SZ, %o1
ba,pt %xcc, __handle_signal_continue
clr %l6
nop
.align 64
.globl rtrap_clr_l6, rtrap .globl rtrap_clr_l6, rtrap
rtrap_clr_l6: clr %l6 rtrap_clr_l6: clr %l6
/* Fall through */
rtrap: lduw [%g6 + AOFF_task_processor], %l0 rtrap: lduw [%g6 + AOFF_task_processor], %l0
sethi %hi(softirq_state), %l2 sethi %hi(softirq_state), %l2
or %l2, %lo(softirq_state), %l2 or %l2, %lo(softirq_state), %l2
sllx %l0, 6, %l0 sllx %l0, 6, %l0
ldx [%l2 + %l0], %l1 ldx [%l2 + %l0], %l1
srlx %l1, 32, %l2 srlx %l1, 32, %l2
andcc %l1, %l2, %g0 andcc %l1, %l2, %g0
be,pt %icc, 2f
nop bne,pn %icc, __handle_softirq
call do_softirq ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %l1
nop __handle_softirq_continue:
2: ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %l1
sethi %hi(0xf << 20), %l4 sethi %hi(0xf << 20), %l4
andcc %l1, TSTATE_PRIV, %l3 andcc %l1, TSTATE_PRIV, %l3
and %l1, %l4, %l4 and %l1, %l4, %l4
rdpr %pstate, %l7 bne,pn %icc, to_kernel
andn %l1, %l4, %l1 andn %l1, %l4, %l1
be,pt %icc, to_user to_user: ldx [%g6 + AOFF_task_need_resched], %l0
andn %l7, PSTATE_IE, %l7
brnz,pn %l0, __handle_preemption
__handle_preemption_continue:
lduw [%g6 + AOFF_task_sigpending], %l0
brnz,pn %l0, __handle_signal
nop
__handle_signal_continue:
check_user_wins:
wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate
ldub [%g6 + AOFF_task_thread + AOFF_thread_w_saved], %o2
brnz,pn %o2, __handle_user_windows
sethi %hi(TSTATE_PEF), %l6
__handle_user_windows_continue:
RTRAP_CHECK
ldub [%g6 + AOFF_task_thread + AOFF_thread_flags], %l5
andcc %l5, SPARC_FLAG_PERFCTR, %g0
bne,pn %xcc, __handle_perfctrs
__handle_perfctrs_continue:
andcc %l1, %l6, %g0
bne,pn %xcc, __handle_userfpu
stb %g0, [%g6 + AOFF_task_thread + AOFF_thread_fpdepth] ! This is neccessary for non-syscall rtraps only
__handle_userfpu_continue:
ldub [%g6 + AOFF_task_thread + AOFF_thread_fpdepth], %l5
brz,pt %l5, rt_continue
srl %l5, 1, %o0
add %g6, AOFF_task_thread + AOFF_thread_fpsaved, %l6
ldub [%l6 + %o0], %l2
sub %l5, 2, %l5
add %g6, AOFF_task_thread + AOFF_thread_gsr, %o1
andcc %l2, (FPRS_FEF|FPRS_DU), %g0
be,pt %icc, 2f
and %l2, FPRS_DL, %l6
andcc %l2, FPRS_FEF, %g0
be,pn %icc, 5f
sll %o0, 3, %o5
rd %fprs, %g5
wr %g5, FPRS_FEF, %fprs
ldub [%o1 + %o0], %g5
add %g6, AOFF_task_thread + AOFF_thread_xfsr, %o1
membar #StoreLoad | #LoadLoad
sll %o0, 8, %o2
add %g6, AOFF_task_fpregs, %o3
brz,pn %l6, 1f
add %g6, AOFF_task_fpregs+0x40, %o4
ldda [%o3 + %o2] ASI_BLK_P, %f0
ldda [%o4 + %o2] ASI_BLK_P, %f16
1: andcc %l2, FPRS_DU, %g0
be,pn %icc, 1f
wr %g5, 0, %gsr
add %o2, 0x80, %o2
ldda [%o3 + %o2] ASI_BLK_P, %f32
ldda [%o4 + %o2] ASI_BLK_P, %f48
1: membar #Sync
ldx [%o1 + %o5], %fsr
2: stb %l5, [%g6 + AOFF_task_thread + AOFF_thread_fpdepth]
rt_continue: ldx [%sp + PTREGS_OFF + PT_V9_G1], %g1 rt_continue: ldx [%sp + PTREGS_OFF + PT_V9_G1], %g1
ldx [%sp + PTREGS_OFF + PT_V9_G2], %g2 ldx [%sp + PTREGS_OFF + PT_V9_G2], %g2
ldx [%sp + PTREGS_OFF + PT_V9_G3], %g3 ldx [%sp + PTREGS_OFF + PT_V9_G3], %g3
mov %g6, %o5
ldx [%sp + PTREGS_OFF + PT_V9_G4], %g4 ldx [%sp + PTREGS_OFF + PT_V9_G4], %g4
ldx [%sp + PTREGS_OFF + PT_V9_G5], %g5 ldx [%sp + PTREGS_OFF + PT_V9_G5], %g5
ldx [%sp + PTREGS_OFF + PT_V9_G6], %g6 ldx [%sp + PTREGS_OFF + PT_V9_G6], %g6
ldx [%sp + PTREGS_OFF + PT_V9_G7], %g7 ldx [%sp + PTREGS_OFF + PT_V9_G7], %g7
wrpr %g0, RTRAP_PSTATE_AG_IRQOFF, %pstate
wrpr %l7, PSTATE_AG, %pstate
ldx [%sp + PTREGS_OFF + PT_V9_I0], %i0 ldx [%sp + PTREGS_OFF + PT_V9_I0], %i0
ldx [%sp + PTREGS_OFF + PT_V9_I1], %i1 ldx [%sp + PTREGS_OFF + PT_V9_I1], %i1
ldx [%sp + PTREGS_OFF + PT_V9_I2], %i2 ldx [%sp + PTREGS_OFF + PT_V9_I2], %i2
ldx [%sp + PTREGS_OFF + PT_V9_I3], %i3 ldx [%sp + PTREGS_OFF + PT_V9_I3], %i3
ldx [%sp + PTREGS_OFF + PT_V9_I4], %i4 ldx [%sp + PTREGS_OFF + PT_V9_I4], %i4
ldx [%sp + PTREGS_OFF + PT_V9_I5], %i5 ldx [%sp + PTREGS_OFF + PT_V9_I5], %i5
ldx [%sp + PTREGS_OFF + PT_V9_I6], %i6 ldx [%sp + PTREGS_OFF + PT_V9_I6], %i6
ldx [%sp + PTREGS_OFF + PT_V9_I7], %i7 ldx [%sp + PTREGS_OFF + PT_V9_I7], %i7
ld [%sp + PTREGS_OFF + PT_V9_Y], %o3
ldx [%sp + PTREGS_OFF + PT_V9_TPC], %l2 ldx [%sp + PTREGS_OFF + PT_V9_TPC], %l2
ldx [%sp + PTREGS_OFF + PT_V9_TNPC], %o2 ldx [%sp + PTREGS_OFF + PT_V9_TNPC], %o2
ld [%sp + PTREGS_OFF + PT_V9_Y], %o3
wr %o3, %g0, %y wr %o3, %g0, %y
srl %l4, 20, %l4 srl %l4, 20, %l4
wrpr %l4, 0x0, %pil wrpr %l4, 0x0, %pil
wrpr %g0, 0x1, %tl wrpr %g0, 0x1, %tl
wrpr %l1, %g0, %tstate wrpr %l1, %g0, %tstate
wrpr %l2, %g0, %tpc wrpr %l2, %g0, %tpc
wrpr %o2, %g0, %tnpc wrpr %o2, %g0, %tnpc
brnz,pn %l3, kern_rtt brnz,pn %l3, kern_rtt
mov PRIMARY_CONTEXT, %l7 mov PRIMARY_CONTEXT, %l7
ldxa [%l7 + %l7] ASI_DMMU, %l0 ldxa [%l7 + %l7] ASI_DMMU, %l0
stxa %l0, [%l7] ASI_DMMU stxa %l0, [%l7] ASI_DMMU
flush %o5 flush %g6
rdpr %wstate, %l1 rdpr %wstate, %l1
rdpr %otherwin, %l2 rdpr %otherwin, %l2
srl %l1, 3, %l1 srl %l1, 3, %l1
wrpr %l2, %g0, %canrestore wrpr %l2, %g0, %canrestore
wrpr %l1, %g0, %wstate wrpr %l1, %g0, %wstate
wrpr %g0, %g0, %otherwin wrpr %g0, %g0, %otherwin
restore restore
rdpr %canrestore, %g1 rdpr %canrestore, %g1
wrpr %g1, 0x0, %cleanwin wrpr %g1, 0x0, %cleanwin
retry retry
nop
kern_rtt: restore kern_rtt: restore
retry retry
to_user: ldx [%g6 + AOFF_task_need_resched], %l0 to_kernel: ldub [%g6 + AOFF_task_thread + AOFF_thread_fpdepth], %l5
wrpr %l7, PSTATE_IE, %pstate brz,pt %l5, rt_continue
orcc %g0, %l0, %g0 srl %l5, 1, %o0
be,a,pt %xcc, check_signal add %g6, AOFF_task_thread + AOFF_thread_fpsaved, %l6
ldub [%l6 + %o0], %l2
lduw [%g6 + AOFF_task_sigpending], %l0 sub %l5, 2, %l5
call schedule
nop
lduw [%g6 + AOFF_task_sigpending], %l0
check_signal: brz,a,pt %l0, check_user_wins
nop
clr %o0
mov %l5, %o2
mov %l6, %o3
call do_signal
add %sp, STACK_BIAS + REGWIN_SZ, %o1
clr %l6
/* We must not take any traps between here and the actual
* return to user-space. If we do we risk having windows
* saved to the thread struct between the test and the
* actual return from trap. --DaveM
*/
check_user_wins:
wrpr %l7, 0x0, %pstate
ldub [%g6 + AOFF_task_thread + AOFF_thread_w_saved], %o2
brz,pt %o2, 1f
sethi %hi(TSTATE_PEF), %l6
wrpr %l7, PSTATE_IE, %pstate add %g6, AOFF_task_thread + AOFF_thread_gsr, %o1
call fault_in_user_windows andcc %l2, (FPRS_FEF|FPRS_DU), %g0
add %sp, STACK_BIAS + REGWIN_SZ, %o0 be,pt %icc, 2f
/* It is OK to leave interrupts on now because if and %l2, FPRS_DL, %l6
* fault_in_user_windows has returned it has left us andcc %l2, FPRS_FEF, %g0
* with a clean user stack state. be,pn %icc, 5f
*/ sll %o0, 3, %o5
1: rd %fprs, %g5
#if 0
call rtrap_check
add %sp, STACK_BIAS + REGWIN_SZ, %o0
#endif
ldub [%g6 + AOFF_task_thread + AOFF_thread_flags], %l5
andcc %l5, SPARC_FLAG_PERFCTR, %g0
be,pt %xcc, 1f
nop
/* Don't forget to preserve user window invariants. */ wr %g5, FPRS_FEF, %fprs
wrpr %l7, PSTATE_IE, %pstate ldub [%o1 + %o0], %g5
call update_perfctrs add %g6, AOFF_task_thread + AOFF_thread_xfsr, %o1
nop membar #StoreLoad | #LoadLoad
wrpr %l7, 0x0, %pstate sll %o0, 8, %o2
ldub [%g6 + AOFF_task_thread + AOFF_thread_w_saved], %o2 add %g6, AOFF_task_fpregs, %o3
brz,pt %o2, 1f brz,pn %l6, 1f
sethi %hi(TSTATE_PEF), %l6 add %g6, AOFF_task_fpregs+0x40, %o4
wrpr %l7, PSTATE_IE, %pstate
call fault_in_user_windows
add %sp, STACK_BIAS + REGWIN_SZ, %o0
1: ldda [%o3 + %o2] ASI_BLK_P, %f0
andcc %l1, %l6, %g0 ldda [%o4 + %o2] ASI_BLK_P, %f16
be,pt %xcc, rt_continue 1: andcc %l2, FPRS_DU, %g0
stb %g0, [%g6 + AOFF_task_thread + AOFF_thread_fpdepth] ! This is neccessary for non-syscall rtraps only be,pn %icc, 1f
wr %g5, 0, %gsr
add %o2, 0x80, %o2
ldda [%o3 + %o2] ASI_BLK_P, %f32
ldda [%o4 + %o2] ASI_BLK_P, %f48
rd %fprs, %l5 1: membar #Sync
andcc %l5, FPRS_FEF, %g0 ldx [%o1 + %o5], %fsr
be,a,pn %icc, rt_continue 2: stb %l5, [%g6 + AOFF_task_thread + AOFF_thread_fpdepth]
andn %l1, %l6, %l1
ba,pt %xcc, rt_continue ba,pt %xcc, rt_continue
nop nop
5: wr %g0, FPRS_FEF, %fprs 5: wr %g0, FPRS_FEF, %fprs
membar #StoreLoad | #LoadLoad membar #StoreLoad | #LoadLoad
sll %o0, 8, %o2 sll %o0, 8, %o2
add %g6, AOFF_task_fpregs+0x80, %o3 add %g6, AOFF_task_fpregs+0x80, %o3
add %g6, AOFF_task_fpregs+0xc0, %o4 add %g6, AOFF_task_fpregs+0xc0, %o4
ldda [%o3 + %o2] ASI_BLK_P, %f32 ldda [%o3 + %o2] ASI_BLK_P, %f32
ldda [%o4 + %o2] ASI_BLK_P, %f48 ldda [%o4 + %o2] ASI_BLK_P, %f48
1: membar #Sync membar #Sync
wr %g0, FPRS_DU, %fprs wr %g0, FPRS_DU, %fprs
ba,pt %xcc, rt_continue ba,pt %xcc, rt_continue
stb %l5, [%g6 + AOFF_task_thread + AOFF_thread_fpdepth] stb %l5, [%g6 + AOFF_task_thread + AOFF_thread_fpdepth]
......
/* $Id: semaphore.c,v 1.2 1999/12/23 17:12:03 jj Exp $ /* $Id: semaphore.c,v 1.3 2000/03/27 10:38:46 davem Exp $
* Generic semaphore code. Buyer beware. Do your own * Generic semaphore code. Buyer beware. Do your own
* specific changes in <asm/semaphore-helper.h> * specific changes in <asm/semaphore-helper.h>
*/ */
...@@ -203,7 +203,7 @@ void down_read_failed_biased(struct rw_semaphore *sem) ...@@ -203,7 +203,7 @@ void down_read_failed_biased(struct rw_semaphore *sem)
add_wait_queue(&sem->wait, &wait); /* put ourselves at the head of the list */ add_wait_queue(&sem->wait, &wait); /* put ourselves at the head of the list */
for (;;) { for (;;) {
if (clear_le_bit(0, &sem->granted)) if (test_and_clear_le_bit(0, &sem->granted))
break; break;
set_task_state(tsk, TASK_UNINTERRUPTIBLE); set_task_state(tsk, TASK_UNINTERRUPTIBLE);
if (!test_le_bit(0, &sem->granted)) if (!test_le_bit(0, &sem->granted))
...@@ -221,7 +221,7 @@ void down_write_failed_biased(struct rw_semaphore *sem) ...@@ -221,7 +221,7 @@ void down_write_failed_biased(struct rw_semaphore *sem)
add_wait_queue_exclusive(&sem->write_bias_wait, &wait); /* put ourselves at the end of the list */ add_wait_queue_exclusive(&sem->write_bias_wait, &wait); /* put ourselves at the end of the list */
for (;;) { for (;;) {
if (clear_le_bit(1, &sem->granted)) if (test_and_clear_le_bit(1, &sem->granted))
break; break;
set_task_state(tsk, TASK_UNINTERRUPTIBLE | TASK_EXCLUSIVE); set_task_state(tsk, TASK_UNINTERRUPTIBLE | TASK_EXCLUSIVE);
if (!test_le_bit(1, &sem->granted)) if (!test_le_bit(1, &sem->granted))
...@@ -286,11 +286,11 @@ void down_write_failed(struct rw_semaphore *sem) ...@@ -286,11 +286,11 @@ void down_write_failed(struct rw_semaphore *sem)
void __rwsem_wake(struct rw_semaphore *sem, unsigned long readers) void __rwsem_wake(struct rw_semaphore *sem, unsigned long readers)
{ {
if (readers) { if (readers) {
if (set_le_bit(0, &sem->granted)) if (test_and_set_le_bit(0, &sem->granted))
BUG(); BUG();
wake_up(&sem->wait); wake_up(&sem->wait);
} else { } else {
if (set_le_bit(1, &sem->granted)) if (test_and_set_le_bit(1, &sem->granted))
BUG(); BUG();
wake_up(&sem->write_bias_wait); wake_up(&sem->write_bias_wait);
} }
......
...@@ -469,52 +469,83 @@ void smp_flush_tlb_all(void) ...@@ -469,52 +469,83 @@ void smp_flush_tlb_all(void)
*/ */
void smp_flush_tlb_mm(struct mm_struct *mm) void smp_flush_tlb_mm(struct mm_struct *mm)
{ {
u32 ctx = CTX_HWBITS(mm->context); if (CTX_VALID(mm->context)) {
u32 ctx = CTX_HWBITS(mm->context);
if (mm == current->active_mm && int cpu = smp_processor_id();
atomic_read(&mm->mm_users) == 1 &&
(mm->cpu_vm_mask == (1UL << smp_processor_id()))) if (mm == current->active_mm && atomic_read(&mm->mm_users) == 1) {
goto local_flush_and_out; /* See smp_flush_tlb_page for info about this. */
mm->cpu_vm_mask = (1UL << cpu);
goto local_flush_and_out;
}
smp_cross_call(&xcall_flush_tlb_mm, ctx, 0, 0); smp_cross_call(&xcall_flush_tlb_mm, ctx, 0, 0);
local_flush_and_out: local_flush_and_out:
__flush_tlb_mm(ctx, SECONDARY_CONTEXT); __flush_tlb_mm(ctx, SECONDARY_CONTEXT);
}
} }
void smp_flush_tlb_range(struct mm_struct *mm, unsigned long start, void smp_flush_tlb_range(struct mm_struct *mm, unsigned long start,
unsigned long end) unsigned long end)
{ {
u32 ctx = CTX_HWBITS(mm->context); if (CTX_VALID(mm->context)) {
u32 ctx = CTX_HWBITS(mm->context);
int cpu = smp_processor_id();
start &= PAGE_MASK; start &= PAGE_MASK;
end &= PAGE_MASK; end &= PAGE_MASK;
if(mm == current->active_mm &&
atomic_read(&mm->mm_users) == 1 &&
(mm->cpu_vm_mask == (1UL << smp_processor_id())))
goto local_flush_and_out;
smp_cross_call(&xcall_flush_tlb_range, ctx, start, end); if (mm == current->active_mm && atomic_read(&mm->mm_users) == 1) {
mm->cpu_vm_mask = (1UL << cpu);
goto local_flush_and_out;
}
smp_cross_call(&xcall_flush_tlb_range, ctx, start, end);
local_flush_and_out: local_flush_and_out:
__flush_tlb_range(ctx, start, SECONDARY_CONTEXT, end, PAGE_SIZE, (end-start)); __flush_tlb_range(ctx, start, SECONDARY_CONTEXT, end, PAGE_SIZE, (end-start));
}
} }
void smp_flush_tlb_page(struct mm_struct *mm, unsigned long page) void smp_flush_tlb_page(struct mm_struct *mm, unsigned long page)
{ {
u32 ctx = CTX_HWBITS(mm->context); if (CTX_VALID(mm->context)) {
u32 ctx = CTX_HWBITS(mm->context);
page &= PAGE_MASK; int cpu = smp_processor_id();
if(mm == current->active_mm &&
atomic_read(&mm->mm_users) == 1 && page &= PAGE_MASK;
(mm->cpu_vm_mask == (1UL << smp_processor_id()))) { if (mm == current->active_mm && atomic_read(&mm->mm_users) == 1) {
goto local_flush_and_out; /* By virtue of being the current address space, and
} * having the only reference to it, the following operation
* is safe.
*
* It would not be a win to perform the xcall tlb flush in
* this case, because even if we switch back to one of the
* other processors in cpu_vm_mask it is almost certain that
* all TLB entries for this context will be replaced by the
* time that happens.
*/
mm->cpu_vm_mask = (1UL << cpu);
goto local_flush_and_out;
} else {
/* By virtue of running under the mm->page_table_lock,
* and mmu_context.h:switch_mm doing the same, the following
* operation is safe.
*/
if (mm->cpu_vm_mask == (1UL << cpu))
goto local_flush_and_out;
}
smp_cross_call(&xcall_flush_tlb_page, ctx, page, 0); /* OK, we have to actually perform the cross call. Most likely
* this is a cloned mm or kswapd is kicking out pages for a task
* which has run recently on another cpu.
*/
smp_cross_call(&xcall_flush_tlb_page, ctx, page, 0);
local_flush_and_out: local_flush_and_out:
__flush_tlb_page(ctx, page, SECONDARY_CONTEXT); __flush_tlb_page(ctx, page, SECONDARY_CONTEXT);
}
} }
/* CPU capture. */ /* CPU capture. */
...@@ -603,13 +634,16 @@ static inline void sparc64_do_profile(unsigned long pc, unsigned long o7) ...@@ -603,13 +634,16 @@ static inline void sparc64_do_profile(unsigned long pc, unsigned long o7)
extern int rwlock_impl_begin, rwlock_impl_end; extern int rwlock_impl_begin, rwlock_impl_end;
extern int atomic_impl_begin, atomic_impl_end; extern int atomic_impl_begin, atomic_impl_end;
extern int __memcpy_begin, __memcpy_end; extern int __memcpy_begin, __memcpy_end;
extern int __bitops_begin, __bitops_end;
if ((pc >= (unsigned long) &atomic_impl_begin && if ((pc >= (unsigned long) &atomic_impl_begin &&
pc < (unsigned long) &atomic_impl_end) || pc < (unsigned long) &atomic_impl_end) ||
(pc >= (unsigned long) &rwlock_impl_begin && (pc >= (unsigned long) &rwlock_impl_begin &&
pc < (unsigned long) &rwlock_impl_end) || pc < (unsigned long) &rwlock_impl_end) ||
(pc >= (unsigned long) &__memcpy_begin && (pc >= (unsigned long) &__memcpy_begin &&
pc < (unsigned long) &__memcpy_end)) pc < (unsigned long) &__memcpy_end) ||
(pc >= (unsigned long) &__bitops_begin &&
pc < (unsigned long) &__bitops_end))
pc = o7; pc = o7;
pc -= (unsigned long) &_stext; pc -= (unsigned long) &_stext;
......
/* $Id: sparc64_ksyms.c,v 1.79 2000/03/17 14:41:18 davem Exp $ /* $Id: sparc64_ksyms.c,v 1.80 2000/03/27 10:38:47 davem Exp $
* arch/sparc64/kernel/sparc64_ksyms.c: Sparc64 specific ksyms support. * arch/sparc64/kernel/sparc64_ksyms.c: Sparc64 specific ksyms support.
* *
* Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
...@@ -170,6 +170,13 @@ EXPORT_SYMBOL_NOVERS(__rwsem_wake); ...@@ -170,6 +170,13 @@ EXPORT_SYMBOL_NOVERS(__rwsem_wake);
EXPORT_SYMBOL_PRIVATE(atomic_add); EXPORT_SYMBOL_PRIVATE(atomic_add);
EXPORT_SYMBOL_PRIVATE(atomic_sub); EXPORT_SYMBOL_PRIVATE(atomic_sub);
/* Atomic bit operations. */
EXPORT_SYMBOL_PRIVATE(test_and_set_bit);
EXPORT_SYMBOL_PRIVATE(test_and_clear_bit);
EXPORT_SYMBOL_PRIVATE(test_and_change_bit);
EXPORT_SYMBOL_PRIVATE(test_and_set_le_bit);
EXPORT_SYMBOL_PRIVATE(test_and_clear_le_bit);
EXPORT_SYMBOL(ivector_table); EXPORT_SYMBOL(ivector_table);
EXPORT_SYMBOL(enable_irq); EXPORT_SYMBOL(enable_irq);
EXPORT_SYMBOL(disable_irq); EXPORT_SYMBOL(disable_irq);
......
# $Id: Makefile,v 1.20 2000/01/19 04:06:03 davem Exp $ # $Id: Makefile,v 1.21 2000/03/27 10:38:41 davem Exp $
# Makefile for Sparc library files.. # Makefile for Sparc library files..
# #
...@@ -7,7 +7,7 @@ CFLAGS := $(CFLAGS) ...@@ -7,7 +7,7 @@ CFLAGS := $(CFLAGS)
OBJS = PeeCeeI.o blockops.o debuglocks.o strlen.o strncmp.o \ OBJS = PeeCeeI.o blockops.o debuglocks.o strlen.o strncmp.o \
memscan.o strncpy_from_user.o strlen_user.o memcmp.o checksum.o \ memscan.o strncpy_from_user.o strlen_user.o memcmp.o checksum.o \
VIScopy.o VISbzero.o VISmemset.o VIScsum.o VIScsumcopy.o \ VIScopy.o VISbzero.o VISmemset.o VIScsum.o VIScsumcopy.o \
VIScsumcopyusr.o VISsave.o atomic.o rwlock.o VIScsumcopyusr.o VISsave.o atomic.o rwlock.o bitops.o
lib.a: $(OBJS) lib.a: $(OBJS)
$(AR) rcs lib.a $(OBJS) $(AR) rcs lib.a $(OBJS)
...@@ -17,10 +17,10 @@ VIScopy.o: VIScopy.S VIS.h ...@@ -17,10 +17,10 @@ VIScopy.o: VIScopy.S VIS.h
VISbzero.o: VISbzero.S VIS.h VISbzero.o: VISbzero.S VIS.h
.S.s: .S.s:
$(CPP) -D__ASSEMBLY__ $(AFLAGS) -ansi $< -o $*.s $(CPP) $(AFLAGS) -ansi $< -o $*.s
.S.o: .S.o:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -ansi -c $< -o $*.o $(CC) $(AFLAGS) -ansi -c $< -o $*.o
dep: dep:
......
/* $Id: bitops.S,v 1.1 2000/03/27 10:38:41 davem Exp $
* bitops.S: Sparc64 atomic bit operations.
*
* Copyright (C) 2000 David S. Miller (davem@redhat.com)
*/
#include <asm/asi.h>
.text
.align 64
.globl __bitops_begin
__bitops_begin:
.globl __test_and_set_bit
__test_and_set_bit: /* %o0=nr, %o1=addr */
srlx %o0, 6, %g1
mov 1, %g5
sllx %g1, 3, %g3
and %o0, 63, %g2
sllx %g5, %g2, %g5
add %o1, %g3, %o1
ldx [%o1], %g7
1: andcc %g7, %g5, %o0
bne,pn %xcc, 2f
xor %g7, %g5, %g1
casx [%o1], %g7, %g1
cmp %g7, %g1
bne,a,pn %xcc, 1b
ldx [%o1], %g7
2: retl
nop
.globl __test_and_clear_bit
__test_and_clear_bit: /* %o0=nr, %o1=addr */
srlx %o0, 6, %g1
mov 1, %g5
sllx %g1, 3, %g3
and %o0, 63, %g2
sllx %g5, %g2, %g5
add %o1, %g3, %o1
ldx [%o1], %g7
1: andcc %g7, %g5, %o0
be,pn %xcc, 2f
xor %g7, %g5, %g1
casx [%o1], %g7, %g1
cmp %g7, %g1
bne,a,pn %xcc, 1b
ldx [%o1], %g7
2: retl
nop
.globl __test_and_change_bit
__test_and_change_bit: /* %o0=nr, %o1=addr */
srlx %o0, 6, %g1
mov 1, %g5
sllx %g1, 3, %g3
and %o0, 63, %g2
sllx %g5, %g2, %g5
add %o1, %g3, %o1
ldx [%o1], %g7
1: and %g7, %g5, %o0
xor %g7, %g5, %g1
casx [%o1], %g7, %g1
cmp %g7, %g1
bne,a,pn %xcc, 1b
ldx [%o1], %g7
2: retl
nop
nop
.globl __test_and_set_le_bit
__test_and_set_le_bit: /* %o0=nr, %o1=addr */
srlx %o0, 5, %g1
mov 1, %g5
sllx %g1, 2, %g3
and %o0, 31, %g2
sllx %g5, %g2, %g5
add %o1, %g3, %o1
lduwa [%o1] ASI_PL, %g7
1: andcc %g7, %g5, %o0
bne,pn %icc, 2f
xor %g7, %g5, %g1
casa [%o1] ASI_PL, %g7, %g1
cmp %g7, %g1
bne,a,pn %icc, 1b
lduwa [%o1] ASI_PL, %g7
2: retl
nop
.globl __test_and_clear_le_bit
__test_and_clear_le_bit: /* %o0=nr, %o1=addr */
srlx %o0, 5, %g1
mov 1, %g5
sllx %g1, 2, %g3
and %o0, 31, %g2
sllx %g5, %g2, %g5
add %o1, %g3, %o1
lduwa [%o1] ASI_PL, %g7
1: andcc %g7, %g5, %o0
be,pn %icc, 2f
xor %g7, %g5, %g1
casa [%o1] ASI_PL, %g7, %g1
cmp %g7, %g1
bne,a,pn %icc, 1b
lduwa [%o1] ASI_PL, %g7
2: retl
nop
.globl __bitops_end
__bitops_end:
/* $Id: blockops.S,v 1.23 2000/03/26 09:13:50 davem Exp $ /* $Id: blockops.S,v 1.24 2000/03/27 10:38:41 davem Exp $
* blockops.S: UltraSparc block zero optimized routines. * blockops.S: UltraSparc block zero optimized routines.
* *
* Copyright (C) 1996, 1998, 1999, 2000 David S. Miller (davem@redhat.com) * Copyright (C) 1996, 1998, 1999, 2000 David S. Miller (davem@redhat.com)
...@@ -122,7 +122,11 @@ copy_user_page: /* %o0=dest, %o1=src, %o2=vaddr */ ...@@ -122,7 +122,11 @@ copy_user_page: /* %o0=dest, %o1=src, %o2=vaddr */
stxa %g2, [%o3] ASI_DTLB_DATA_ACCESS stxa %g2, [%o3] ASI_DTLB_DATA_ACCESS
membar #Sync membar #Sync
membar #LoadStore | #StoreStore | #StoreLoad ldub [%g6 + AOFF_task_thread + AOFF_thread_use_blkcommit], %g2
cmp %g2, 0
bne,pn %xcc, copy_page_using_blkcommit
nop
ldda [%o1] ASI_BLK_P, %f0 ldda [%o1] ASI_BLK_P, %f0
add %o1, 0x40, %o1 add %o1, 0x40, %o1
ldda [%o1] ASI_BLK_P, %f16 ldda [%o1] ASI_BLK_P, %f16
...@@ -152,6 +156,7 @@ copy_user_page: /* %o0=dest, %o1=src, %o2=vaddr */ ...@@ -152,6 +156,7 @@ copy_user_page: /* %o0=dest, %o1=src, %o2=vaddr */
stda %f0, [%o0] ASI_BLK_P stda %f0, [%o0] ASI_BLK_P
add %o0, 0x40, %o0 add %o0, 0x40, %o0
stda %f16, [%o0] ASI_BLK_P stda %f16, [%o0] ASI_BLK_P
copy_user_page_continue:
membar #Sync membar #Sync
VISExit VISExit
...@@ -166,6 +171,39 @@ copy_user_page: /* %o0=dest, %o1=src, %o2=vaddr */ ...@@ -166,6 +171,39 @@ copy_user_page: /* %o0=dest, %o1=src, %o2=vaddr */
jmpl %o7 + 0x8, %g0 jmpl %o7 + 0x8, %g0
wrpr %g3, 0x0, %pstate wrpr %g3, 0x0, %pstate
copy_page_using_blkcommit:
membar #LoadStore | #StoreStore | #StoreLoad
ldda [%o1] ASI_BLK_P, %f0
add %o1, 0x40, %o1
ldda [%o1] ASI_BLK_P, %f16
add %o1, 0x40, %o1
sethi %hi(8192), %o2
1: TOUCH(f0, f2, f4, f6, f8, f10, f12, f14)
ldda [%o1] ASI_BLK_P, %f32
stda %f48, [%o0] ASI_BLK_COMMIT_P
add %o1, 0x40, %o1
sub %o2, 0x40, %o2
add %o0, 0x40, %o0
TOUCH(f16, f18, f20, f22, f24, f26, f28, f30)
ldda [%o1] ASI_BLK_P, %f0
stda %f48, [%o0] ASI_BLK_COMMIT_P
add %o1, 0x40, %o1
sub %o2, 0x40, %o2
add %o0, 0x40, %o0
TOUCH(f32, f34, f36, f38, f40, f42, f44, f46)
ldda [%o1] ASI_BLK_P, %f16
stda %f48, [%o0] ASI_BLK_COMMIT_P
sub %o2, 0x40, %o2
add %o1, 0x40, %o1
cmp %o2, 0x80
bne,pt %xcc, 1b
add %o0, 0x40, %o0
membar #Sync
stda %f0, [%o0] ASI_BLK_COMMIT_P
add %o0, 0x40, %o0
ba,pt %xcc, copy_user_page_continue
stda %f16, [%o0] ASI_BLK_COMMIT_P
.align 32 .align 32
.globl clear_page .globl clear_page
.type clear_page,@function .type clear_page,@function
......
...@@ -8,10 +8,10 @@ ...@@ -8,10 +8,10 @@
# Note 2! The CFLAGS definition is now in the main makefile... # Note 2! The CFLAGS definition is now in the main makefile...
.S.s: .S.s:
$(CPP) -D__ASSEMBLY__ $(AFLAGS) -ansi $< -o $*.s $(CPP) $(AFLAGS) -ansi $< -o $*.s
.S.o: .S.o:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -ansi -c $< -o $*.o $(CC) $(AFLAGS) -ansi -c $< -o $*.o
O_TARGET := mm.o O_TARGET := mm.o
O_OBJS := ultra.o fault.o init.o generic.o extable.o modutil.o O_OBJS := ultra.o fault.o init.o generic.o extable.o modutil.o
......
/* $Id: fault.c,v 1.44 2000/03/26 09:13:51 davem Exp $ /* $Id: fault.c,v 1.45 2000/03/27 10:38:51 davem Exp $
* arch/sparc64/mm/fault.c: Page fault handlers for the 64-bit Sparc. * arch/sparc64/mm/fault.c: Page fault handlers for the 64-bit Sparc.
* *
* Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
...@@ -285,6 +285,9 @@ asmlinkage void do_sparc64_fault(struct pt_regs *regs) ...@@ -285,6 +285,9 @@ asmlinkage void do_sparc64_fault(struct pt_regs *regs)
if (fault_code & FAULT_CODE_WRITE) { if (fault_code & FAULT_CODE_WRITE) {
if (!(vma->vm_flags & VM_WRITE)) if (!(vma->vm_flags & VM_WRITE))
goto bad_area; goto bad_area;
if ((vma->vm_flags & VM_EXEC) != 0 &&
vma->vm_file != NULL)
current->thread.use_blkcommit = 1;
} else { } else {
/* Allow reads even for write-only mappings */ /* Allow reads even for write-only mappings */
if (!(vma->vm_flags & (VM_READ | VM_EXEC))) if (!(vma->vm_flags & (VM_READ | VM_EXEC)))
...@@ -342,5 +345,6 @@ asmlinkage void do_sparc64_fault(struct pt_regs *regs) ...@@ -342,5 +345,6 @@ asmlinkage void do_sparc64_fault(struct pt_regs *regs)
fault_done: fault_done:
/* These values are no longer needed, clear them. */ /* These values are no longer needed, clear them. */
current->thread.fault_code = 0; current->thread.fault_code = 0;
current->thread.use_blkcommit = 0;
current->thread.fault_address = 0; current->thread.fault_address = 0;
} }
/* $Id: ultra.S,v 1.40 2000/03/26 09:13:51 davem Exp $ /* $Id: ultra.S,v 1.41 2000/03/27 10:38:51 davem Exp $
* ultra.S: Don't expand these all over the place... * ultra.S: Don't expand these all over the place...
* *
* Copyright (C) 1997, 2000 David S. Miller (davem@redhat.com) * Copyright (C) 1997, 2000 David S. Miller (davem@redhat.com)
...@@ -206,7 +206,6 @@ iflush2:sub %o1, 0x20, %g3 ...@@ -206,7 +206,6 @@ iflush2:sub %o1, 0x20, %g3
ba,a,pt %xcc, 3b ba,a,pt %xcc, 3b
.align 32 .align 32
.globl __prefill_dtlb
__prefill_dtlb: __prefill_dtlb:
rdpr %pstate, %g7 rdpr %pstate, %g7
wrpr %g7, PSTATE_IE, %pstate wrpr %g7, PSTATE_IE, %pstate
...@@ -216,8 +215,6 @@ __prefill_dtlb: ...@@ -216,8 +215,6 @@ __prefill_dtlb:
flush %g6 flush %g6
retl retl
wrpr %g7, %pstate wrpr %g7, %pstate
.globl __prefill_itlb
__prefill_itlb: __prefill_itlb:
rdpr %pstate, %g7 rdpr %pstate, %g7
wrpr %g7, PSTATE_IE, %pstate wrpr %g7, PSTATE_IE, %pstate
...@@ -228,6 +225,23 @@ __prefill_itlb: ...@@ -228,6 +225,23 @@ __prefill_itlb:
retl retl
wrpr %g7, %pstate wrpr %g7, %pstate
.globl update_mmu_cache
update_mmu_cache: /* %o0=vma, %o1=address, %o2=pte */
ldub [%g6 + AOFF_task_thread + AOFF_thread_fault_code], %o3
srlx %o1, 13, %o1
ldx [%o0 + 0x0], %o4 /* XXX vma->vm_mm */
brz,pn %o3, 1f
sllx %o1, 13, %o0
ldx [%o4 + AOFF_mm_context], %o5
andcc %o3, FAULT_CODE_DTLB, %g0
mov %o2, %o1
and %o5, 0x3ff, %o5
bne,pt %xcc, __prefill_dtlb
or %o0, %o5, %o0
ba,a,pt %xcc, __prefill_itlb
1: retl
nop
#ifdef __SMP__ #ifdef __SMP__
/* These are all called by the slaves of a cross call, at /* These are all called by the slaves of a cross call, at
* trap level 1, with interrupts fully disabled. * trap level 1, with interrupts fully disabled.
......
...@@ -18,10 +18,10 @@ promlib.a: $(OBJS) ...@@ -18,10 +18,10 @@ promlib.a: $(OBJS)
sync sync
.S.s: .S.s:
$(CPP) -D__ASSEMBLY__ $(AFLAGS) -ansi $< -o $*.s $(CPP) $(AFLAGS) -ansi $< -o $*.s
.S.o: .S.o:
$(CC) -D__ASSEMBLY__ $(AFLAGS) -ansi -c $< -o $*.o $(CC) $(AFLAGS) -ansi -c $< -o $*.o
dep: dep:
$(CPP) $(CPPFLAGS) -M *.c > .depend $(CPP) $(CPPFLAGS) -M *.c > .depend
......
...@@ -15,10 +15,10 @@ CPPFLAGS = $(MODFLAGS) ...@@ -15,10 +15,10 @@ CPPFLAGS = $(MODFLAGS)
endif endif
.S.s: .S.s:
$(CPP) -D__ASSEMBLY__ $(AFLAGS) $(CPPFLAGS) -ansi $< -o $*.s $(CPP) $(AFLAGS) $(CPPFLAGS) -ansi $< -o $*.s
.S.o: .S.o:
$(CC) -D__ASSEMBLY__ $(AFLAGS) $(CPPFLAGS) -ansi -c $< -o $*.o $(CC) $(AFLAGS) $(CPPFLAGS) -ansi -c $< -o $*.o
ifneq ($(CONFIG_SOLARIS_EMUL),y) ifneq ($(CONFIG_SOLARIS_EMUL),y)
do_it_all: do_it_all:
......
/* $Id: socksys.c,v 1.12 2000/02/17 05:50:11 davem Exp $ /* $Id: socksys.c,v 1.13 2000/03/29 11:56:54 davem Exp $
* socksys.c: /dev/inet/ stuff for Solaris emulation. * socksys.c: /dev/inet/ stuff for Solaris emulation.
* *
* Copyright (C) 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz) * Copyright (C) 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/poll.h> #include <linux/poll.h>
#include <linux/malloc.h> #include <linux/malloc.h>
#include <linux/in.h>
#include <linux/devfs_fs_kernel.h> #include <linux/devfs_fs_kernel.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
......
...@@ -21,7 +21,6 @@ ...@@ -21,7 +21,6 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
#include <linux/config.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/wait.h> #include <linux/wait.h>
......
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
static const char *version = static const char *version =
"eepro100.c:v1.09j-t 9/29/99 Donald Becker http://cesdis.gsfc.nasa.gov/linux/drivers/eepro100.html\n" "eepro100.c:v1.09j-t 9/29/99 Donald Becker http://cesdis.gsfc.nasa.gov/linux/drivers/eepro100.html\n"
"eepro100.c: $Revision: 1.28 $ 2000/03/28 Modified by Andrey V. Savochkin <saw@saw.sw.com.sg> and others\n"; "eepro100.c: $Revision: 1.29 $ 2000/03/30 Modified by Andrey V. Savochkin <saw@saw.sw.com.sg> and others\n";
/* A few user-configurable values that apply to all boards. /* A few user-configurable values that apply to all boards.
First set is undocumented and spelled per Intel recommendations. */ First set is undocumented and spelled per Intel recommendations. */
...@@ -93,6 +93,7 @@ static int debug = -1; /* The debug level */ ...@@ -93,6 +93,7 @@ static int debug = -1; /* The debug level */
#error You must compile this driver with "-O". #error You must compile this driver with "-O".
#endif #endif
#include <linux/config.h>
#include <linux/version.h> #include <linux/version.h>
#include <linux/module.h> #include <linux/module.h>
#if defined(MODVERSIONS) #if defined(MODVERSIONS)
...@@ -353,6 +354,14 @@ enum pci_flags_bit { ...@@ -353,6 +354,14 @@ enum pci_flags_bit {
}; };
#ifndef USE_IO #ifndef USE_IO
/* Currently alpha headers define in/out macros.
Undefine them. 2000/03/30 SAW */
#undef inb
#undef inw
#undef inl
#undef outb
#undef outw
#undef outl
#define inb readb #define inb readb
#define inw readw #define inw readw
#define inl readl #define inl readl
...@@ -460,8 +469,7 @@ struct speedo_mc_block { ...@@ -460,8 +469,7 @@ struct speedo_mc_block {
unsigned int tx; unsigned int tx;
dma_addr_t frame_dma; dma_addr_t frame_dma;
unsigned int len; unsigned int len;
char fill[16 - sizeof(struct speedo_mc_block *) - sizeof(unsigned int) - sizeof(dma_addr_t) - sizeof(unsigned int)]; struct descriptor frame __attribute__ ((__aligned__(16)));
struct descriptor frame;
}; };
/* Elements of the dump_statistics block. This block must be lword aligned. */ /* Elements of the dump_statistics block. This block must be lword aligned. */
......
...@@ -14,7 +14,9 @@ if [ "$CONFIG_TR" != "n" ]; then ...@@ -14,7 +14,9 @@ if [ "$CONFIG_TR" != "n" ]; then
if [ "$CONFIG_TMS380TR" != "n" ]; then if [ "$CONFIG_TMS380TR" != "n" ]; then
dep_tristate ' Generic TMS380 PCI support' CONFIG_TMSPCI $CONFIG_TMS380TR dep_tristate ' Generic TMS380 PCI support' CONFIG_TMSPCI $CONFIG_TMS380TR
dep_tristate ' Madge Smart 16/4 PCI Mk2 support' CONFIG_ABYSS $CONFIG_TMS380TR dep_tristate ' Madge Smart 16/4 PCI Mk2 support' CONFIG_ABYSS $CONFIG_TMS380TR
dep_tristate ' Madge Smart 16/4 Ringnode MicroChannel' CONFIG_MADGEMC $CONFIG_TMS380TR if [ "$CONFIG_MCA" = "y" ]; then
dep_tristate ' Madge Smart 16/4 Ringnode MicroChannel' CONFIG_MADGEMC $CONFIG_TMS380TR
fi
fi fi
dep_tristate ' SMC ISA/MCA adapter support' CONFIG_SMCTR $CONFIG_TR dep_tristate ' SMC ISA/MCA adapter support' CONFIG_SMCTR $CONFIG_TR
fi fi
......
/* $Id: parport_sunbpp.c,v 1.9 1999/10/14 05:59:43 ecd Exp $ /* $Id: parport_sunbpp.c,v 1.10 2000/03/27 01:47:56 anton Exp $
* Parallel-port routines for Sun architecture * Parallel-port routines for Sun architecture
* *
* Author: Derrick J. Brashear <shadow@dementia.org> * Author: Derrick J. Brashear <shadow@dementia.org>
...@@ -335,6 +335,8 @@ static int __init init_one_port(struct sbus_dev *sdev) ...@@ -335,6 +335,8 @@ static int __init init_one_port(struct sbus_dev *sdev)
return 0; return 0;
} }
p->size = size;
dprintk(("init_one_port: request_irq(%08x:%p:%x:%s:%p) ", dprintk(("init_one_port: request_irq(%08x:%p:%x:%s:%p) ",
p->irq, parport_sunbpp_interrupt, SA_SHIRQ, p->name, p)); p->irq, parport_sunbpp_interrupt, SA_SHIRQ, p->name, p));
if ((err = request_irq(p->irq, parport_sunbpp_interrupt, if ((err = request_irq(p->irq, parport_sunbpp_interrupt,
......
/* $Id: esp.c,v 1.92 2000/02/18 13:49:58 davem Exp $ /* $Id: esp.c,v 1.94 2000/03/30 02:09:10 davem Exp $
* esp.c: EnhancedScsiProcessor Sun SCSI driver code. * esp.c: EnhancedScsiProcessor Sun SCSI driver code.
* *
* Copyright (C) 1995, 1998 David S. Miller (davem@caip.rutgers.edu) * Copyright (C) 1995, 1998 David S. Miller (davem@caip.rutgers.edu)
...@@ -4348,6 +4348,13 @@ static void esp_intr(int irq, void *dev_id, struct pt_regs *pregs) ...@@ -4348,6 +4348,13 @@ static void esp_intr(int irq, void *dev_id, struct pt_regs *pregs)
spin_unlock_irqrestore(&esp->lock, flags); spin_unlock_irqrestore(&esp->lock, flags);
} }
int esp_revoke(Scsi_Device* SDptr)
{
struct esp *esp = (struct esp *) SDptr->host->hostdata;
esp->targets_present &= ~(1 << SDptr->id);
return 0;
}
#ifdef MODULE #ifdef MODULE
Scsi_Host_Template driver_template = SCSI_SPARC_ESP; Scsi_Host_Template driver_template = SCSI_SPARC_ESP;
......
/* $Id: esp.h,v 1.27 1999/12/15 14:12:52 davem Exp $ /* $Id: esp.h,v 1.28 2000/03/30 01:33:17 davem Exp $
* esp.h: Defines and structures for the Sparc ESP (Enhanced SCSI * esp.h: Defines and structures for the Sparc ESP (Enhanced SCSI
* Processor) driver under Linux. * Processor) driver under Linux.
* *
...@@ -398,12 +398,14 @@ extern int esp_abort(Scsi_Cmnd *); ...@@ -398,12 +398,14 @@ extern int esp_abort(Scsi_Cmnd *);
extern int esp_reset(Scsi_Cmnd *, unsigned int); extern int esp_reset(Scsi_Cmnd *, unsigned int);
extern int esp_proc_info(char *buffer, char **start, off_t offset, int length, extern int esp_proc_info(char *buffer, char **start, off_t offset, int length,
int hostno, int inout); int hostno, int inout);
extern int esp_revoke(Scsi_Device* SDptr);
#define SCSI_SPARC_ESP { \ #define SCSI_SPARC_ESP { \
proc_name: "esp", \ proc_name: "esp", \
proc_info: &esp_proc_info, \ proc_info: &esp_proc_info, \
name: "Sun ESP 100/100a/200", \ name: "Sun ESP 100/100a/200", \
detect: esp_detect, \ detect: esp_detect, \
revoke: esp_revoke, \
info: esp_info, \ info: esp_info, \
command: esp_command, \ command: esp_command, \
queuecommand: esp_queue, \ queuecommand: esp_queue, \
......
...@@ -96,6 +96,8 @@ typedef struct SHT ...@@ -96,6 +96,8 @@ typedef struct SHT
*/ */
int (* detect)(struct SHT *); int (* detect)(struct SHT *);
int (*revoke)(Scsi_Device *);
/* Used with loadable modules to unload the host structures. Note: /* Used with loadable modules to unload the host structures. Note:
* there is a default action built into the modules code which may * there is a default action built into the modules code which may
* be sufficient for most host adapters. Thus you may not have to supply * be sufficient for most host adapters. Thus you may not have to supply
......
...@@ -1866,6 +1866,8 @@ static int proc_scsi_gen_write(struct file * file, const char * buf, ...@@ -1866,6 +1866,8 @@ static int proc_scsi_gen_write(struct file * file, const char * buf,
* Nobody is using this device any more. * Nobody is using this device any more.
* Free all of the command structures. * Free all of the command structures.
*/ */
if (HBA_ptr->hostt->revoke)
HBA_ptr->hostt->revoke(scd);
devfs_unregister (scd->de); devfs_unregister (scd->de);
scsi_release_commandblocks(scd); scsi_release_commandblocks(scd);
......
...@@ -8,6 +8,9 @@ tristate 'Support for USB' CONFIG_USB ...@@ -8,6 +8,9 @@ tristate 'Support for USB' CONFIG_USB
if [ ! "$CONFIG_USB" = "n" ]; then if [ ! "$CONFIG_USB" = "n" ]; then
bool ' USB verbose debug messages' CONFIG_USB_DEBUG bool ' USB verbose debug messages' CONFIG_USB_DEBUG
comment 'Miscellaneous USB options'
bool ' Preliminary USB device filesystem' CONFIG_USB_DEVICEFS
comment 'USB Controllers' comment 'USB Controllers'
if [ "$CONFIG_USB_UHCI_ALT" != "y" ]; then if [ "$CONFIG_USB_UHCI_ALT" != "y" ]; then
dep_tristate ' UHCI (Intel PIIX4, VIA, ...) support' CONFIG_USB_UHCI $CONFIG_USB dep_tristate ' UHCI (Intel PIIX4, VIA, ...) support' CONFIG_USB_UHCI $CONFIG_USB
...@@ -17,9 +20,6 @@ comment 'USB Controllers' ...@@ -17,9 +20,6 @@ comment 'USB Controllers'
fi fi
dep_tristate ' OHCI (Compaq, iMacs, OPTi, SiS, ALi, ...) support' CONFIG_USB_OHCI $CONFIG_USB dep_tristate ' OHCI (Compaq, iMacs, OPTi, SiS, ALi, ...) support' CONFIG_USB_OHCI $CONFIG_USB
comment 'Miscellaneous USB options'
bool ' Preliminary USB device filesystem' CONFIG_USB_DEVICEFS
comment 'USB Devices' comment 'USB Devices'
dep_tristate ' USB Printer support' CONFIG_USB_PRINTER $CONFIG_USB dep_tristate ' USB Printer support' CONFIG_USB_PRINTER $CONFIG_USB
dep_tristate ' USB Scanner support' CONFIG_USB_SCANNER $CONFIG_USB dep_tristate ' USB Scanner support' CONFIG_USB_SCANNER $CONFIG_USB
......
...@@ -29,9 +29,9 @@ ...@@ -29,9 +29,9 @@
*/ */
#define EVDEV_MINOR_BASE 64 #define EVDEV_MINOR_BASE 64
#define EVDEV_MINORS 32
#define EVDEV_BUFFER_SIZE 64 #define EVDEV_BUFFER_SIZE 64
#include <linux/miscdevice.h>
#include <linux/poll.h> #include <linux/poll.h>
#include <linux/malloc.h> #include <linux/malloc.h>
#include <linux/module.h> #include <linux/module.h>
...@@ -39,11 +39,11 @@ ...@@ -39,11 +39,11 @@
#include <linux/input.h> #include <linux/input.h>
struct evdev { struct evdev {
char name[32];
int used; int used;
int minor;
struct input_handle handle; struct input_handle handle;
struct miscdevice misc;
wait_queue_head_t wait; wait_queue_head_t wait;
devfs_handle_t devfs;
struct evdev_list *list; struct evdev_list *list;
}; };
...@@ -56,8 +56,7 @@ struct evdev_list { ...@@ -56,8 +56,7 @@ struct evdev_list {
struct evdev_list *next; struct evdev_list *next;
}; };
static unsigned long evdev_miscbits = 0; static struct evdev *evdev_table[BITS_PER_LONG] = { NULL, /* ... */ };
static struct evdev *evdev_base[BITS_PER_LONG];
static void evdev_event(struct input_handle *handle, unsigned int type, unsigned int code, int value) static void evdev_event(struct input_handle *handle, unsigned int type, unsigned int code, int value)
{ {
...@@ -101,8 +100,8 @@ static int evdev_release(struct inode * inode, struct file * file) ...@@ -101,8 +100,8 @@ static int evdev_release(struct inode * inode, struct file * file)
*listptr = (*listptr)->next; *listptr = (*listptr)->next;
if (!--list->evdev->used) { if (!--list->evdev->used) {
clear_bit(list->evdev->misc.minor - EVDEV_MINOR_BASE, &evdev_miscbits); input_unregister_minor(list->evdev->devfs);
misc_deregister(&list->evdev->misc); evdev_table[list->evdev->minor] = NULL;
kfree(list->evdev); kfree(list->evdev);
} }
...@@ -117,7 +116,7 @@ static int evdev_open(struct inode * inode, struct file * file) ...@@ -117,7 +116,7 @@ static int evdev_open(struct inode * inode, struct file * file)
struct evdev_list *list; struct evdev_list *list;
int i = MINOR(inode->i_rdev) - EVDEV_MINOR_BASE; int i = MINOR(inode->i_rdev) - EVDEV_MINOR_BASE;
if (i > BITS_PER_LONG || !test_bit(i, &evdev_miscbits)) if (i > EVDEV_MINORS || !evdev_table[i])
return -ENODEV; return -ENODEV;
if (!(list = kmalloc(sizeof(struct evdev_list), GFP_KERNEL))) if (!(list = kmalloc(sizeof(struct evdev_list), GFP_KERNEL)))
...@@ -125,9 +124,9 @@ static int evdev_open(struct inode * inode, struct file * file) ...@@ -125,9 +124,9 @@ static int evdev_open(struct inode * inode, struct file * file)
memset(list, 0, sizeof(struct evdev_list)); memset(list, 0, sizeof(struct evdev_list));
list->evdev = evdev_base[i]; list->evdev = evdev_table[i];
list->next = evdev_base[i]->list; list->next = evdev_table[i]->list;
evdev_base[i]->list = list; evdev_table[i]->list = list;
file->private_data = list; file->private_data = list;
...@@ -205,22 +204,22 @@ static struct file_operations evdev_fops = { ...@@ -205,22 +204,22 @@ static struct file_operations evdev_fops = {
static int evdev_connect(struct input_handler *handler, struct input_dev *dev) static int evdev_connect(struct input_handler *handler, struct input_dev *dev)
{ {
struct evdev *evdev; struct evdev *evdev;
int minor;
if (!(evdev = kmalloc(sizeof(struct evdev), GFP_KERNEL))) for (minor = 0; minor < EVDEV_MINORS && evdev_table[minor]; minor++);
if (evdev_table[minor]) {
printk(KERN_ERR "evdev: no more free evdev devices\n");
return -1; return -1;
}
if (!(evdev = kmalloc(sizeof(struct evdev), GFP_KERNEL)))
return -1;
memset(evdev, 0, sizeof(struct evdev)); memset(evdev, 0, sizeof(struct evdev));
init_waitqueue_head(&evdev->wait); init_waitqueue_head(&evdev->wait);
evdev->misc.minor = ffz(evdev_miscbits); evdev->minor = minor;
set_bit(evdev->misc.minor, &evdev_miscbits); evdev_table[minor] = evdev;
evdev_base[evdev->misc.minor] = evdev;
sprintf(evdev->name, "evdev%d", evdev->misc.minor);
evdev->misc.name = evdev->name;
evdev->misc.minor += EVDEV_MINOR_BASE;
evdev->misc.fops = &evdev_fops;
evdev->handle.dev = dev; evdev->handle.dev = dev;
evdev->handle.handler = handler; evdev->handle.handler = handler;
...@@ -228,11 +227,10 @@ static int evdev_connect(struct input_handler *handler, struct input_dev *dev) ...@@ -228,11 +227,10 @@ static int evdev_connect(struct input_handler *handler, struct input_dev *dev)
evdev->used = 1; evdev->used = 1;
misc_register(&evdev->misc);
input_open_device(&evdev->handle); input_open_device(&evdev->handle);
evdev->devfs = input_register_minor("event%d", minor, EVDEV_MINOR_BASE);
printk("%s: Event device for input%d on misc%d - /dev/input%d\n", printk("event%d: Event device for input%d\n", minor, dev->number);
evdev->name, dev->number, evdev->misc.minor, evdev->misc.minor - EVDEV_MINOR_BASE);
return 0; return 0;
} }
...@@ -244,8 +242,8 @@ static void evdev_disconnect(struct input_handle *handle) ...@@ -244,8 +242,8 @@ static void evdev_disconnect(struct input_handle *handle)
input_close_device(handle); input_close_device(handle);
if (!--evdev->used) { if (!--evdev->used) {
clear_bit(evdev->misc.minor - EVDEV_MINOR_BASE, &evdev_miscbits); input_unregister_minor(evdev->devfs);
misc_deregister(&evdev->misc); evdev_table[evdev->minor] = NULL;
kfree(evdev); kfree(evdev);
} }
} }
...@@ -254,6 +252,8 @@ static struct input_handler evdev_handler = { ...@@ -254,6 +252,8 @@ static struct input_handler evdev_handler = {
event: evdev_event, event: evdev_event,
connect: evdev_connect, connect: evdev_connect,
disconnect: evdev_disconnect, disconnect: evdev_disconnect,
fops: &evdev_fops,
minor: EVDEV_MINOR_BASE,
}; };
static int __init evdev_init(void) static int __init evdev_init(void)
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
* (C) Copyright 1999 Gregory P. Smith * (C) Copyright 1999 Gregory P. Smith
*/ */
#include <linux/config.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/list.h> #include <linux/list.h>
......
...@@ -45,9 +45,12 @@ EXPORT_SYMBOL(input_close_device); ...@@ -45,9 +45,12 @@ EXPORT_SYMBOL(input_close_device);
EXPORT_SYMBOL(input_event); EXPORT_SYMBOL(input_event);
#endif #endif
#define INPUT_MAJOR 13
static struct input_dev *input_dev = NULL; static struct input_dev *input_dev = NULL;
static struct input_handler *input_handler = NULL; static struct input_handler *input_handler = NULL;
static struct input_handler *input_table[8] = { NULL, /* ... */ };
static devfs_handle_t input_devfs_handle = NULL;
static int input_number = 0; static int input_number = 0;
void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
...@@ -223,6 +226,13 @@ void input_register_handler(struct input_handler *handler) ...@@ -223,6 +226,13 @@ void input_register_handler(struct input_handler *handler)
{ {
struct input_dev *dev = input_dev; struct input_dev *dev = input_dev;
/*
* Add minors if needed.
*/
if (handler->fops != NULL)
input_table[handler->minor >> 5] = handler;
/* /*
* Add the handler. * Add the handler.
*/ */
...@@ -263,6 +273,12 @@ void input_unregister_handler(struct input_handler *handler) ...@@ -263,6 +273,12 @@ void input_unregister_handler(struct input_handler *handler)
*handlerptr = (*handlerptr)->next; *handlerptr = (*handlerptr)->next;
/*
* Remove minors.
*/
if (handler->fops != NULL)
input_table[handler->minor >> 5] = NULL;
} }
void input_open_device(struct input_handle *handle) void input_open_device(struct input_handle *handle)
...@@ -302,3 +318,52 @@ void input_close_device(struct input_handle *handle) ...@@ -302,3 +318,52 @@ void input_close_device(struct input_handle *handle)
handleptr = &((*handleptr)->hnext); handleptr = &((*handleptr)->hnext);
*handleptr = (*handleptr)->hnext; *handleptr = (*handleptr)->hnext;
} }
static int input_open_file(struct inode *inode, struct file *file)
{
struct input_handler *handler = input_table[MINOR(inode->i_rdev) >> 5];
if (!handler || !handler->fops || !handler->fops->open)
return -ENODEV;
file->f_op = handler->fops;
return handler->fops->open(inode, file);
}
static struct file_operations input_fops = {
open: input_open_file,
};
devfs_handle_t input_register_minor(char *name, int minor, int minor_base)
{
char devfs_name[16];
sprintf(devfs_name, name, minor);
return devfs_register(input_devfs_handle, devfs_name, 0, DEVFS_FL_DEFAULT, INPUT_MAJOR, minor + minor_base,
S_IFCHR | S_IRUGO | S_IWUSR, 0, 0, &input_fops, NULL);
}
void input_unregister_minor(devfs_handle_t handle)
{
devfs_unregister(handle);
}
static int __init input_init(void)
{
if (devfs_register_chrdev(INPUT_MAJOR, "input", &input_fops)) {
printk(KERN_ERR "input: unable to register char major %d", INPUT_MAJOR);
return -EBUSY;
}
input_devfs_handle = devfs_mk_dir(NULL, "input", 5, NULL);
return 0;
}
static void __exit input_exit(void)
{
devfs_unregister(input_devfs_handle);
if (devfs_unregister_chrdev(INPUT_MAJOR, "input"))
printk(KERN_ERR "input: can't unregister char major %d", INPUT_MAJOR);
}
module_init(input_init);
module_exit(input_exit);
...@@ -45,15 +45,17 @@ ...@@ -45,15 +45,17 @@
#include <linux/poll.h> #include <linux/poll.h>
#include <linux/init.h> #include <linux/init.h>
#define JOYDEV_MAJOR 15 #define JOYDEV_MINOR_BASE 0
#define JOYDEV_MINORS 32
#define JOYDEV_BUFFER_SIZE 64 #define JOYDEV_BUFFER_SIZE 64
struct joydev { struct joydev {
char name[32];
int used; int used;
struct input_handle handle;
int minor; int minor;
char name[32];
struct input_handle handle;
wait_queue_head_t wait; wait_queue_head_t wait;
devfs_handle_t devfs;
struct joydev *next; struct joydev *next;
struct joydev_list *list; struct joydev_list *list;
struct js_corr corr[ABS_MAX]; struct js_corr corr[ABS_MAX];
...@@ -76,11 +78,10 @@ struct joydev_list { ...@@ -76,11 +78,10 @@ struct joydev_list {
struct joydev_list *next; struct joydev_list *next;
}; };
static unsigned long joydev_minors = 0; static struct joydev *joydev_table[BITS_PER_LONG];
static struct joydev *joydev_base[BITS_PER_LONG];
MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>"); MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>");
MODULE_SUPPORTED_DEVICE("js"); MODULE_SUPPORTED_DEVICE("input/js");
static int joydev_correct(int value, struct js_corr *corr) static int joydev_correct(int value, struct js_corr *corr)
{ {
...@@ -166,7 +167,8 @@ static int joydev_release(struct inode * inode, struct file * file) ...@@ -166,7 +167,8 @@ static int joydev_release(struct inode * inode, struct file * file)
*listptr = (*listptr)->next; *listptr = (*listptr)->next;
if (!--list->joydev->used) { if (!--list->joydev->used) {
clear_bit(list->joydev->minor, &joydev_minors); input_unregister_minor(list->joydev->devfs);
joydev_table[list->joydev->minor] = NULL;
kfree(list->joydev); kfree(list->joydev);
} }
...@@ -179,22 +181,18 @@ static int joydev_release(struct inode * inode, struct file * file) ...@@ -179,22 +181,18 @@ static int joydev_release(struct inode * inode, struct file * file)
static int joydev_open(struct inode *inode, struct file *file) static int joydev_open(struct inode *inode, struct file *file)
{ {
struct joydev_list *list; struct joydev_list *list;
int i = MINOR(inode->i_rdev); int i = MINOR(inode->i_rdev) - JOYDEV_MINOR_BASE;
if (MAJOR(inode->i_rdev) != JOYSTICK_MAJOR) if (i > JOYDEV_MINORS || !joydev_table[i])
return -EINVAL;
if (i > BITS_PER_LONG || !test_bit(i, &joydev_minors))
return -ENODEV; return -ENODEV;
if (!(list = kmalloc(sizeof(struct joydev_list), GFP_KERNEL))) if (!(list = kmalloc(sizeof(struct joydev_list), GFP_KERNEL)))
return -ENOMEM; return -ENOMEM;
memset(list, 0, sizeof(struct joydev_list)); memset(list, 0, sizeof(struct joydev_list));
list->joydev = joydev_base[i]; list->joydev = joydev_table[i];
list->next = joydev_base[i]->list; list->next = joydev_table[i]->list;
joydev_base[i]->list = list; joydev_table[i]->list = list;
file->private_data = list; file->private_data = list;
...@@ -373,27 +371,30 @@ static struct file_operations joydev_fops = { ...@@ -373,27 +371,30 @@ static struct file_operations joydev_fops = {
static int joydev_connect(struct input_handler *handler, struct input_dev *dev) static int joydev_connect(struct input_handler *handler, struct input_dev *dev)
{ {
struct joydev *joydev; struct joydev *joydev;
int i, j; int i, j, minor;
if (!(test_bit(EV_KEY, dev->evbit) && test_bit(EV_ABS, dev->evbit) && if (!(test_bit(EV_KEY, dev->evbit) && test_bit(EV_ABS, dev->evbit) &&
test_bit(ABS_X, dev->absbit) && test_bit(ABS_Y, dev->absbit) && test_bit(ABS_X, dev->absbit) && test_bit(ABS_Y, dev->absbit) &&
(test_bit(BTN_TRIGGER, dev->keybit) || test_bit(BTN_A, dev->keybit) (test_bit(BTN_TRIGGER, dev->keybit) || test_bit(BTN_A, dev->keybit)
|| test_bit(BTN_1, dev->keybit)))) return -1; || test_bit(BTN_1, dev->keybit)))) return -1;
if (!(joydev = kmalloc(sizeof(struct joydev), GFP_KERNEL))) for (minor = 0; minor < JOYDEV_MINORS && joydev_table[minor]; minor++);
if (joydev_table[minor]) {
printk(KERN_ERR "joydev: no more free joydev devices\n");
return -1; return -1;
}
if (!(joydev = kmalloc(sizeof(struct joydev), GFP_KERNEL)))
return -1;
memset(joydev, 0, sizeof(struct joydev)); memset(joydev, 0, sizeof(struct joydev));
init_waitqueue_head(&joydev->wait); init_waitqueue_head(&joydev->wait);
if (joydev_minors == -1) {
printk("Can't register new joystick - 32 devices already taken.\n");
return -1;
}
sprintf(joydev->name, "joydev%d", joydev->minor); sprintf(joydev->name, "joydev%d", joydev->minor);
joydev->minor = minor;
joydev_table[minor] = joydev;
joydev->handle.dev = dev; joydev->handle.dev = dev;
joydev->handle.handler = handler; joydev->handle.handler = handler;
joydev->handle.private = joydev; joydev->handle.private = joydev;
...@@ -421,10 +422,6 @@ static int joydev_connect(struct input_handler *handler, struct input_dev *dev) ...@@ -421,10 +422,6 @@ static int joydev_connect(struct input_handler *handler, struct input_dev *dev)
joydev->nkey++; joydev->nkey++;
} }
joydev->minor = ffz(joydev_minors);
set_bit(joydev->minor, &joydev_minors);
joydev_base[joydev->minor] = joydev;
for (i = 0; i < joydev->nabs; i++) { for (i = 0; i < joydev->nabs; i++) {
j = joydev->abspam[i]; j = joydev->abspam[i];
if (dev->absmax[j] == dev->absmin[j]) { if (dev->absmax[j] == dev->absmin[j]) {
...@@ -440,8 +437,9 @@ static int joydev_connect(struct input_handler *handler, struct input_dev *dev) ...@@ -440,8 +437,9 @@ static int joydev_connect(struct input_handler *handler, struct input_dev *dev)
} }
input_open_device(&joydev->handle); input_open_device(&joydev->handle);
joydev->devfs = input_register_minor("js%d", minor, JOYDEV_MINOR_BASE);
printk("%s: Joystick device for input%d on /dev/js%d\n", joydev->name, dev->number, joydev->minor); printk("js%d: Joystick device for input%d\n", minor, dev->number);
return 0; return 0;
} }
...@@ -453,7 +451,8 @@ static void joydev_disconnect(struct input_handle *handle) ...@@ -453,7 +451,8 @@ static void joydev_disconnect(struct input_handle *handle)
input_close_device(handle); input_close_device(handle);
if (!--joydev->used) { if (!--joydev->used) {
clear_bit(joydev->minor, &joydev_minors); input_unregister_minor(joydev->devfs);
joydev_table[joydev->minor] = NULL;
kfree(joydev); kfree(joydev);
} }
} }
...@@ -462,14 +461,12 @@ static struct input_handler joydev_handler = { ...@@ -462,14 +461,12 @@ static struct input_handler joydev_handler = {
event: joydev_event, event: joydev_event,
connect: joydev_connect, connect: joydev_connect,
disconnect: joydev_disconnect, disconnect: joydev_disconnect,
fops: &joydev_fops,
minor: JOYDEV_MINOR_BASE,
}; };
static int __init joydev_init(void) static int __init joydev_init(void)
{ {
if (register_chrdev(JOYDEV_MAJOR, "js", &joydev_fops)) {
printk(KERN_ERR "joydev: unable to get major %d for joystick\n", JOYDEV_MAJOR);
return -EBUSY;
}
input_register_handler(&joydev_handler); input_register_handler(&joydev_handler);
return 0; return 0;
} }
...@@ -477,8 +474,6 @@ static int __init joydev_init(void) ...@@ -477,8 +474,6 @@ static int __init joydev_init(void)
static void __exit joydev_exit(void) static void __exit joydev_exit(void)
{ {
input_unregister_handler(&joydev_handler); input_unregister_handler(&joydev_handler);
if (unregister_chrdev(JOYSTICK_MAJOR, "js"))
printk(KERN_ERR "js: can't unregister device\n");
} }
module_init(joydev_init); module_init(joydev_init);
......
...@@ -29,8 +29,8 @@ ...@@ -29,8 +29,8 @@
*/ */
#define MOUSEDEV_MINOR_BASE 32 #define MOUSEDEV_MINOR_BASE 32
#define MOUSEDEV_MINORS 32
#include <linux/miscdevice.h>
#include <linux/malloc.h> #include <linux/malloc.h>
#include <linux/poll.h> #include <linux/poll.h>
#include <linux/module.h> #include <linux/module.h>
...@@ -46,12 +46,11 @@ ...@@ -46,12 +46,11 @@
#endif #endif
struct mousedev { struct mousedev {
char name[32];
int used; int used;
struct input_handle handle; int minor;
struct miscdevice misc;
wait_queue_head_t wait; wait_queue_head_t wait;
struct mousedev_list *list; struct mousedev_list *list;
devfs_handle_t devfs;
}; };
struct mousedev_list { struct mousedev_list {
...@@ -71,12 +70,7 @@ struct mousedev_list { ...@@ -71,12 +70,7 @@ struct mousedev_list {
static unsigned char mousedev_genius_seq[] = { 0xe8, 3, 0xe6, 0xe6, 0xe6 }; static unsigned char mousedev_genius_seq[] = { 0xe8, 3, 0xe6, 0xe6, 0xe6 };
static unsigned char mousedev_imps_seq[] = { 0xf3, 200, 0xf3, 100, 0xf3, 80 }; static unsigned char mousedev_imps_seq[] = { 0xf3, 200, 0xf3, 100, 0xf3, 80 };
#ifdef CONFIG_INPUT_MOUSEDEV_MIX static struct mousedev *mousedev_table[BITS_PER_LONG];
static struct mousedev mousedev_single;
#else
static unsigned long mousedev_miscbits = 0;
static struct mousedev *mousedev_base[BITS_PER_LONG];
#endif
static void mousedev_event(struct input_handle *handle, unsigned int type, unsigned int code, int value) static void mousedev_event(struct input_handle *handle, unsigned int type, unsigned int code, int value)
{ {
...@@ -163,13 +157,11 @@ static int mousedev_release(struct inode * inode, struct file * file) ...@@ -163,13 +157,11 @@ static int mousedev_release(struct inode * inode, struct file * file)
listptr = &((*listptr)->next); listptr = &((*listptr)->next);
*listptr = (*listptr)->next; *listptr = (*listptr)->next;
#ifndef CONFIG_INPUT_MOUSEDEV_MIX
if (!--list->mousedev->used) { if (!--list->mousedev->used) {
clear_bit(list->mousedev->misc.minor - MOUSEDEV_MINOR_BASE, &mousedev_miscbits); input_unregister_minor(list->mousedev->devfs);
misc_deregister(&list->mousedev->misc); mousedev_table[list->mousedev->minor] = NULL;
kfree(list->mousedev); kfree(list->mousedev);
} }
#endif
kfree(list); kfree(list);
...@@ -180,29 +172,20 @@ static int mousedev_release(struct inode * inode, struct file * file) ...@@ -180,29 +172,20 @@ static int mousedev_release(struct inode * inode, struct file * file)
static int mousedev_open(struct inode * inode, struct file * file) static int mousedev_open(struct inode * inode, struct file * file)
{ {
struct mousedev_list *list; struct mousedev_list *list;
#ifndef CONFIG_INPUT_MOUSEDEV_MIX
int i = MINOR(inode->i_rdev) - MOUSEDEV_MINOR_BASE; int i = MINOR(inode->i_rdev) - MOUSEDEV_MINOR_BASE;
if (i > BITS_PER_LONG || !test_bit(i, &mousedev_miscbits))
if (i > MOUSEDEV_MINORS || !mousedev_table[i])
return -ENODEV; return -ENODEV;
#endif
if (!(list = kmalloc(sizeof(struct mousedev_list), GFP_KERNEL))) if (!(list = kmalloc(sizeof(struct mousedev_list), GFP_KERNEL)))
return -ENOMEM; return -ENOMEM;
memset(list, 0, sizeof(struct mousedev_list)); memset(list, 0, sizeof(struct mousedev_list));
list->mousedev = mousedev_table[i];
#ifdef CONFIG_INPUT_MOUSEDEV_MIX list->next = mousedev_table[i]->list;
list->mousedev = &mousedev_single; mousedev_table[i]->list = list;
list->next = mousedev_single.list;
mousedev_single.list = list;
#else
list->mousedev = mousedev_base[i];
list->next = mousedev_base[i]->list;
mousedev_base[i]->list = list;
list->mousedev->used++; list->mousedev->used++;
#endif
file->private_data = list; file->private_data = list;
...@@ -359,6 +342,9 @@ struct file_operations mousedev_fops = { ...@@ -359,6 +342,9 @@ struct file_operations mousedev_fops = {
static int mousedev_connect(struct input_handler *handler, struct input_dev *dev) static int mousedev_connect(struct input_handler *handler, struct input_dev *dev)
{ {
struct mousedev *mousedev;
struct input_handle *handle;
int minor = 0;
if (!test_bit(EV_KEY, dev->evbit) || if (!test_bit(EV_KEY, dev->evbit) ||
(!test_bit(BTN_LEFT, dev->keybit) && !test_bit(BTN_TOUCH, dev->keybit))) (!test_bit(BTN_LEFT, dev->keybit) && !test_bit(BTN_TOUCH, dev->keybit)))
...@@ -367,109 +353,77 @@ static int mousedev_connect(struct input_handler *handler, struct input_dev *dev ...@@ -367,109 +353,77 @@ static int mousedev_connect(struct input_handler *handler, struct input_dev *dev
if ((!test_bit(EV_REL, dev->evbit) || !test_bit(REL_X, dev->relbit)) && if ((!test_bit(EV_REL, dev->evbit) || !test_bit(REL_X, dev->relbit)) &&
(!test_bit(EV_ABS, dev->evbit) || !test_bit(ABS_X, dev->absbit))) (!test_bit(EV_ABS, dev->evbit) || !test_bit(ABS_X, dev->absbit)))
return -1; return -1;
#ifdef CONFIG_INPUT_MOUSEDEV_MIX
{
struct input_handle *handle;
if (!(handle = kmalloc(sizeof(struct input_handle), GFP_KERNEL)))
return -1;
memset(handle, 0, sizeof(struct input_handle)); #ifndef CONFIG_INPUT_MOUSEDEV_MIX
for (minor = 0; minor < MOUSEDEV_MINORS && mousedev_table[minor]; minor++);
handle->dev = dev; if (mousedev_table[minor]) {
handle->handler = handler; printk(KERN_ERR "mousedev: no more free mousedev devices\n");
handle->private = &mousedev_single; return -1;
input_open_device(handle);
printk("mousedev.c: Adding mouse: input%d\n", dev->number);
} }
#else #else
{ if (!mousedev_table[minor]) {
struct mousedev *mousedev; #endif
if (!(mousedev = kmalloc(sizeof(struct mousedev), GFP_KERNEL))) if (!(mousedev = kmalloc(sizeof(struct mousedev), GFP_KERNEL)))
return -1; return -1;
memset(mousedev, 0, sizeof(struct mousedev)); memset(mousedev, 0, sizeof(struct mousedev));
init_waitqueue_head(&mousedev->wait);
mousedev->misc.minor = ffz(mousedev_miscbits); mousedev->devfs = input_register_minor("mouse%d", minor, MOUSEDEV_MINOR_BASE);
set_bit(mousedev->misc.minor, &mousedev_miscbits);
mousedev_base[mousedev->misc.minor] = mousedev;
sprintf(mousedev->name, "mousedev%d", mousedev->misc.minor); #ifdef CONFIG_INPUT_MOUSEDEV_MIX
mousedev->misc.name = mousedev->name; } else mousedev = mousedev_table[minor];
mousedev->misc.minor += MOUSEDEV_MINOR_BASE; #endif
mousedev->misc.fops = &mousedev_fops;
mousedev->handle.dev = dev; if (!(handle = kmalloc(sizeof(struct input_handle), GFP_KERNEL))) {
mousedev->handle.handler = handler; if (!mousedev->used) kfree(mousedev);
mousedev->handle.private = mousedev; return -1;
}
memset(handle, 0, sizeof(struct input_handle));
init_waitqueue_head(&mousedev->wait); mousedev->used++;
mousedev->minor = minor;
mousedev_table[minor] = mousedev;
mousedev->used = 1; handle->dev = dev;
handle->handler = handler;
handle->private = mousedev;
misc_register(&mousedev->misc); input_open_device(handle);
input_open_device(&mousedev->handle);
printk("%s: PS/2 mouse device for input%d on misc%d\n", printk("mouse%d: PS/2 mouse device for input%d\n", minor, dev->number);
mousedev->name, dev->number, mousedev->misc.minor);
}
#endif
return 0; return 0;
} }
static void mousedev_disconnect(struct input_handle *handle) static void mousedev_disconnect(struct input_handle *handle)
{ {
#ifdef CONFIG_INPUT_MOUSEDEV_MIX
printk("mousedev.c: Removing mouse: input%d\n", handle->dev->number);
input_close_device(handle);
kfree(handle);
#else
struct mousedev *mousedev = handle->private; struct mousedev *mousedev = handle->private;
input_close_device(handle); input_close_device(handle);
kfree(handle);
if (!--mousedev->used) { if (!--mousedev->used) {
clear_bit(mousedev->misc.minor - MOUSEDEV_MINOR_BASE, &mousedev_miscbits); input_unregister_minor(mousedev->devfs);
misc_deregister(&mousedev->misc); mousedev_table[mousedev->minor] = NULL;
kfree(mousedev); kfree(mousedev);
} }
#endif
} }
static struct input_handler mousedev_handler = { static struct input_handler mousedev_handler = {
event: mousedev_event, event: mousedev_event,
connect: mousedev_connect, connect: mousedev_connect,
disconnect: mousedev_disconnect, disconnect: mousedev_disconnect,
fops: &mousedev_fops,
minor: MOUSEDEV_MINOR_BASE,
}; };
static int __init mousedev_init(void) static int __init mousedev_init(void)
{ {
input_register_handler(&mousedev_handler); input_register_handler(&mousedev_handler);
#ifdef CONFIG_INPUT_MOUSEDEV_MIX
memset(&mousedev_single, 0, sizeof(struct mousedev));
init_waitqueue_head(&mousedev_single.wait);
mousedev_single.misc.minor = MOUSEDEV_MINOR_BASE;
mousedev_single.misc.name = "mousedev";
mousedev_single.misc.fops = &mousedev_fops;
misc_register(&mousedev_single.misc);
printk("mousedev: PS/2 mouse device on misc%d\n", mousedev_single.misc.minor);
#endif
return 0; return 0;
} }
static void __exit mousedev_exit(void) static void __exit mousedev_exit(void)
{ {
#ifdef CONFIG_INPUT_MOUSEDEV_MIX
misc_deregister(&mousedev_single.misc);
#endif
input_unregister_handler(&mousedev_handler); input_unregister_handler(&mousedev_handler);
} }
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#ifndef __LINUX_USB_SERIAL_H #ifndef __LINUX_USB_SERIAL_H
#define __LINUX_USB_SERIAL_H #define __LINUX_USB_SERIAL_H
#include <linux/config.h>
#define SERIAL_TTY_MAJOR 188 /* Nice legal number now */ #define SERIAL_TTY_MAJOR 188 /* Nice legal number now */
#define SERIAL_TTY_MINORS 16 /* Actually we are allowed 255, but this is good for now */ #define SERIAL_TTY_MINORS 16 /* Actually we are allowed 255, but this is good for now */
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
* I just want these out of the way where they aren't in your * I just want these out of the way where they aren't in your
* face, but so that you can still use them.. * face, but so that you can still use them..
*/ */
#include <linux/config.h>
#include <linux/version.h> #include <linux/version.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/mm.h> #include <linux/mm.h>
......
...@@ -1475,7 +1475,7 @@ static int rh_unlink_urb (urb_t * urb) ...@@ -1475,7 +1475,7 @@ static int rh_unlink_urb (urb_t * urb)
/* reset the HC not the BUS */ /* reset the HC not the BUS */
static void hc_reset (ohci_t * ohci) static int hc_reset (ohci_t * ohci)
{ {
int timeout = 30; int timeout = 30;
int smm_timeout = 50; /* 0,5 sec */ int smm_timeout = 50; /* 0,5 sec */
...@@ -1487,7 +1487,7 @@ static void hc_reset (ohci_t * ohci) ...@@ -1487,7 +1487,7 @@ static void hc_reset (ohci_t * ohci)
wait_ms (10); wait_ms (10);
if (--smm_timeout == 0) { if (--smm_timeout == 0) {
err("USB HC TakeOver failed!"); err("USB HC TakeOver failed!");
break; return -1;
} }
} }
} }
...@@ -1501,11 +1501,12 @@ static void hc_reset (ohci_t * ohci) ...@@ -1501,11 +1501,12 @@ static void hc_reset (ohci_t * ohci)
while ((readl (&ohci->regs->cmdstatus) & 0x01) != 0) { /* 10us Reset */ while ((readl (&ohci->regs->cmdstatus) & 0x01) != 0) { /* 10us Reset */
if (--timeout == 0) { if (--timeout == 0) {
err("USB HC reset timed out!"); err("USB HC reset timed out!");
return; return -1;
} }
udelay (1); udelay (1);
} }
ohci->disabled = 0; ohci->disabled = 0;
return 0;
} }
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
...@@ -1707,7 +1708,11 @@ static int hc_found_ohci (struct pci_dev *dev, int irq, void * mem_base) ...@@ -1707,7 +1708,11 @@ static int hc_found_ohci (struct pci_dev *dev, int irq, void * mem_base)
INIT_LIST_HEAD (&ohci->ohci_hcd_list); INIT_LIST_HEAD (&ohci->ohci_hcd_list);
list_add (&ohci->ohci_hcd_list, &ohci_hcd_list); list_add (&ohci->ohci_hcd_list, &ohci_hcd_list);
hc_reset (ohci); if (hc_reset (ohci) < 0) {
hc_release_ohci (ohci);
return -ENODEV;
}
writel (ohci->hc_control = OHCI_USB_RESET, &ohci->regs->control); writel (ohci->hc_control = OHCI_USB_RESET, &ohci->regs->control);
wait_ms (10); wait_ms (10);
usb_register_bus (ohci->bus); usb_register_bus (ohci->bus);
......
...@@ -686,11 +686,12 @@ void iput(struct inode *inode) ...@@ -686,11 +686,12 @@ void iput(struct inode *inode)
inode->i_state|=I_FREEING; inode->i_state|=I_FREEING;
spin_unlock(&inode_lock); spin_unlock(&inode_lock);
if (inode->i_data.nrpages)
truncate_inode_pages(&inode->i_data, 0);
destroy = 1; destroy = 1;
if (op && op->delete_inode) { if (op && op->delete_inode) {
void (*delete)(struct inode *) = op->delete_inode; void (*delete)(struct inode *) = op->delete_inode;
if (inode->i_data.nrpages)
truncate_inode_pages(&inode->i_data, 0);
/* s_op->delete_inode internally recalls clear_inode() */ /* s_op->delete_inode internally recalls clear_inode() */
delete(inode); delete(inode);
} else } else
......
/* /*
* $Id: io.h,v 1.25 2000/01/22 07:35:46 zaitcev Exp $ * $Id: io.h,v 1.26 2000/03/30 01:43:26 davem Exp $
*/ */
#ifndef __SPARC_IO_H #ifndef __SPARC_IO_H
#define __SPARC_IO_H #define __SPARC_IO_H
...@@ -49,6 +49,31 @@ extern __inline__ void writel(unsigned int b, unsigned long addr) { ...@@ -49,6 +49,31 @@ extern __inline__ void writel(unsigned int b, unsigned long addr) {
*(volatile unsigned long*)addr = flip_dword(b); *(volatile unsigned long*)addr = flip_dword(b);
} }
/* Now the 'raw' versions. */
extern __inline__ unsigned long __raw_readb(unsigned long addr) {
return *(volatile unsigned char*)addr;
}
extern __inline__ unsigned long __raw_readw(unsigned long addr) {
return *(volatile unsigned short*)addr;
}
extern __inline__ unsigned long __raw_readl(unsigned long addr) {
return *(volatile unsigned long*)addr;
}
extern __inline__ void __raw_writeb(unsigned char b, unsigned long addr) {
*(volatile unsigned char*)addr = b;
}
extern __inline__ void __raw_writew(unsigned short b, unsigned long addr) {
*(volatile unsigned short*)addr = b;
}
extern __inline__ void __raw_writel(unsigned int b, unsigned long addr) {
*(volatile unsigned long*)addr = b;
}
/* /*
* I/O space operations * I/O space operations
* *
......
/* $Id: page.h,v 1.51 2000/03/15 07:19:25 davem Exp $ /* $Id: page.h,v 1.52 2000/03/28 06:07:25 anton Exp $
* page.h: Various defines and such for MMU operations on the Sparc for * page.h: Various defines and such for MMU operations on the Sparc for
* the Linux kernel. * the Linux kernel.
* *
...@@ -32,11 +32,20 @@ ...@@ -32,11 +32,20 @@
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
#define BUG() do { printk("kernel BUG at %s:%d!\n", __FILE__, __LINE__); *(int *)0=0; } while (0) #if (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8)
/* We need the mb()'s so we don't trigger a compiler bug - Anton */
#define PAGE_BUG(page) do { \ #define BUG() do { \
BUG(); \ mb(); \
__builtin_trap(); \
mb(); \
} while(0)
#else
#define BUG() do { \
printk("kernel BUG at %s:%d!\n", __FILE__, __LINE__); *(int *)0=0; \
} while (0) } while (0)
#endif
#define PAGE_BUG(page) BUG()
#define clear_page(page) memset((void *)(page), 0, PAGE_SIZE) #define clear_page(page) memset((void *)(page), 0, PAGE_SIZE)
#define copy_page(to,from) memcpy((void *)(to), (void *)(from), PAGE_SIZE) #define copy_page(to,from) memcpy((void *)(to), (void *)(from), PAGE_SIZE)
......
/* $Id: pgtable.h,v 1.93 2000/03/21 01:04:53 anton Exp $ */ /* $Id: pgtable.h,v 1.94 2000/03/28 06:07:25 anton Exp $ */
#ifndef _SPARC_PGTABLE_H #ifndef _SPARC_PGTABLE_H
#define _SPARC_PGTABLE_H #define _SPARC_PGTABLE_H
...@@ -96,12 +96,18 @@ BTFIXUPDEF_SIMM13(user_ptrs_per_pgd) ...@@ -96,12 +96,18 @@ BTFIXUPDEF_SIMM13(user_ptrs_per_pgd)
#define VMALLOC_START (0xfe300000) #define VMALLOC_START (0xfe300000)
#define VMALLOC_END ~0x0UL #define VMALLOC_END ~0x0UL
#if (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8)
#define pte_ERROR(e) __builtin_trap()
#define pmd_ERROR(e) __builtin_trap()
#define pgd_ERROR(e) __builtin_trap()
#else
#define pte_ERROR(e) \ #define pte_ERROR(e) \
printk("%s:%d: bad pte %08lx.\n", __FILE__, __LINE__, pte_val(e)) printk("%s:%d: bad pte %08lx.\n", __FILE__, __LINE__, pte_val(e))
#define pmd_ERROR(e) \ #define pmd_ERROR(e) \
printk("%s:%d: bad pmd %08lx.\n", __FILE__, __LINE__, pmd_val(e)) printk("%s:%d: bad pmd %08lx.\n", __FILE__, __LINE__, pmd_val(e))
#define pgd_ERROR(e) \ #define pgd_ERROR(e) \
printk("%s:%d: bad pgd %08lx.\n", __FILE__, __LINE__, pgd_val(e)) printk("%s:%d: bad pgd %08lx.\n", __FILE__, __LINE__, pgd_val(e))
#endif
BTFIXUPDEF_INT(page_none) BTFIXUPDEF_INT(page_none)
BTFIXUPDEF_INT(page_shared) BTFIXUPDEF_INT(page_shared)
......
...@@ -268,8 +268,8 @@ ...@@ -268,8 +268,8 @@
#define ASIZ_thread_fpdepth 0x00000001 #define ASIZ_thread_fpdepth 0x00000001
#define AOFF_thread_fault_code 0x0000000e #define AOFF_thread_fault_code 0x0000000e
#define ASIZ_thread_fault_code 0x00000001 #define ASIZ_thread_fault_code 0x00000001
#define AOFF_thread___pad1 0x0000000f #define AOFF_thread_use_blkcommit 0x0000000f
#define ASIZ_thread___pad1 0x00000001 #define ASIZ_thread_use_blkcommit 0x00000001
#define AOFF_thread_fault_address 0x00000010 #define AOFF_thread_fault_address 0x00000010
#define ASIZ_thread_fault_address 0x00000008 #define ASIZ_thread_fault_address 0x00000008
#define AOFF_thread_fpsaved 0x00000018 #define AOFF_thread_fpsaved 0x00000018
...@@ -562,8 +562,8 @@ ...@@ -562,8 +562,8 @@
#define ASIZ_thread_fpdepth 0x00000001 #define ASIZ_thread_fpdepth 0x00000001
#define AOFF_thread_fault_code 0x0000000e #define AOFF_thread_fault_code 0x0000000e
#define ASIZ_thread_fault_code 0x00000001 #define ASIZ_thread_fault_code 0x00000001
#define AOFF_thread___pad1 0x0000000f #define AOFF_thread_use_blkcommit 0x0000000f
#define ASIZ_thread___pad1 0x00000001 #define ASIZ_thread_use_blkcommit 0x00000001
#define AOFF_thread_fault_address 0x00000010 #define AOFF_thread_fault_address 0x00000010
#define ASIZ_thread_fault_address 0x00000008 #define ASIZ_thread_fault_address 0x00000008
#define AOFF_thread_fpsaved 0x00000018 #define AOFF_thread_fpsaved 0x00000018
...@@ -854,8 +854,8 @@ ...@@ -854,8 +854,8 @@
#define ASIZ_thread_fpdepth 0x00000001 #define ASIZ_thread_fpdepth 0x00000001
#define AOFF_thread_fault_code 0x0000000e #define AOFF_thread_fault_code 0x0000000e
#define ASIZ_thread_fault_code 0x00000001 #define ASIZ_thread_fault_code 0x00000001
#define AOFF_thread___pad1 0x0000000f #define AOFF_thread_use_blkcommit 0x0000000f
#define ASIZ_thread___pad1 0x00000001 #define ASIZ_thread_use_blkcommit 0x00000001
#define AOFF_thread_fault_address 0x00000010 #define AOFF_thread_fault_address 0x00000010
#define ASIZ_thread_fault_address 0x00000008 #define ASIZ_thread_fault_address 0x00000008
#define AOFF_thread_fpsaved 0x00000018 #define AOFF_thread_fpsaved 0x00000018
......
/* $Id: bitops.h,v 1.27 2000/02/09 03:28:33 davem Exp $ /* $Id: bitops.h,v 1.28 2000/03/27 10:38:56 davem Exp $
* bitops.h: Bit string operations on the V9. * bitops.h: Bit string operations on the V9.
* *
* Copyright 1996, 1997 David S. Miller (davem@caip.rutgers.edu) * Copyright 1996, 1997 David S. Miller (davem@caip.rutgers.edu)
...@@ -8,132 +8,17 @@ ...@@ -8,132 +8,17 @@
#define _SPARC64_BITOPS_H #define _SPARC64_BITOPS_H
#include <asm/byteorder.h> #include <asm/byteorder.h>
#include <asm/asi.h> /* For the little endian spaces. */
/* These can all be exported to userland, because the atomic extern long __test_and_set_bit(unsigned long nr, void *addr);
* primitives used are not privileged. extern long __test_and_clear_bit(unsigned long nr, void *addr);
*/ extern long __test_and_change_bit(unsigned long nr, void *addr);
/* Set bit 'nr' in 64-bit quantity at address 'addr' where bit '0'
* is in the highest of the eight bytes and bit '63' is the high bit
* within the first byte. Sparc is BIG-Endian. Unless noted otherwise
* all bit-ops return 0 if bit was previously clear and != 0 otherwise.
*/
extern __inline__ int test_and_set_bit(unsigned long nr, void *addr) #define test_and_set_bit(nr,addr) (__test_and_set_bit(nr,addr)!=0)
{ #define test_and_clear_bit(nr,addr) (__test_and_clear_bit(nr,addr)!=0)
unsigned long * m = ((unsigned long *) addr) + (nr >> 6); #define test_and_change_bit(nr,addr) (__test_and_change_bit(nr,addr)!=0)
unsigned long oldbit; #define set_bit(nr,addr) ((void)__test_and_set_bit(nr,addr))
#define clear_bit(nr,addr) ((void)__test_and_clear_bit(nr,addr))
__asm__ __volatile__(" #define change_bit(nr,addr) ((void)__test_and_change_bit(nr,addr))
1: ldx [%2], %%g7
andcc %%g7, %1, %0
bne,pn %%xcc, 2f
xor %%g7, %1, %%g5
casx [%2], %%g7, %%g5
cmp %%g7, %%g5
bne,pn %%xcc, 1b
nop
2:
" : "=&r" (oldbit)
: "HIr" (1UL << (nr & 63)), "r" (m)
: "g5", "g7", "cc", "memory");
return oldbit != 0;
}
extern __inline__ void set_bit(unsigned long nr, void *addr)
{
unsigned long * m = ((unsigned long *) addr) + (nr >> 6);
__asm__ __volatile__("
1: ldx [%1], %%g7
andcc %%g7, %0, %%g0
bne,pn %%xcc, 2f
xor %%g7, %0, %%g5
casx [%1], %%g7, %%g5
cmp %%g7, %%g5
bne,pn %%xcc, 1b
nop
2:
" : /* no outputs */
: "HIr" (1UL << (nr & 63)), "r" (m)
: "g5", "g7", "cc", "memory");
}
extern __inline__ int test_and_clear_bit(unsigned long nr, void *addr)
{
unsigned long * m = ((unsigned long *) addr) + (nr >> 6);
unsigned long oldbit;
__asm__ __volatile__("
1: ldx [%2], %%g7
andcc %%g7, %1, %0
be,pn %%xcc, 2f
xor %%g7, %1, %%g5
casx [%2], %%g7, %%g5
cmp %%g7, %%g5
bne,pn %%xcc, 1b
nop
2:
" : "=&r" (oldbit)
: "HIr" (1UL << (nr & 63)), "r" (m)
: "g5", "g7", "cc", "memory");
return oldbit != 0;
}
extern __inline__ void clear_bit(unsigned long nr, void *addr)
{
unsigned long * m = ((unsigned long *) addr) + (nr >> 6);
__asm__ __volatile__("
1: ldx [%1], %%g7
andcc %%g7, %0, %%g0
be,pn %%xcc, 2f
xor %%g7, %0, %%g5
casx [%1], %%g7, %%g5
cmp %%g7, %%g5
bne,pn %%xcc, 1b
nop
2:
" : /* no outputs */
: "HIr" (1UL << (nr & 63)), "r" (m)
: "g5", "g7", "cc", "memory");
}
extern __inline__ int test_and_change_bit(unsigned long nr, void *addr)
{
unsigned long * m = ((unsigned long *) addr) + (nr >> 6);
unsigned long oldbit;
__asm__ __volatile__("
1: ldx [%2], %%g7
and %%g7, %1, %0
xor %%g7, %1, %%g5
casx [%2], %%g7, %%g5
cmp %%g7, %%g5
bne,pn %%xcc, 1b
nop
" : "=&r" (oldbit)
: "HIr" (1UL << (nr & 63)), "r" (m)
: "g5", "g7", "cc", "memory");
return oldbit != 0;
}
extern __inline__ void change_bit(unsigned long nr, void *addr)
{
unsigned long * m = ((unsigned long *) addr) + (nr >> 6);
__asm__ __volatile__("
1: ldx [%1], %%g7
xor %%g7, %0, %%g5
casx [%1], %%g7, %%g5
cmp %%g7, %%g5
bne,pn %%xcc, 1b
nop
" : /* no outputs */
: "HIr" (1UL << (nr & 63)), "r" (m)
: "g5", "g7", "cc", "memory");
}
extern __inline__ int test_bit(int nr, __const__ void *addr) extern __inline__ int test_bit(int nr, __const__ void *addr)
{ {
...@@ -280,50 +165,13 @@ extern __inline__ unsigned long find_next_zero_bit(void *addr, unsigned long siz ...@@ -280,50 +165,13 @@ extern __inline__ unsigned long find_next_zero_bit(void *addr, unsigned long siz
#define find_first_zero_bit(addr, size) \ #define find_first_zero_bit(addr, size) \
find_next_zero_bit((addr), (size), 0) find_next_zero_bit((addr), (size), 0)
/* Now for the ext2 filesystem bit operations and helper routines. extern long __test_and_set_le_bit(int nr, void *addr);
* Note the usage of the little endian ASI's, werd, V9 is supreme. extern long __test_and_clear_le_bit(int nr, void *addr);
*/
extern __inline__ int set_le_bit(int nr,void * addr)
{
unsigned int * m = ((unsigned int *) addr) + (nr >> 5);
unsigned long oldbit;
__asm__ __volatile__("
1: lduwa [%2] %3, %%g7
andcc %%g7, %1, %0
bne,pn %%icc, 2f
xor %%g7, %1, %%g5
casa [%2] %3, %%g7, %%g5
cmp %%g7, %%g5
bne,pn %%icc, 1b
nop
2:
" : "=&r" (oldbit)
: "HIr" (1UL << (nr & 31)), "r" (m), "i" (ASI_PL)
: "g5", "g7", "cc", "memory");
return oldbit != 0;
}
extern __inline__ int clear_le_bit(int nr, void * addr)
{
unsigned int * m = ((unsigned int *) addr) + (nr >> 5);
unsigned long oldbit;
__asm__ __volatile__(" #define test_and_set_le_bit(nr,addr) (__test_and_set_le_bit(nr,addr)!=0)
1: lduwa [%2] %3, %%g7 #define test_and_clear_le_bit(nr,addr) (__test_and_clear_le_bit(nr,addr)!=0)
andcc %%g7, %1, %0 #define set_le_bit(nr,addr) ((void)__test_and_set_le_bit(nr,addr))
be,pn %%icc, 2f #define clear_le_bit(nr,addr) ((void)__test_and_clear_le_bit(nr,addr))
xor %%g7, %1, %%g5
casa [%2] %3, %%g7, %%g5
cmp %%g7, %%g5
bne,pn %%icc, 1b
nop
2:
" : "=&r" (oldbit)
: "HIr" (1UL << (nr & 31)), "r" (m), "i" (ASI_PL)
: "g5", "g7", "cc", "memory");
return oldbit != 0;
}
extern __inline__ int test_le_bit(int nr, __const__ void * addr) extern __inline__ int test_le_bit(int nr, __const__ void * addr)
{ {
...@@ -375,8 +223,8 @@ extern __inline__ unsigned long find_next_zero_le_bit(void *addr, unsigned long ...@@ -375,8 +223,8 @@ extern __inline__ unsigned long find_next_zero_le_bit(void *addr, unsigned long
#ifdef __KERNEL__ #ifdef __KERNEL__
#define ext2_set_bit set_le_bit #define ext2_set_bit test_and_set_le_bit
#define ext2_clear_bit clear_le_bit #define ext2_clear_bit test_and_clear_le_bit
#define ext2_test_bit test_le_bit #define ext2_test_bit test_le_bit
#define ext2_find_first_zero_bit find_first_zero_le_bit #define ext2_find_first_zero_bit find_first_zero_le_bit
#define ext2_find_next_zero_bit find_next_zero_le_bit #define ext2_find_next_zero_bit find_next_zero_le_bit
......
/* $Id: io.h,v 1.33 2000/02/25 05:47:38 davem Exp $ */ /* $Id: io.h,v 1.34 2000/03/30 01:40:54 davem Exp $ */
#ifndef __SPARC64_IO_H #ifndef __SPARC64_IO_H
#define __SPARC64_IO_H #define __SPARC64_IO_H
...@@ -156,6 +156,68 @@ extern __inline__ void _writel(unsigned int l, unsigned long addr) ...@@ -156,6 +156,68 @@ extern __inline__ void _writel(unsigned int l, unsigned long addr)
#define writew(__w, __addr) (_writew((__w), (unsigned long)(__addr))) #define writew(__w, __addr) (_writew((__w), (unsigned long)(__addr)))
#define writel(__l, __addr) (_writel((__l), (unsigned long)(__addr))) #define writel(__l, __addr) (_writel((__l), (unsigned long)(__addr)))
/* Now versions without byte-swapping. */
extern __inline__ unsigned int _raw_readb(unsigned long addr)
{
unsigned int ret;
__asm__ __volatile__("lduba\t[%1] %2, %0\t/* pci_raw_readb */"
: "=r" (ret)
: "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
return ret;
}
extern __inline__ unsigned int _raw_readw(unsigned long addr)
{
unsigned int ret;
__asm__ __volatile__("lduha\t[%1] %2, %0\t/* pci_raw_readw */"
: "=r" (ret)
: "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
return ret;
}
extern __inline__ unsigned int _raw_readl(unsigned long addr)
{
unsigned int ret;
__asm__ __volatile__("lduwa\t[%1] %2, %0\t/* pci_raw_readl */"
: "=r" (ret)
: "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
return ret;
}
extern __inline__ void _raw_writeb(unsigned char b, unsigned long addr)
{
__asm__ __volatile__("stba\t%r0, [%1] %2\t/* pci_raw_writeb */"
: /* no outputs */
: "Jr" (b), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
}
extern __inline__ void _raw_writew(unsigned short w, unsigned long addr)
{
__asm__ __volatile__("stha\t%r0, [%1] %2\t/* pci_raw_writew */"
: /* no outputs */
: "Jr" (w), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
}
extern __inline__ void _raw_writel(unsigned int l, unsigned long addr)
{
__asm__ __volatile__("stwa\t%r0, [%1] %2\t/* pci_raw_writel */"
: /* no outputs */
: "Jr" (l), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
}
#define __raw_readb(__addr) (_raw_readb((unsigned long)(__addr)))
#define __raw_readw(__addr) (_raw_readw((unsigned long)(__addr)))
#define __raw_readl(__addr) (_raw_readl((unsigned long)(__addr)))
#define __raw_writeb(__b, __addr) (_raw_writeb((__b), (unsigned long)(__addr)))
#define __raw_writew(__w, __addr) (_raw_writew((__w), (unsigned long)(__addr)))
#define __raw_writel(__l, __addr) (_raw_writel((__l), (unsigned long)(__addr)))
/* Valid I/O Space regions are anywhere, because each PCI bus supported /* Valid I/O Space regions are anywhere, because each PCI bus supported
* can live in an arbitrary area of the physical address range. * can live in an arbitrary area of the physical address range.
*/ */
......
...@@ -70,27 +70,11 @@ extern void smp_flush_tlb_page(struct mm_struct *mm, unsigned long page); ...@@ -70,27 +70,11 @@ extern void smp_flush_tlb_page(struct mm_struct *mm, unsigned long page);
#define flush_cache_all() smp_flush_cache_all() #define flush_cache_all() smp_flush_cache_all()
#define flush_tlb_all() smp_flush_tlb_all() #define flush_tlb_all() smp_flush_tlb_all()
#define flush_tlb_mm(mm) smp_flush_tlb_mm(mm)
extern __inline__ void flush_tlb_mm(struct mm_struct *mm) #define flush_tlb_range(mm, start, end) \
{ smp_flush_tlb_range(mm, start, end)
if (CTX_VALID(mm->context)) #define flush_tlb_page(vma, page) \
smp_flush_tlb_mm(mm); smp_flush_tlb_page((vma)->vm_mm, page)
}
extern __inline__ void flush_tlb_range(struct mm_struct *mm, unsigned long start,
unsigned long end)
{
if (CTX_VALID(mm->context))
smp_flush_tlb_range(mm, start, end);
}
extern __inline__ void flush_tlb_page(struct vm_area_struct *vma, unsigned long page)
{
struct mm_struct *mm = vma->vm_mm;
if (CTX_VALID(mm->context))
smp_flush_tlb_page(mm, page);
}
#endif /* ! __SMP__ */ #endif /* ! __SMP__ */
......
/* $Id: pgtable.h,v 1.123 2000/03/26 09:13:53 davem Exp $ /* $Id: pgtable.h,v 1.124 2000/03/27 10:38:56 davem Exp $
* pgtable.h: SpitFire page table operations. * pgtable.h: SpitFire page table operations.
* *
* Copyright 1996,1997 David S. Miller (davem@caip.rutgers.edu) * Copyright 1996,1997 David S. Miller (davem@caip.rutgers.edu)
...@@ -214,26 +214,9 @@ extern inline pte_t pte_modify(pte_t orig_pte, pgprot_t new_prot) ...@@ -214,26 +214,9 @@ extern inline pte_t pte_modify(pte_t orig_pte, pgprot_t new_prot)
#define pte_page(x) (mem_map+pte_pagenr(x)) #define pte_page(x) (mem_map+pte_pagenr(x))
/* Be very careful when you change these three, they are delicate. */ /* Be very careful when you change these three, they are delicate. */
static __inline__ pte_t pte_mkyoung(pte_t _pte) #define pte_mkyoung(pte) (__pte(pte_val(pte) | _PAGE_ACCESSED | _PAGE_R))
{ if(pte_val(_pte) & _PAGE_READ) #define pte_mkwrite(pte) (__pte(pte_val(pte) | _PAGE_WRITE))
return __pte(pte_val(_pte)|(_PAGE_ACCESSED|_PAGE_R)); #define pte_mkdirty(pte) (__pte(pte_val(pte) | _PAGE_MODIFIED | _PAGE_W))
else
return __pte(pte_val(_pte)|(_PAGE_ACCESSED));
}
static __inline__ pte_t pte_mkwrite(pte_t _pte)
{ if(pte_val(_pte) & _PAGE_MODIFIED)
return __pte(pte_val(_pte)|(_PAGE_WRITE|_PAGE_W));
else
return __pte(pte_val(_pte)|(_PAGE_WRITE));
}
static __inline__ pte_t pte_mkdirty(pte_t _pte)
{ if(pte_val(_pte) & _PAGE_WRITE)
return __pte(pte_val(_pte)|(_PAGE_MODIFIED|_PAGE_W));
else
return __pte(pte_val(_pte)|(_PAGE_MODIFIED));
}
/* to find an entry in a page-table-directory. */ /* to find an entry in a page-table-directory. */
#define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD)) #define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD))
...@@ -256,51 +239,7 @@ extern pgd_t swapper_pg_dir[1]; ...@@ -256,51 +239,7 @@ extern pgd_t swapper_pg_dir[1];
#define mmu_lockarea(vaddr, len) (vaddr) #define mmu_lockarea(vaddr, len) (vaddr)
#define mmu_unlockarea(vaddr, len) do { } while(0) #define mmu_unlockarea(vaddr, len) do { } while(0)
/* There used to be some funny code here which tried to guess which extern void update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t pte);
* TLB wanted the mapping, that wasn't accurate enough to justify it's
* existance. Instead we now have each TLB miss handler record a
* distinct code in the thread struct.
*
* What we do need to handle here is prevent I-cache corruption. The
* deal is that the I-cache snoops stores from other CPUs and all DMA
* activity, however stores from the local processor are not snooped.
* The dynamic linker and our signal handler mechanism take care of
* the cases where they write into instruction space, but when a page
* is copied in the kernel and then executed in user-space is not handled
* right. This leads to corruptions if things are "just right", consider
* the following scenerio:
* 1) Process 1 frees up a page that was used for the PLT of libc in
* it's address space.
* 2) Process 2 writes into a page in the PLT of libc for the first
* time. do_wp_page() copies the page locally, the local I-cache of
* the processor does not notice the writes during the page copy.
* The new page used just so happens to be the one just freed in #1.
* 3) After the PLT write, later the cpu calls into an unresolved PLT
* entry, the CPU executes old instructions from process 1's PLT
* table.
* 4) Splat.
*/
extern void __flush_icache_page(unsigned long phys_page);
extern void __prefill_dtlb(unsigned long vaddr, unsigned long pteval);
extern void __prefill_itlb(unsigned long vaddr, unsigned long pteval);
#define update_mmu_cache(__vma, __address, _pte) \
do { \
unsigned short __flags = ((__vma)->vm_flags); \
unsigned long pteval = pte_val(_pte); \
if ((__flags & VM_EXEC) != 0 && ((__vma)->vm_file != NULL) && \
((pteval & (_PAGE_PRESENT | _PAGE_WRITE | _PAGE_MODIFIED)) == \
(_PAGE_PRESENT | _PAGE_WRITE | _PAGE_MODIFIED))) \
__flush_icache_page(pte_pagenr(_pte) << PAGE_SHIFT); \
if ((__vma)->vm_mm == current->mm && \
(__flags = current->thread.fault_code) != 0) { \
unsigned long tag = (__address & PAGE_MASK); \
tag |= CTX_HWBITS(current->mm->context); \
if (__flags & FAULT_CODE_DTLB) \
__prefill_dtlb(tag, pteval); \
else \
__prefill_itlb(tag, pteval); \
} \
} while(0)
#define flush_icache_page(vma, pg) do { } while(0) #define flush_icache_page(vma, pg) do { } while(0)
......
/* $Id: processor.h,v 1.62 2000/03/26 09:13:53 davem Exp $ /* $Id: processor.h,v 1.63 2000/03/27 10:38:57 davem Exp $
* include/asm-sparc64/processor.h * include/asm-sparc64/processor.h
* *
* Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
...@@ -51,7 +51,7 @@ struct thread_struct { ...@@ -51,7 +51,7 @@ struct thread_struct {
unsigned long ksp __attribute__ ((aligned(16))); unsigned long ksp __attribute__ ((aligned(16)));
unsigned char wstate, cwp, flags; unsigned char wstate, cwp, flags;
mm_segment_t current_ds; mm_segment_t current_ds;
unsigned char w_saved, fpdepth, fault_code, __pad1; unsigned char w_saved, fpdepth, fault_code, use_blkcommit;
unsigned long fault_address; unsigned long fault_address;
unsigned char fpsaved[7]; unsigned char fpsaved[7];
unsigned char __pad2; unsigned char __pad2;
...@@ -91,7 +91,7 @@ struct thread_struct { ...@@ -91,7 +91,7 @@ struct thread_struct {
#define INIT_THREAD { \ #define INIT_THREAD { \
/* ksp, wstate, cwp, flags, current_ds, */ \ /* ksp, wstate, cwp, flags, current_ds, */ \
0, 0, 0, 0, KERNEL_DS, \ 0, 0, 0, 0, KERNEL_DS, \
/* w_saved, fpdepth, fault_code, __pad1, */ \ /* w_saved, fpdepth, fault_code, use_blkcommit, */ \
0, 0, 0, 0, \ 0, 0, 0, 0, \
/* fault_address, fpsaved, __pad2, kregs, */ \ /* fault_address, fpsaved, __pad2, kregs, */ \
0, { 0 }, 0, 0, \ 0, { 0 }, 0, 0, \
......
/* $Id: system.h,v 1.56 2000/03/06 22:33:45 davem Exp $ */ /* $Id: system.h,v 1.57 2000/03/27 10:38:57 davem Exp $ */
#ifndef __SPARC64_SYSTEM_H #ifndef __SPARC64_SYSTEM_H
#define __SPARC64_SYSTEM_H #define __SPARC64_SYSTEM_H
...@@ -131,16 +131,8 @@ extern void __global_restore_flags(unsigned long flags); ...@@ -131,16 +131,8 @@ extern void __global_restore_flags(unsigned long flags);
extern void synchronize_user_stack(void); extern void synchronize_user_stack(void);
extern __inline__ void flushw_user(void) extern void __flushw_user(void);
{ #define flushw_user() __flushw_user()
__asm__ __volatile__("
rdpr %%otherwin, %%g1
brz,pt %%g1, 1f
mov %%o7, %%g3
call __flushw_user
clr %%g2
1:" : : : "g1", "g2", "g3");
}
#define flush_user_windows flushw_user #define flush_user_windows flushw_user
#define flush_register_windows flushw_all #define flush_register_windows flushw_all
......
...@@ -383,6 +383,7 @@ struct input_event { ...@@ -383,6 +383,7 @@ struct input_event {
*/ */
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/devfs_fs_kernel.h>
#define NBITS(x) ((((x)-1)/BITS_PER_LONG)+1) #define NBITS(x) ((((x)-1)/BITS_PER_LONG)+1)
#define BIT(x) (1<<((x)%BITS_PER_LONG)) #define BIT(x) (1<<((x)%BITS_PER_LONG))
...@@ -433,8 +434,10 @@ struct input_handler { ...@@ -433,8 +434,10 @@ struct input_handler {
int (*connect)(struct input_handler *handler, struct input_dev *dev); int (*connect)(struct input_handler *handler, struct input_dev *dev);
void (*disconnect)(struct input_handle *handle); void (*disconnect)(struct input_handle *handle);
struct input_handle *handle; struct file_operations *fops;
int minor;
struct input_handle *handle;
struct input_handler *next; struct input_handler *next;
}; };
...@@ -458,6 +461,9 @@ void input_unregister_handler(struct input_handler *); ...@@ -458,6 +461,9 @@ void input_unregister_handler(struct input_handler *);
void input_open_device(struct input_handle *); void input_open_device(struct input_handle *);
void input_close_device(struct input_handle *); void input_close_device(struct input_handle *);
devfs_handle_t input_register_minor(char *name, int minor, int minor_base);
void input_unregister_minor(devfs_handle_t handle);
void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value); void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value);
#define input_report_key(a,b,c) input_event(a, EV_KEY, b, c) #define input_report_key(a,b,c) input_event(a, EV_KEY, b, c)
......
...@@ -163,7 +163,7 @@ typedef struct page { ...@@ -163,7 +163,7 @@ typedef struct page {
#define PG_error 1 #define PG_error 1
#define PG_referenced 2 #define PG_referenced 2
#define PG_uptodate 3 #define PG_uptodate 3
#define PG__unused_00 4 #define PG_dirty 4
#define PG_decr_after 5 #define PG_decr_after 5
#define PG_unused_01 6 #define PG_unused_01 6
#define PG__unused_02 7 #define PG__unused_02 7
...@@ -180,6 +180,8 @@ typedef struct page { ...@@ -180,6 +180,8 @@ typedef struct page {
#define Page_Uptodate(page) test_bit(PG_uptodate, &(page)->flags) #define Page_Uptodate(page) test_bit(PG_uptodate, &(page)->flags)
#define SetPageUptodate(page) set_bit(PG_uptodate, &(page)->flags) #define SetPageUptodate(page) set_bit(PG_uptodate, &(page)->flags)
#define ClearPageUptodate(page) clear_bit(PG_uptodate, &(page)->flags) #define ClearPageUptodate(page) clear_bit(PG_uptodate, &(page)->flags)
#define Page_Dirty(page) test_bit(PG_dirty, &(page)->flags)
#define SetPageDirty(page) set_bit(PG_dirty, &(page)->flags)
#define PageLocked(page) test_bit(PG_locked, &(page)->flags) #define PageLocked(page) test_bit(PG_locked, &(page)->flags)
#define LockPage(page) set_bit(PG_locked, &(page)->flags) #define LockPage(page) set_bit(PG_locked, &(page)->flags)
#define TryLockPage(page) test_and_set_bit(PG_locked, &(page)->flags) #define TryLockPage(page) test_and_set_bit(PG_locked, &(page)->flags)
...@@ -188,7 +190,7 @@ typedef struct page { ...@@ -188,7 +190,7 @@ typedef struct page {
wake_up(&page->wait); \ wake_up(&page->wait); \
} while (0) } while (0)
#define PageError(page) test_bit(PG_error, &(page)->flags) #define PageError(page) test_bit(PG_error, &(page)->flags)
#define SetPageError(page) test_and_set_bit(PG_error, &(page)->flags) #define SetPageError(page) set_bit(PG_error, &(page)->flags)
#define ClearPageError(page) clear_bit(PG_error, &(page)->flags) #define ClearPageError(page) clear_bit(PG_error, &(page)->flags)
#define PageReferenced(page) test_bit(PG_referenced, &(page)->flags) #define PageReferenced(page) test_bit(PG_referenced, &(page)->flags)
#define PageDecrAfter(page) test_bit(PG_decr_after, &(page)->flags) #define PageDecrAfter(page) test_bit(PG_decr_after, &(page)->flags)
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* This is a module which is used for queueing IPv4 packets and * This is a module which is used for queueing IPv4 packets and
* communicating with userspace via netlink. * communicating with userspace via netlink.
* *
* (C) 2000 James Morris * (C) 2000 James Morris, this code is GPL.
*/ */
#ifndef _IP_QUEUE_H #ifndef _IP_QUEUE_H
#define _IP_QUEUE_H #define _IP_QUEUE_H
...@@ -27,7 +27,7 @@ typedef struct ipq_packet_msg { ...@@ -27,7 +27,7 @@ typedef struct ipq_packet_msg {
char indev_name[IFNAMSIZ]; /* Name of incoming interface */ char indev_name[IFNAMSIZ]; /* Name of incoming interface */
char outdev_name[IFNAMSIZ]; /* Name of outgoing interface */ char outdev_name[IFNAMSIZ]; /* Name of outgoing interface */
size_t data_len; /* Length of packet data */ size_t data_len; /* Length of packet data */
/* Optional packet data follows */ unsigned char payload[0]; /* Optional packet data */
} ipq_packet_msg_t; } ipq_packet_msg_t;
/* Messages sent from userspace */ /* Messages sent from userspace */
...@@ -40,7 +40,7 @@ typedef struct ipq_verdict_msg { ...@@ -40,7 +40,7 @@ typedef struct ipq_verdict_msg {
unsigned int value; /* Verdict to hand to netfilter */ unsigned int value; /* Verdict to hand to netfilter */
unsigned long id; /* Packet ID for this verdict */ unsigned long id; /* Packet ID for this verdict */
size_t data_len; /* Length of replacement data */ size_t data_len; /* Length of replacement data */
/* Optional replacement data follows */ unsigned char payload[0]; /* Optional replacement packet */
} ipq_verdict_msg_t; } ipq_verdict_msg_t;
typedef struct ipq_peer_msg { typedef struct ipq_peer_msg {
...@@ -50,37 +50,19 @@ typedef struct ipq_peer_msg { ...@@ -50,37 +50,19 @@ typedef struct ipq_peer_msg {
} msg; } msg;
} ipq_peer_msg_t; } ipq_peer_msg_t;
/* Each queued packet has one of these states */ /* Packet delivery modes */
enum { enum {
IPQ_PS_NEW, /* Newly arrived packet */ IPQ_COPY_NONE, /* Initial mode, packets are dropped */
IPQ_PS_WAITING, /* User has been notified of packet,
we're waiting for a verdict */
IPQ_PS_VERDICT /* Packet has been assigned verdict,
waiting to be reinjected */
};
#define IPQ_PS_MAX IPQ_PS_VERDICT
/* The queue operates in one of these states */
enum {
IPQ_QS_HOLD, /* Hold all packets in queue */
IPQ_QS_COPY, /* Copy metadata and/or packets to user */
IPQ_QS_FLUSH /* Flush and drop all queue entries */
};
#define IPQ_QS_MAX IPQ_QS_FLUSH
/* Modes requested by peer */
enum {
IPQ_COPY_NONE, /* Copy nothing */
IPQ_COPY_META, /* Copy metadata */ IPQ_COPY_META, /* Copy metadata */
IPQ_COPY_PACKET /* Copy metadata + packet (range) */ IPQ_COPY_PACKET /* Copy metadata + packet (range) */
}; };
#define IPQ_COPY_MAX IPQ_COPY_PACKET #define IPQ_COPY_MAX IPQ_COPY_PACKET
/* Types of messages */ /* Types of messages */
#define IPQM_BASE 0x10 /* standard netlink messages below this */ #define IPQM_BASE 0x10 /* standard netlink messages below this */
#define IPQM_MODE (IPQM_BASE + 1) /* Mode request from peer */ #define IPQM_MODE (IPQM_BASE + 1) /* Mode request from peer */
#define IPQM_VERDICT (IPQM_BASE + 2) /* Verdict from peer */ #define IPQM_VERDICT (IPQM_BASE + 2) /* Verdict from peer */
#define IPQM_PACKET (IPQM_BASE + 3) /* Packet from kernel */ #define IPQM_PACKET (IPQM_BASE + 3) /* Packet from kernel */
#define IPQM_MAX (IPQM_BASE + 4) #define IPQM_MAX (IPQM_BASE + 4)
#endif /*_IP_QUEUE_H*/ #endif /*_IP_QUEUE_H*/
...@@ -173,6 +173,8 @@ do { \ ...@@ -173,6 +173,8 @@ do { \
#define lru_cache_del(page) \ #define lru_cache_del(page) \
do { \ do { \
if (!PageLocked(page)) \
BUG(); \
spin_lock(&pagemap_lru_lock); \ spin_lock(&pagemap_lru_lock); \
list_del(&(page)->lru); \ list_del(&(page)->lru); \
nr_lru_pages--; \ nr_lru_pages--; \
......
...@@ -263,7 +263,7 @@ struct tcp_opt { ...@@ -263,7 +263,7 @@ struct tcp_opt {
__u16 mss_cache; /* Cached effective mss, not including SACKS */ __u16 mss_cache; /* Cached effective mss, not including SACKS */
__u16 mss_clamp; /* Maximal mss, negotiated at connection setup */ __u16 mss_clamp; /* Maximal mss, negotiated at connection setup */
__u16 ext_header_len; /* Network protocol overhead (IP/IPv6 options) */ __u16 ext_header_len; /* Network protocol overhead (IP/IPv6 options) */
__u8 dup_acks; /* Consequetive duplicate acks seen from other end */ __u8 dup_acks; /* Consecutive duplicate acks seen from other end */
__u8 retransmits; __u8 retransmits;
__u8 __empty1; __u8 __empty1;
......
...@@ -250,6 +250,11 @@ int shrink_mmap(int priority, int gfp_mask, zone_t *zone) ...@@ -250,6 +250,11 @@ int shrink_mmap(int priority, int gfp_mask, zone_t *zone)
count--; count--;
dispose = &young; dispose = &young;
/* avoid unscalable SMP locking */
if (!page->buffers && page_count(page) > 1)
goto dispose_continue;
if (TryLockPage(page)) if (TryLockPage(page))
goto dispose_continue; goto dispose_continue;
...@@ -260,22 +265,11 @@ int shrink_mmap(int priority, int gfp_mask, zone_t *zone) ...@@ -260,22 +265,11 @@ int shrink_mmap(int priority, int gfp_mask, zone_t *zone)
page locked down ;). */ page locked down ;). */
spin_unlock(&pagemap_lru_lock); spin_unlock(&pagemap_lru_lock);
/* avoid unscalable SMP locking */
if (!page->buffers && page_count(page) > 1)
goto unlock_noput_continue;
/* Take the pagecache_lock spinlock held to avoid
other tasks to notice the page while we are looking at its
page count. If it's a pagecache-page we'll free it
in one atomic transaction after checking its page count. */
spin_lock(&pagecache_lock);
/* avoid freeing the page while it's locked */ /* avoid freeing the page while it's locked */
get_page(page); get_page(page);
/* Is it a buffer page? */ /* Is it a buffer page? */
if (page->buffers) { if (page->buffers) {
spin_unlock(&pagecache_lock);
if (!try_to_free_buffers(page)) if (!try_to_free_buffers(page))
goto unlock_continue; goto unlock_continue;
/* page was locked, inode can't go away under us */ /* page was locked, inode can't go away under us */
...@@ -283,9 +277,14 @@ int shrink_mmap(int priority, int gfp_mask, zone_t *zone) ...@@ -283,9 +277,14 @@ int shrink_mmap(int priority, int gfp_mask, zone_t *zone)
atomic_dec(&buffermem_pages); atomic_dec(&buffermem_pages);
goto made_buffer_progress; goto made_buffer_progress;
} }
spin_lock(&pagecache_lock);
} }
/* Take the pagecache_lock spinlock held to avoid
other tasks to notice the page while we are looking at its
page count. If it's a pagecache-page we'll free it
in one atomic transaction after checking its page count. */
spin_lock(&pagecache_lock);
/* /*
* We can't free pages unless there's just one user * We can't free pages unless there's just one user
* (count == 2 because we added one ourselves above). * (count == 2 because we added one ourselves above).
...@@ -293,12 +292,6 @@ int shrink_mmap(int priority, int gfp_mask, zone_t *zone) ...@@ -293,12 +292,6 @@ int shrink_mmap(int priority, int gfp_mask, zone_t *zone)
if (page_count(page) != 2) if (page_count(page) != 2)
goto cache_unlock_continue; goto cache_unlock_continue;
/*
* We did the page aging part.
*/
if (nr_lru_pages < freepages.min * priority)
goto cache_unlock_continue;
/* /*
* Is it a page swap page? If so, we want to * Is it a page swap page? If so, we want to
* drop it if it is no longer used, even if it * drop it if it is no longer used, even if it
...@@ -312,8 +305,7 @@ int shrink_mmap(int priority, int gfp_mask, zone_t *zone) ...@@ -312,8 +305,7 @@ int shrink_mmap(int priority, int gfp_mask, zone_t *zone)
/* is it a page-cache page? */ /* is it a page-cache page? */
if (page->mapping) { if (page->mapping) {
if (!pgcache_under_min()) if (!Page_Dirty(page) && !pgcache_under_min()) {
{
remove_page_from_inode_queue(page); remove_page_from_inode_queue(page);
remove_page_from_hash_queue(page); remove_page_from_hash_queue(page);
page->mapping = NULL; page->mapping = NULL;
...@@ -329,21 +321,12 @@ int shrink_mmap(int priority, int gfp_mask, zone_t *zone) ...@@ -329,21 +321,12 @@ int shrink_mmap(int priority, int gfp_mask, zone_t *zone)
cache_unlock_continue: cache_unlock_continue:
spin_unlock(&pagecache_lock); spin_unlock(&pagecache_lock);
unlock_continue: unlock_continue:
spin_lock(&pagemap_lru_lock);
UnlockPage(page); UnlockPage(page);
put_page(page); put_page(page);
dispose_relock_continue:
/* even if the dispose list is local, a truncate_inode_page()
may remove a page from its queue so always
synchronize with the lru lock while accesing the
page->lru field */
spin_lock(&pagemap_lru_lock);
list_add(page_lru, dispose); list_add(page_lru, dispose);
continue; continue;
unlock_noput_continue:
UnlockPage(page);
goto dispose_relock_continue;
dispose_continue: dispose_continue:
list_add(page_lru, dispose); list_add(page_lru, dispose);
} }
...@@ -1724,10 +1707,8 @@ static int msync_interval(struct vm_area_struct * vma, ...@@ -1724,10 +1707,8 @@ static int msync_interval(struct vm_area_struct * vma,
error = vma->vm_ops->sync(vma, start, end-start, flags); error = vma->vm_ops->sync(vma, start, end-start, flags);
if (!error && (flags & MS_SYNC)) { if (!error && (flags & MS_SYNC)) {
struct file * file = vma->vm_file; struct file * file = vma->vm_file;
if (file) { if (file)
struct dentry * dentry = file->f_dentry; error = file_fsync(file, file->f_dentry);
error = file_fsync(file, dentry);
}
} }
return error; return error;
} }
...@@ -2237,9 +2218,9 @@ asmlinkage long sys_mincore(unsigned long start, size_t len, ...@@ -2237,9 +2218,9 @@ asmlinkage long sys_mincore(unsigned long start, size_t len,
down(&current->mm->mmap_sem); down(&current->mm->mmap_sem);
if (start & ~PAGE_MASK) if (start & ~PAGE_CACHE_MASK)
goto out; goto out;
len = (len + ~PAGE_MASK) & PAGE_MASK; len = (len + ~PAGE_CACHE_MASK) & PAGE_CACHE_MASK;
end = start + len; end = start + len;
if (end < start) if (end < start)
goto out; goto out;
...@@ -2371,8 +2352,7 @@ static inline void remove_suid(struct inode *inode) ...@@ -2371,8 +2352,7 @@ static inline void remove_suid(struct inode *inode)
} }
/* /*
* Write to a file through the page cache. This is mainly for the * Write to a file through the page cache.
* benefit of NFS and possibly other network-based file systems.
* *
* We currently put everything into the page cache prior to writing it. * We currently put everything into the page cache prior to writing it.
* This is not a problem when writing full pages. With partial pages, * This is not a problem when writing full pages. With partial pages,
...@@ -2389,8 +2369,7 @@ static inline void remove_suid(struct inode *inode) ...@@ -2389,8 +2369,7 @@ static inline void remove_suid(struct inode *inode)
ssize_t ssize_t
generic_file_write(struct file *file,const char *buf,size_t count,loff_t *ppos) generic_file_write(struct file *file,const char *buf,size_t count,loff_t *ppos)
{ {
struct dentry *dentry = file->f_dentry; struct inode *inode = file->f_dentry->d_inode;
struct inode *inode = dentry->d_inode;
struct address_space *mapping = inode->i_mapping; struct address_space *mapping = inode->i_mapping;
unsigned long limit = current->rlim[RLIMIT_FSIZE].rlim_cur; unsigned long limit = current->rlim[RLIMIT_FSIZE].rlim_cur;
loff_t pos; loff_t pos;
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
* Authors: * Authors:
* Lennert Buytenhek <buytenh@gnu.org> * Lennert Buytenhek <buytenh@gnu.org>
* *
* $Id: br_input.c,v 1.4 2000/03/21 21:08:47 davem Exp $ * $Id: br_input.c,v 1.5 2000/03/30 01:22:23 davem Exp $
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
...@@ -94,6 +94,8 @@ static void __br_handle_frame(struct sk_buff *skb) ...@@ -94,6 +94,8 @@ static void __br_handle_frame(struct sk_buff *skb)
br_flood(br, skb, 1); br_flood(br, skb, 1);
if (!passedup) if (!passedup)
br_pass_frame_up(br, skb); br_pass_frame_up(br, skb);
else
kfree_skb(skb);
return; return;
} }
...@@ -102,6 +104,8 @@ static void __br_handle_frame(struct sk_buff *skb) ...@@ -102,6 +104,8 @@ static void __br_handle_frame(struct sk_buff *skb)
if (dst != NULL && dst->is_local) { if (dst != NULL && dst->is_local) {
if (!passedup) if (!passedup)
br_pass_frame_up(br, skb); br_pass_frame_up(br, skb);
else
kfree_skb(skb);
br_fdb_put(dst); br_fdb_put(dst);
return; return;
} }
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
* Authors: Alan Cox <iiitac@pyr.swan.ac.uk> * Authors: Alan Cox <iiitac@pyr.swan.ac.uk>
* Florian La Roche <rzsfl@rz.uni-sb.de> * Florian La Roche <rzsfl@rz.uni-sb.de>
* *
* Version: $Id: skbuff.c,v 1.70 2000/03/17 14:41:39 davem Exp $ * Version: $Id: skbuff.c,v 1.71 2000/03/29 11:58:33 davem Exp $
* *
* Fixes: * Fixes:
* Alan Cox : Fixed the worst of the load balancer bugs. * Alan Cox : Fixed the worst of the load balancer bugs.
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/timer.h> #include <linux/timer.h>
#include <linux/netfilter.h> #include <linux/netfilter.h>
#include <linux/in.h>
#include <linux/icmp.h> #include <linux/icmp.h>
#include <linux/netfilter_ipv4/ip_conntrack_protocol.h> #include <linux/netfilter_ipv4/ip_conntrack_protocol.h>
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include <linux/timer.h> #include <linux/timer.h>
#include <linux/netfilter.h> #include <linux/netfilter.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/in.h>
#include <linux/ip.h> #include <linux/ip.h>
#include <linux/tcp.h> #include <linux/tcp.h>
#include <linux/netfilter_ipv4/ip_conntrack.h> #include <linux/netfilter_ipv4/ip_conntrack.h>
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/timer.h> #include <linux/timer.h>
#include <linux/netfilter.h> #include <linux/netfilter.h>
#include <linux/in.h>
#include <linux/udp.h> #include <linux/udp.h>
#include <linux/netfilter_ipv4/ip_conntrack_protocol.h> #include <linux/netfilter_ipv4/ip_conntrack_protocol.h>
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
DO IT. DO IT.
*/ */
#include <linux/skbuff.h> #include <linux/skbuff.h>
#include <linux/in.h>
#include <linux/ip.h> #include <linux/ip.h>
#include <linux/icmp.h> #include <linux/icmp.h>
#include <linux/udp.h> #include <linux/udp.h>
......
This diff is collapsed.
...@@ -89,7 +89,7 @@ static unsigned int spx_datagram_poll(struct file * file, struct socket *sock, p ...@@ -89,7 +89,7 @@ static unsigned int spx_datagram_poll(struct file * file, struct socket *sock, p
if (sock_writeable(sk)) if (sock_writeable(sk))
mask |= POLLOUT | POLLWRNORM | POLLWRBAND; mask |= POLLOUT | POLLWRNORM | POLLWRBAND;
else else
sk->socket->flags |= SO_NOSPACE; set_bit(SOCK_ASYNC_NOSPACE,&sk->socket->flags);
return mask; return mask;
} }
...@@ -231,7 +231,7 @@ static int spx_listen(struct socket *sock, int backlog) ...@@ -231,7 +231,7 @@ static int spx_listen(struct socket *sock, int backlog)
sk->ack_backlog = 0; sk->ack_backlog = 0;
sk->state = TCP_LISTEN; sk->state = TCP_LISTEN;
} }
sk->socket->flags |= SO_ACCEPTCON; sk->socket->flags |= __SO_ACCEPTCON;
return (0); return (0);
} }
...@@ -248,7 +248,7 @@ static int spx_accept(struct socket *sock, struct socket *newsock, int flags) ...@@ -248,7 +248,7 @@ static int spx_accept(struct socket *sock, struct socket *newsock, int flags)
return (-EINVAL); return (-EINVAL);
sk = sock->sk; sk = sock->sk;
if((sock->state != SS_UNCONNECTED) || !(sock->flags & SO_ACCEPTCON)) if((sock->state != SS_UNCONNECTED) || !(sock->flags & __SO_ACCEPTCON))
return (-EINVAL); return (-EINVAL);
if(sock->type != SOCK_SEQPACKET) if(sock->type != SOCK_SEQPACKET)
return (-EOPNOTSUPP); return (-EOPNOTSUPP);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment