diff options
author | Ralf Baechle <ralf@linux-mips.org> | 2000-03-19 01:28:40 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2000-03-19 01:28:40 +0000 |
commit | 8abb719409c9060a7c0676f76e9182c1e0b8ca46 (patch) | |
tree | b88cc5a6cd513a04a512b7e6215c873c90a1c5dd /arch | |
parent | f01bd7aeafd95a08aafc9e3636bb26974df69d82 (diff) |
Merge with 2.3.99-pre1.
Diffstat (limited to 'arch')
68 files changed, 2126 insertions, 1477 deletions
diff --git a/arch/alpha/config.in b/arch/alpha/config.in index 6e760c917..df7ae01ca 100644 --- a/arch/alpha/config.in +++ b/arch/alpha/config.in @@ -223,6 +223,19 @@ if [ "$CONFIG_NET" = "y" ]; then fi mainmenu_option next_comment +comment 'ATA/IDE/MFM/RLL support' + +tristate 'ATA/IDE/MFM/RLL support' CONFIG_IDE + +if [ "$CONFIG_IDE" != "n" ]; then + source drivers/ide/Config.in +else + define_bool CONFIG_BLK_DEV_IDE_MODES n + define_bool CONFIG_BLK_DEV_HD n +fi +endmenu + +mainmenu_option next_comment comment 'SCSI support' tristate 'SCSI support' CONFIG_SCSI diff --git a/arch/alpha/defconfig b/arch/alpha/defconfig index cc244e560..c4752a216 100644 --- a/arch/alpha/defconfig +++ b/arch/alpha/defconfig @@ -70,12 +70,6 @@ CONFIG_BINFMT_EM86=y # Block devices # CONFIG_BLK_DEV_FD=y -# CONFIG_BLK_DEV_IDE is not set - -# -# Please see Documentation/ide.txt for help/info on IDE drives -# -# CONFIG_BLK_DEV_HD_ONLY is not set # CONFIG_BLK_CPQ_DA is not set # @@ -89,8 +83,6 @@ CONFIG_BLK_DEV_FD=y # CONFIG_BLK_DEV_DAC960 is not set CONFIG_PARIDE_PARPORT=y # CONFIG_PARIDE is not set -# CONFIG_BLK_DEV_IDE_MODES is not set -# CONFIG_BLK_DEV_HD is not set # # Networking options @@ -123,6 +115,11 @@ CONFIG_SKB_LARGE=y # CONFIG_ATALK is not set # +# ATA/IDE/MFM/RLL support +# +# CONFIG_IDE is not set + +# # SCSI support # CONFIG_SCSI=y diff --git a/arch/arm/Makefile b/arch/arm/Makefile index 6b4033705..ad8e9423a 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile @@ -121,6 +121,11 @@ MACHINE = ebsa110 ARCHDIR = ebsa110 endif +ifeq ($(CONFIG_ARCH_CLPS7500),y) +MACHINE = clps7500 +ARCHDIR = cl7500 +endif + ifeq ($(CONFIG_FOOTBRIDGE),y) MACHINE = footbridge ARCHDIR = ebsa285 @@ -135,6 +140,11 @@ MACHINE = nexuspci ARCHDIR = nexuspci endif +ifeq ($(CONFIG_ARCH_SHARK),y) +MACHINE = shark +ARCHDIR = shark +endif + ifeq ($(CONFIG_ARCH_SA1100),y) MACHINE = sa1100 ARCHDIR = sa1100 @@ -160,6 +170,11 @@ DRIVERS += drivers/acorn/net/acorn-net.a DRIVERS += drivers/acorn/scsi/acorn-scsi.a endif +ifeq ($(CONFIG_ARCH_CLPS7500),y) +SUBDIRS += drivers/acorn/char +DRIVERS += drivers/acorn/char/acorn-char.o +endif + MAKEBOOT = $(MAKE) -C arch/$(ARCH)/boot # The following is a hack to get 'constants.h' up diff --git a/arch/arm/boot/compressed/Makefile b/arch/arm/boot/compressed/Makefile index fca3e8c92..37d79da39 100644 --- a/arch/arm/boot/compressed/Makefile +++ b/arch/arm/boot/compressed/Makefile @@ -25,6 +25,10 @@ ifeq ($(CONFIG_ARCH_RPC),y) ZTEXTADDR = 0x10008000 endif +ifeq ($(CONFIG_ARCH_CLPS7500),y) +ZTEXTADDR = 0x10008000 +endif + ifeq ($(CONFIG_ARCH_EBSA110),y) ZTEXTADDR = 0x00008000 endif @@ -39,7 +43,6 @@ endif ifeq ($(CONFIG_ARCH_NEXUSPCI),y) HEAD = head-nexuspci.o -OBJS += $(TOPDIR)/arch/arm/lib/ll_char_wr_scc.o ZTEXTADDR = 0x40200000 ZRELADDR = 0x40008000 endif diff --git a/arch/arm/config.in b/arch/arm/config.in index 4c7a5fe19..ff4f954df 100644 --- a/arch/arm/config.in +++ b/arch/arm/config.in @@ -37,6 +37,7 @@ if [ "$CONFIG_HOST_FOOTBRIDGE" = "y" ]; then bool ' Include support for EBSA285' CONFIG_ARCH_EBSA285 bool ' Include support for CATS' CONFIG_CATS bool ' Include support for NetWinder' CONFIG_ARCH_NETWINDER + bool ' Include support for Compaq Personal Server' CONFIG_PERSONAL_SERVER fi if [ "$CONFIG_ADDIN_FOOTBRIDGE" = "y" ]; then @@ -170,6 +171,7 @@ source drivers/parport/Config.in if [ "$CONFIG_ARCH_EBSA110" = "y" -o \ "$CONFIG_ARCH_SA1100" = "y" -o \ "$CONFIG_ARCH_NETWINDER" = "y" -o \ + "$CONFIG_PERSONAL_SERVER" = "y" -o \ "$CONFIG_CATS" = "y" ]; then string 'Initial kernel command string' CONFIG_CMDLINE fi @@ -254,6 +256,19 @@ fi # endmenu mainmenu_option next_comment +comment 'ATA/IDE/MFM/RLL support' + +tristate 'ATA/IDE/MFM/RLL support' CONFIG_IDE + +if [ "$CONFIG_IDE" != "n" ]; then + source drivers/ide/Config.in +else + define_bool CONFIG_BLK_DEV_IDE_MODES n + define_bool CONFIG_BLK_DEV_HD n +fi +endmenu + +mainmenu_option next_comment comment 'SCSI support' tristate 'SCSI support?' CONFIG_SCSI diff --git a/arch/arm/defconfig b/arch/arm/defconfig index e43a8d2a9..45c89eeb3 100644 --- a/arch/arm/defconfig +++ b/arch/arm/defconfig @@ -87,46 +87,6 @@ CONFIG_ISAPNP=y # Block devices # # CONFIG_BLK_DEV_FD is not set -CONFIG_BLK_DEV_IDE=y - -# -# Please see Documentation/ide.txt for help/info on IDE drives -# -# CONFIG_BLK_DEV_HD_IDE is not set -CONFIG_BLK_DEV_IDEDISK=y -CONFIG_IDEDISK_MULTI_MODE=y -# CONFIG_BLK_DEV_IDECD is not set -# CONFIG_BLK_DEV_IDETAPE is not set -# CONFIG_BLK_DEV_IDEFLOPPY is not set -# CONFIG_BLK_DEV_IDESCSI is not set - -# -# IDE chipset support/bugfixes -# -# CONFIG_BLK_DEV_CMD640 is not set -# CONFIG_BLK_DEV_RZ1000 is not set -CONFIG_BLK_DEV_IDEPCI=y -CONFIG_BLK_DEV_IDEDMA_PCI=y -CONFIG_IDEDMA_PCI_AUTO=y -CONFIG_IDEDMA_NEW_DRIVE_LISTINGS=y -CONFIG_IDEDMA_PCI_EXPERIMENTAL=y -CONFIG_BLK_DEV_OFFBOARD=y -# CONFIG_BLK_DEV_AEC6210 is not set -# CONFIG_BLK_DEV_ALI15X3 is not set -# CONFIG_BLK_DEV_CMD646 is not set -CONFIG_BLK_DEV_CY82C693=y -# CONFIG_BLK_DEV_HPT34X is not set -# CONFIG_BLK_DEV_HPT366 is not set -# CONFIG_BLK_DEV_NS87415 is not set -# CONFIG_BLK_DEV_OPTI621 is not set -CONFIG_BLK_DEV_PDC202XX=y -# CONFIG_PDC202XX_FORCE_BURST_BIT is not set -# CONFIG_PDC202XX_FORCE_MASTER_MODE is not set -# CONFIG_BLK_DEV_TRM290 is not set -CONFIG_BLK_DEV_SL82C105=y -CONFIG_BLK_DEV_IDEDMA=y -CONFIG_IDEDMA_AUTO=y -# CONFIG_IDE_CHIPSETS is not set # CONFIG_BLK_CPQ_DA is not set # @@ -172,8 +132,6 @@ CONFIG_PARIDE_KBIC=m CONFIG_PARIDE_KTTI=m CONFIG_PARIDE_ON20=m CONFIG_PARIDE_ON26=m -CONFIG_BLK_DEV_IDE_MODES=y -# CONFIG_BLK_DEV_HD is not set # # Character devices @@ -509,6 +467,54 @@ CONFIG_SLIP_MODE_SLIP6=y # CONFIG_NET_PCMCIA is not set # +# ATA/IDE/MFM/RLL support +# +CONFIG_IDE=y +CONFIG_BLK_DEV_IDE=y + +# +# Please see Documentation/ide.txt for help/info on IDE drives +# +# CONFIG_BLK_DEV_HD_IDE is not set +CONFIG_BLK_DEV_IDEDISK=y +CONFIG_IDEDISK_MULTI_MODE=y +# CONFIG_BLK_DEV_IDECD is not set +# CONFIG_BLK_DEV_IDETAPE is not set +# CONFIG_BLK_DEV_IDEFLOPPY is not set +# CONFIG_BLK_DEV_IDESCSI is not set + +# +# IDE chipset support/bugfixes +# +# CONFIG_BLK_DEV_CMD640 is not set +# CONFIG_BLK_DEV_RZ1000 is not set +CONFIG_BLK_DEV_IDEPCI=y +CONFIG_BLK_DEV_IDEDMA_PCI=y +# CONFIG_IDEPCI_SHARE_IRQ is not set +CONFIG_IDEDMA_PCI_AUTO=y +CONFIG_IDEDMA_NEW_DRIVE_LISTINGS=y +CONFIG_IDEDMA_PCI_EXPERIMENTAL=y +CONFIG_BLK_DEV_OFFBOARD=y +# CONFIG_BLK_DEV_AEC6210 is not set +# CONFIG_BLK_DEV_ALI15X3 is not set +# CONFIG_BLK_DEV_CMD64X is not set +CONFIG_BLK_DEV_CY82C693=y +# CONFIG_BLK_DEV_HPT34X is not set +# CONFIG_BLK_DEV_HPT366 is not set +# CONFIG_BLK_DEV_NS87415 is not set +# CONFIG_BLK_DEV_OPTI621 is not set +CONFIG_BLK_DEV_PDC202XX=y +# CONFIG_PDC202XX_BURST is not set +# CONFIG_PDC202XX_MASTER is not set +# CONFIG_BLK_DEV_TRM290 is not set +CONFIG_BLK_DEV_SL82C105=y +CONFIG_BLK_DEV_IDEDMA=y +CONFIG_IDEDMA_AUTO=y +# CONFIG_IDE_CHIPSETS is not set +CONFIG_BLK_DEV_IDE_MODES=y +# CONFIG_BLK_DEV_HD is not set + +# # SCSI support # # CONFIG_SCSI is not set diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile index 3920edade..c454c1350 100644 --- a/arch/arm/kernel/Makefile +++ b/arch/arm/kernel/Makefile @@ -8,71 +8,55 @@ HEAD_OBJ = head-$(PROCESSOR).o ENTRY_OBJ = entry-$(PROCESSOR).o -O_TARGET := kernel.o -O_OBJS := $(ENTRY_OBJ) ioport.o irq.o process.o ptrace.o \ - semaphore.o setup.o signal.o sys_arm.o time.o traps.o - ifeq ($(CONFIG_ISA_DMA),y) ISA_DMA_OBJS += dma-isa.o endif -O_OBJS_arc = dma-arc.o iic.o fiq.o time-acorn.o oldlatches.o -O_OBJS_a5k = dma-a5k.o iic.o fiq.o time-acorn.o -O_OBJS_rpc = dma-rpc.o iic.o fiq.o time-acorn.o +O_OBJS_arc = dma-arc.o oldlatches.o +O_OBJS_a5k = dma-a5k.o +O_OBJS_rpc = dma-rpc.o O_OBJS_ebsa110 = dma-dummy.o -O_OBJS_footbridge = dma-footbridge.o $(ISA_DMA_OBJS) isa.o +O_OBJS_footbridge = dma.o dma-footbridge.o $(ISA_DMA_OBJS) hw-footbridge.o isa.o O_OBJS_nexuspci = dma-dummy.o O_OBJS_sa1100 = dma-dummy.o fiq.o -OX_OBJS_arc = dma.o -OX_OBJS_a5k = dma.o -OX_OBJS_rpc = dma.o -OX_OBJS_ebsa110 = -OX_OBJS_footbridge= dma.o hw-footbridge.o -OX_OBJS_nexuspci = -OX_OBJS_sa1100 = +O_TARGET := kernel.o -all: kernel.o $(HEAD_OBJ) init_task.o +# Object file lists. -O_OBJS += $(O_OBJS_$(MACHINE)) +obj-y := arch.o $(ENTRY_OBJ) ioport.o irq.o process.o ptrace.o \ + semaphore.o setup.o signal.o sys_arm.o time.o traps.o \ + $(O_OBJS_$(MACHINE)) +obj-m := +obj-n := +obj- := -ifeq ($(CONFIG_DEBUG_LL),y) - O_OBJS += debug-$(PROCESSOR).o -endif +export-objs := armksyms.o dma.o ecard.o hw-footbridge.o leds-$(MACHINE).o -ifeq ($(CONFIG_MODULES),y) - OX_OBJS = armksyms.o -endif +obj-$(CONFIG_ARCH_ACORN) += dma.o ecard.o iic.o fiq.o time-acorn.o +obj-$(CONFIG_DEBUG_LL) += debug-$(PROCESSOR).o +obj-$(CONFIG_MODULES) += armksyms.o +obj-$(CONFIG_LEDS) += leds-$(MACHINE).o +obj-$(CONFIG_ARTHUR) += arthur.o -ifeq ($(CONFIG_ARCH_ACORN),y) - OX_OBJS += ecard.o +ifeq ($(MACHINE),nexuspci) + obj-$(CONFIG_PCI) += plx9080.o +else + obj-$(CONFIG_PCI) += bios32.o dec21285.o endif -ifeq ($(CONFIG_PCI),y) - ifeq ($(MACHINE),nexuspci) - O_OBJS += plx9080.o - else - O_OBJS += bios32.o dec21285.o - endif -endif +# Files that are both resident and modular; remove from modular. -ifeq ($(CONFIG_LEDS),y) - OX_OBJS += leds-$(MACHINE).o -endif +obj-m := $(filter-out $(obj-y), $(obj-m)) -ifeq ($(CONFIG_MODULES),y) - OX_OBJS += $(OX_OBJS_$(MACHINE)) -else - O_OBJS += $(OX_OBJS_$(MACHINE)) -endif +# Translate to Rules.make lists. -ifeq ($(CONFIG_ARTHUR),y) - O_OBJS += arthur.o -else - ifeq ($(CONFIG_ARTHUR),m) - M_OBJS += arthur.o - endif -endif +O_OBJS := $(filter-out $(export-objs), $(obj-y)) +OX_OBJS := $(filter $(export-objs), $(obj-y)) +M_OBJS := $(sort $(filter-out $(export-objs), $(obj-m))) +MX_OBJS := $(sort $(filter $(export-objs), $(obj-m))) + +all: kernel.o $(HEAD_OBJ) init_task.o $(HEAD_OBJ): $(HEAD_OBJ:.o=.S) $(CC) -D__ASSEMBLY__ $(AFLAGS) -DTEXTADDR=$(TEXTADDR) -traditional -c $(HEAD_OBJ:.o=.S) -o $@ diff --git a/arch/arm/kernel/arch.c b/arch/arm/kernel/arch.c new file mode 100644 index 000000000..8645497ae --- /dev/null +++ b/arch/arm/kernel/arch.c @@ -0,0 +1,322 @@ +/* + * linux/arch/arm/kernel/arch.c + * + * Architecture specifics + */ +#include <linux/config.h> +#include <linux/tty.h> +#include <linux/init.h> + +#include <asm/elf.h> +#include <asm/setup.h> +#include <asm/system.h> + +#include "arch.h" + +extern unsigned int system_rev; +extern unsigned int system_serial_low; +extern unsigned int system_serial_high; + +unsigned int vram_size; +#ifdef CONFIG_ARCH_ACORN +unsigned int memc_ctrl_reg; +unsigned int number_mfm_drives; +#endif + +/* + * Architecture specific fixups. This is where any + * parameters in the params struct are fixed up, or + * any additional architecture specific information + * is pulled from the params struct. + */ +static void __init +fixup_acorn(struct machine_desc *desc, struct param_struct *params, + char **cmdline, struct meminfo *mi) +{ +#ifdef CONFIG_ARCH_ACORN + int i; + + if (machine_is_riscpc()) { + /* + * RiscPC can't handle half-word loads and stores + */ + elf_hwcap &= ~HWCAP_HALF; + + switch (params->u1.s.pages_in_vram) { + case 512: + vram_size += PAGE_SIZE * 256; + case 256: + vram_size += PAGE_SIZE * 256; + default: + break; + } + + if (vram_size) { + desc->video_start = 0x02000000; + desc->video_end = 0x02000000 + vram_size; + } + + for (i = 0; i < 4; i++) { + mi->bank[i].start = PHYS_OFFSET + (i << 26); + mi->bank[i].size = + params->u1.s.pages_in_bank[i] * + params->u1.s.page_size; + } + mi->nr_banks = 4; + } + memc_ctrl_reg = params->u1.s.memc_control_reg; + number_mfm_drives = (params->u1.s.adfsdrives >> 3) & 3; +#endif +} + +static void __init +fixup_ebsa285(struct machine_desc *desc, struct param_struct *params, + char **cmdline, struct meminfo *mi) +{ + ORIG_X = params->u1.s.video_x; + ORIG_Y = params->u1.s.video_y; + ORIG_VIDEO_COLS = params->u1.s.video_num_cols; + ORIG_VIDEO_LINES = params->u1.s.video_num_rows; +} + +/* + * Older NeTTroms either do not provide a parameters + * page, or they don't supply correct information in + * the parameter page. + */ +static void __init +fixup_netwinder(struct machine_desc *desc, struct param_struct *params, + char **cmdline, struct meminfo *mi) +{ + if (params->u1.s.nr_pages != 0x2000 && + params->u1.s.nr_pages != 0x4000) { + printk(KERN_WARNING "Warning: bad NeTTrom parameters " + "detected, using defaults\n"); + + params->u1.s.nr_pages = 0x2000; /* 32MB */ + params->u1.s.ramdisk_size = 0; + params->u1.s.flags = FLAG_READONLY; + params->u1.s.initrd_start = 0; + params->u1.s.initrd_size = 0; + params->u1.s.rd_start = 0; + } +} + +/* + * CATS uses soft-reboot by default, since + * hard reboots fail on early boards. + */ +static void __init +fixup_cats(struct machine_desc *desc, struct param_struct *params, + char **cmdline, struct meminfo *mi) +{ + ORIG_VIDEO_LINES = 25; + ORIG_VIDEO_POINTS = 16; + ORIG_Y = 24; +} + +static void __init +fixup_coebsa285(struct machine_desc *desc, struct param_struct *params, + char **cmdline, struct meminfo *mi) +{ +#if 0 + extern unsigned long boot_memory_end; + extern char boot_command_line[]; + + mi->nr_banks = 1; + mi->bank[0].start = PHYS_OFFSET; + mi->bank[0].size = boot_memory_end; + + *cmdline = boot_command_line; +#endif +} + +static void __init +fixup_sa1100(struct machine_desc *desc, struct param_struct *params, + char **cmdline, struct meminfo *mi) +{ +#ifdef CONFIG_ARCH_SA1100 + int i; + extern struct mem_desc { + unsigned long phys_start; + unsigned long length; + } mem_desc[]; + extern unsigned int mem_desc_size; + + for( i = 0; i < mem_desc_size; i++ ) { + if( i >= NR_BANKS ) { + printk( __FUNCTION__ + ": mem_desc too large for meminfo structure\n"); + break; + } + mi->bank[i].start = mem_desc[i].phys_start; + mi->bank[i].size = mem_desc[i].length; + } + mi->nr_banks = i; + +#if defined(CONFIG_SA1100_BRUTUS) + ROOT_DEV = MKDEV(RAMDISK_MAJOR,0); + setup_ramdisk( 1, 0, 0, 8192 ); + setup_initrd( __phys_to_virt(0xd8000000), 0x00400000 ); +#elif defined(CONFIG_SA1100_EMPEG) + ROOT_DEV = MKDEV( 3, 1 ); /* /dev/hda1 */ + setup_ramdisk( 1, 0, 0, 4096 ); + setup_initrd( 0xd0000000+((1024-320)*1024), (320*1024) ); +#elif defined(CONFIG_SA1100_TIFON) + ROOT_DEV = MKDEV(UNNAMED_MAJOR, 0); + setup_ramdisk(1, 0, 0, 4096); + setup_initrd( 0xd0000000 + 0x1100004, 0x140000 ); +#elif defined(CONFIG_SA1100_VICTOR) + ROOT_DEV = MKDEV( 60, 2 ); + + /* Get command line parameters passed from the loader (if any) */ + if( *((char*)0xc0000000) ) + strcpy( default_command_line, ((char *)0xc0000000) ); + + /* power off if any problem */ + strcat( default_command_line, " panic=1" ); +#elif defined(CONFIG_SA1100_LART) + ROOT_DEV = MKDEV(RAMDISK_MAJOR,0); + setup_ramdisk(1, 0, 0, 8192); + setup_initrd(0xc0400000, 0x00400000); +#endif +#endif +} + +#define NO_PARAMS 0 +#define NO_VIDEO 0, 0 + +/* + * This is the list of all architectures supported by + * this kernel. This should be integrated with the list + * in head-armv.S. + */ +static struct machine_desc machine_desc[] __attribute__ ((__section__ (".arch.info"))) = { + { + MACH_TYPE_EBSA110, + "EBSA110", /* RMK */ + 0x00000400, + NO_VIDEO, + 1, 0, 1, 1, 1, + NULL + }, { + MACH_TYPE_RISCPC, + "Acorn-RiscPC", /* RMK */ + 0x10000100, + NO_VIDEO, + 1, 1, 0, 0, 0, + fixup_acorn + }, { + 2, + "unknown", + NO_PARAMS, + NO_VIDEO, + 0, 0, 0, 0, 0, + NULL + }, { + MACH_TYPE_NEXUSPCI, + "FTV/PCI", /* Philip Blundell */ + NO_PARAMS, + NO_VIDEO, + 0, 0, 0, 0, 0, + NULL + }, { + MACH_TYPE_EBSA285, + "EBSA285", /* RMK */ + 0x00000100, + 0x000a0000, 0x000bffff, + 0, 0, 0, 0, 0, + fixup_ebsa285 + }, { + MACH_TYPE_NETWINDER, + "Rebel-NetWinder", /* RMK */ + 0x00000100, + 0x000a0000, 0x000bffff, + 1, 0, 1, 0, 0, + fixup_netwinder + }, { + MACH_TYPE_CATS, + "Chalice-CATS", /* Philip Blundell */ + NO_PARAMS, + 0x000a0000, 0x000bffff, + 0, 0, 0, 0, 1, + fixup_cats + }, { + MACH_TYPE_TBOX, + "unknown-TBOX", /* Philip Blundell */ + NO_PARAMS, + NO_VIDEO, + 0, 0, 0, 0, 0, + NULL + }, { + MACH_TYPE_CO285, + "co-EBSA285", /* Mark van Doesburg */ + NO_PARAMS, + NO_VIDEO, + 0, 0, 0, 0, 0, + fixup_coebsa285 + }, { + MACH_TYPE_CLPS7110, + "CL-PS7110", /* Werner Almesberger */ + NO_PARAMS, + NO_VIDEO, + 0, 0, 0, 0, 0, + NULL + }, { + MACH_TYPE_ARCHIMEDES, + "Acorn-Archimedes",/* RMK/DAG */ + 0x0207c000, + NO_VIDEO, + 0, 0, 0, 0, 0, + fixup_acorn + }, { + MACH_TYPE_A5K, + "Acorn-A5000", /* RMK/PB */ + 0x0207c000, + NO_VIDEO, + 0, 0, 0, 0, 0, + fixup_acorn + }, { + MACH_TYPE_ETOILE, + "Etoile", /* Alex de Vries */ + NO_PARAMS, + NO_VIDEO, + 0, 0, 0, 0, 0, + NULL + }, { + MACH_TYPE_LACIE_NAS, + "LaCie_NAS", /* Benjamin Herrenschmidt */ + NO_PARAMS, + NO_VIDEO, + 0, 0, 0, 0, 0, + NULL + }, { + MACH_TYPE_CLPS7500, + "CL-PS7500", /* Philip Blundell */ + NO_PARAMS, + NO_VIDEO, + 0, 0, 0, 0, 0, + NULL + }, { + MACH_TYPE_SHARK, + "Shark", /* Alexander Schulz */ + NO_PARAMS, + 0x06000000, 0x06000000+0x001fffff, + 0, 0, 0, 0, 0, + NULL + }, { + MACH_TYPE_SA1100, + "SA1100-based", /* Nicolas Pitre */ + NO_PARAMS, + NO_VIDEO, + 0, 0, 0, 0, 0, + fixup_sa1100 + }, { + MACH_TYPE_PERSONAL_SERVER, + "Compaq Personal Server", + NO_PARAMS, + NO_VIDEO, + 0, 0, 0, 0, 0, + NULL + } +}; diff --git a/arch/arm/kernel/arch.h b/arch/arm/kernel/arch.h new file mode 100644 index 000000000..b7635b11e --- /dev/null +++ b/arch/arm/kernel/arch.h @@ -0,0 +1,15 @@ +struct machine_desc { + unsigned int nr; /* architecture number */ + const char *name; /* architecture name */ + unsigned int param_offset; /* parameter page */ + unsigned int video_start; /* start of video RAM */ + unsigned int video_end; /* end of video RAM */ + unsigned int reserve_lp0 :1; /* never has lp0 */ + unsigned int reserve_lp1 :1; /* never has lp1 */ + unsigned int reserve_lp2 :1; /* never has lp2 */ + unsigned int broken_hlt :1; /* hlt is broken */ + unsigned int soft_reboot :1; /* soft reboot */ + void (*fixup)(struct machine_desc *, + struct param_struct *, char **, + struct meminfo *); +}; diff --git a/arch/arm/kernel/armksyms.c b/arch/arm/kernel/armksyms.c index c445daeee..5a1b4ed31 100644 --- a/arch/arm/kernel/armksyms.c +++ b/arch/arm/kernel/armksyms.c @@ -8,6 +8,7 @@ #include <linux/pci.h> #include <linux/delay.h> #include <linux/in6.h> +#include <linux/vt_kern.h> #include <asm/byteorder.h> #include <asm/elf.h> @@ -83,6 +84,8 @@ EXPORT_SYMBOL(fpundefinstr); EXPORT_SYMBOL(ret_from_exception); #endif +EXPORT_SYMBOL(kd_mksound); + /* platform dependent support */ EXPORT_SYMBOL(dump_thread); EXPORT_SYMBOL(dump_fpu); diff --git a/arch/arm/kernel/bios32.c b/arch/arm/kernel/bios32.c index 7a1b57c22..1b0a064d0 100644 --- a/arch/arm/kernel/bios32.c +++ b/arch/arm/kernel/bios32.c @@ -222,8 +222,9 @@ static u8 __init no_swizzle(struct pci_dev *dev, u8 *pin) return 0; } -#ifdef CONFIG_FOOTBRIDGE /* ebsa285 host-specific stuff */ + +#ifdef CONFIG_ARCH_EBSA285 static int irqmap_ebsa285[] __initdata = { IRQ_IN1, IRQ_IN0, IRQ_PCI, IRQ_IN3 }; static u8 __init ebsa285_swizzle(struct pci_dev *dev, u8 *pin) @@ -251,7 +252,9 @@ static struct hw_pci ebsa285_pci __initdata = { ebsa285_swizzle, ebsa285_map_irq }; +#endif +#ifdef CONFIG_CATS /* cats host-specific stuff */ static int irqmap_cats[] __initdata = { IRQ_PCI, IRQ_IN0, IRQ_IN1, IRQ_IN3 }; @@ -277,7 +280,9 @@ static struct hw_pci cats_pci __initdata = { no_swizzle, cats_map_irq }; +#endif +#ifdef CONFIG_ARCH_NETWINDER /* netwinder host-specific stuff */ static int __init netwinder_map_irq(struct pci_dev *dev, u8 slot, u8 pin) { @@ -318,6 +323,41 @@ static struct hw_pci netwinder_pci __initdata = { }; #endif +#ifdef CONFIG_PERSONAL_SERVER +static int irqmap_personal_server[] __initdata = { + IRQ_IN0, IRQ_IN1, IRQ_IN2, IRQ_IN3, 0, 0, 0, + IRQ_DOORBELLHOST, IRQ_DMA1, IRQ_DMA2, IRQ_PCI +}; + +static int __init personal_server_map_irq(struct pci_dev *dev, u8 slot, u8 pin) +{ + unsigned char line; + + pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &line); + + if (line > 0x40 && line <= 0x5f) { + /* line corresponds to the bit controlling this interrupt + * in the footbridge. Ignore the first 8 interrupt bits, + * look up the rest in the map. IN0 is bit number 8 + */ + return irqmap_personal_server[(line & 0x1f) - 8]; + } else if (line == 0) { + /* no interrupt */ + return 0; + } else + return irqmap_personal_server[(line - 1) & 3]; +} + +static struct hw_pci personal_server_pci __initdata = { + dc21285_init, + 0x9000, + 0x00100000, + no_swizzle, + personal_server_map_irq +}; + +#endif + #ifdef CONFIG_ARCH_NEXUSPCI /* * Owing to a PCB cockup, issue A backplanes are wired thus: @@ -352,17 +392,38 @@ void __init pcibios_init(void) { struct hw_pci *hw_pci = NULL; -#ifdef CONFIG_FOOTBRIDGE - if (machine_is_ebsa285()) - hw_pci = &ebsa285_pci; - else if (machine_is_cats()) - hw_pci = &cats_pci; - else if (machine_is_netwinder()) - hw_pci = &netwinder_pci; + do { +#ifdef CONFIG_ARCH_EBSA285 + if (machine_is_ebsa285()) { + hw_pci = &ebsa285_pci; + break; + } +#endif +#ifdef CONFIG_CATS + if (machine_is_cats()) { + hw_pci = &cats_pci; + break; + } +#endif +#ifdef CONFIG_ARCH_NETWINDER + if (machine_is_netwinder()) { + hw_pci = &netwinder_pci; + break; + } +#endif +#ifdef CONFIG_PERSONAL_SERVER + if (machine_is_personal_server()) { + hw_pci = &personal_server_pci; + break; + } #endif #ifdef CONFIG_ARCH_NEXUSPCI - hw_pci = &ftv_pci; + if (machine_is_nexuspci()) { + hw_pci = &ftv_pci; + break; + } #endif + } while (0); if (hw_pci == NULL) return; diff --git a/arch/arm/kernel/head-armv.S b/arch/arm/kernel/head-armv.S index 35e71a4a9..27a280b8b 100644 --- a/arch/arm/kernel/head-armv.S +++ b/arch/arm/kernel/head-armv.S @@ -22,6 +22,7 @@ .equ SYMBOL_NAME(swapper_pg_dir), TEXTADDR - 0x8000 + SWAPPER_PGDIR_OFFSET .section ".text.init",#alloc,#execinstr + .type stext, #function ENTRY(stext) ENTRY(_stext) @@ -311,6 +312,7 @@ __lookup_architecture_type: * required for debugging information to be shown to the user. * paging_init() does the real page table initialisation. */ + .type __arch_types_start, #object @ 0x00 - DEC EBSA110 __arch_types_start: .long 0 @@ -398,15 +400,15 @@ __arch_types_start: @ 0x0e - CL-PS7500 .long 0 - .long 0 - .long 0 - .long 0 + .long 0x10000000 + .long 0x03000000 + .long 0xe0000000 - @ 0x0f - Shark - .long 0 - .long 0 - .long 0 + @ 0x0f - Digital Shark (DNARD) .long 0 + .long 0x08000000 + .long 0x40000000 + .long 0xe0000000 @ 0x10 - SA1100 .long 0 diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c index 0692d1a6c..0ace4c898 100644 --- a/arch/arm/kernel/ptrace.c +++ b/arch/arm/kernel/ptrace.c @@ -521,6 +521,48 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data) /* give it a chance to run. */ ret = 0; goto out; + + case PTRACE_GETREGS: + { /* Get all gp regs from the child. */ + unsigned char *stack; + + ret = 0; + stack = (unsigned char *)((unsigned long)child + 8192 - sizeof(struct pt_regs)); + if (copy_to_user((void *)data, stack, + sizeof(struct pt_regs))) + ret = -EFAULT; + + goto out; + }; + + case PTRACE_SETREGS: + { + /* Set all gp regs in the child. */ + unsigned char *stack; + + ret = 0; + stack = (unsigned char *)((unsigned long)child + 8192 - sizeof(struct pt_regs)); + if (copy_from_user(stack, (void *)data, + sizeof(struct pt_regs))) + ret = -EFAULT; + goto out; + }; + + case PTRACE_GETFPREGS: + /* Get the child FPU state. */ + ret = 0; + if (copy_to_user((void *)data, &child->thread.fpstate, + sizeof(struct user_fp))) + ret = -EFAULT; + goto out; + + case PTRACE_SETFPREGS: + /* Set the child FPU state. */ + ret = 0; + if (copy_from_user(&child->thread.fpstate, (void *)data, + sizeof(struct user_fp))) + ret = -EFAULT; + goto out; case PTRACE_DETACH: /* detach a process that was attached. */ ret = -EIO; diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 5815529aa..6a3429bdd 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c @@ -1,13 +1,12 @@ /* * linux/arch/arm/kernel/setup.c * - * Copyright (C) 1995-1999 Russell King + * Copyright (C) 1995-2000 Russell King */ #include <linux/config.h> #include <linux/kernel.h> #include <linux/mm.h> #include <linux/stddef.h> -#include <linux/tty.h> #include <linux/ioport.h> #include <linux/delay.h> #include <linux/utsname.h> @@ -23,6 +22,8 @@ #include <asm/setup.h> #include <asm/system.h> +#include "arch.h" + #ifndef MEM_SIZE #define MEM_SIZE (16*1024*1024) #endif @@ -31,6 +32,7 @@ #define CONFIG_CMDLINE "" #endif +extern void paging_init(struct meminfo *); extern void reboot_setup(char *str); extern void disable_hlt(void); extern int root_mountflags; @@ -38,33 +40,11 @@ extern int _stext, _text, _etext, _edata, _end; unsigned int processor_id; unsigned int __machine_arch_type; -unsigned int vram_size; unsigned int system_rev; unsigned int system_serial_low; unsigned int system_serial_high; unsigned int elf_hwcap; -#ifdef CONFIG_ARCH_ACORN -unsigned int memc_ctrl_reg; -unsigned int number_mfm_drives; -#endif - -struct meminfo meminfo; - -struct machine_desc { - const char *name; /* architecture name */ - unsigned int param_offset; /* parameter page */ - unsigned int video_start; /* start of video RAM */ - unsigned int video_end; /* end of video RAM */ - unsigned int reserve_lp0 :1; /* never has lp0 */ - unsigned int reserve_lp1 :1; /* never has lp1 */ - unsigned int reserve_lp2 :1; /* never has lp2 */ - unsigned int broken_hlt :1; /* hlt is broken */ - unsigned int soft_reboot :1; /* soft reboot */ - void (*fixup)(struct machine_desc *, - struct param_struct *, char **); -}; - #ifdef MULTI_CPU struct processor processor; #endif @@ -156,6 +136,33 @@ static void __init setup_processor(void) cpu_proc_init(); } +static struct machine_desc * __init setup_architecture(unsigned int nr) +{ + extern struct machine_desc __arch_info_begin, __arch_info_end; + struct machine_desc *list; + + /* + * locate architecture in the list of supported architectures. + */ + for (list = &__arch_info_begin; list < &__arch_info_end; list++) + if (list->nr == nr) + break; + + /* + * If the architecture type is not recognised, then we + * can co nothing... + */ + if (list >= &__arch_info_end) { + printk("Architecture configuration botched (nr %d), unable " + "to continue.\n", nr); + while (1); + } + + printk("Architecture: %s\n", list->name); + + return list; +} + static unsigned long __init memparse(char *ptr, char **retptr) { unsigned long ret = simple_strtoul(ptr, retptr, 0); @@ -180,7 +187,7 @@ static unsigned long __init memparse(char *ptr, char **retptr) * are "size[KkMm]" */ static void __init -parse_cmdline(char **cmdline_p, char *from) +parse_cmdline(struct meminfo *mi, char **cmdline_p, char *from) { char c = ' ', *to = command_line; int usermem = 0, len = 0; @@ -198,7 +205,7 @@ parse_cmdline(char **cmdline_p, char *from) */ if (usermem == 0) { usermem = 1; - meminfo.nr_banks = 0; + mi->nr_banks = 0; } start = PHYS_OFFSET; @@ -206,9 +213,9 @@ parse_cmdline(char **cmdline_p, char *from) if (*from == '@') start = memparse(from + 1, &from); - meminfo.bank[meminfo.nr_banks].start = start; - meminfo.bank[meminfo.nr_banks].size = size; - meminfo.nr_banks += 1; + mi->bank[mi->nr_banks].start = start; + mi->bank[mi->nr_banks].size = size; + mi->nr_banks += 1; } c = *from++; if (!c) @@ -265,7 +272,8 @@ static void __init setup_initrd(unsigned int start, unsigned int size) #define free_bootmem(s,sz) free_bootmem((s)<<PAGE_SHIFT, (sz)<<PAGE_SHIFT) #define reserve_bootmem(s,sz) reserve_bootmem((s)<<PAGE_SHIFT, (sz)<<PAGE_SHIFT) -static unsigned int __init find_bootmap_pfn(unsigned int bootmap_pages) +static unsigned int __init +find_bootmap_pfn(struct meminfo *mi, unsigned int bootmap_pages) { unsigned int start_pfn, bank, bootmap_pfn; @@ -278,25 +286,25 @@ static unsigned int __init find_bootmap_pfn(unsigned int bootmap_pages) */ #ifdef CONFIG_BLK_DEV_INITRD if (initrd_start) { - if (__pa(initrd_end) > meminfo.end) { + if (__pa(initrd_end) > mi->end) { printk ("initrd extends beyond end of memory " "(0x%08lx > 0x%08lx) - disabling initrd\n", - __pa(initrd_end), meminfo.end); + __pa(initrd_end), mi->end); initrd_start = 0; initrd_end = 0; } } #endif - for (bank = 0; bank < meminfo.nr_banks; bank ++) { + for (bank = 0; bank < mi->nr_banks; bank ++) { unsigned int start, end; - if (meminfo.bank[bank].size == 0) + if (mi->bank[bank].size == 0) continue; - start = O_PFN_UP(meminfo.bank[bank].start); - end = O_PFN_DOWN(meminfo.bank[bank].size + - meminfo.bank[bank].start); + start = O_PFN_UP(mi->bank[bank].start); + end = O_PFN_DOWN(mi->bank[bank].size + + mi->bank[bank].start); if (end < start_pfn) continue; @@ -322,7 +330,7 @@ static unsigned int __init find_bootmap_pfn(unsigned int bootmap_pages) /* * Initialise the bootmem allocator. */ -static void __init setup_bootmem(void) +static void __init setup_bootmem(struct meminfo *mi) { unsigned int end_pfn, start_pfn, bootmap_pages, bootmap_pfn; unsigned int i; @@ -330,21 +338,21 @@ static void __init setup_bootmem(void) /* * Calculate the physical address of the top of memory. */ - meminfo.end = 0; - for (i = 0; i < meminfo.nr_banks; i++) { + mi->end = 0; + for (i = 0; i < mi->nr_banks; i++) { unsigned long end; - if (meminfo.bank[i].size != 0) { - end = meminfo.bank[i].start + meminfo.bank[i].size; - if (meminfo.end < end) - meminfo.end = end; + if (mi->bank[i].size != 0) { + end = mi->bank[i].start + mi->bank[i].size; + if (mi->end < end) + mi->end = end; } } start_pfn = O_PFN_UP(PHYS_OFFSET); - end_pfn = O_PFN_DOWN(meminfo.end); + end_pfn = O_PFN_DOWN(mi->end); bootmap_pages = bootmem_bootmap_pages(end_pfn - start_pfn); - bootmap_pfn = find_bootmap_pfn(bootmap_pages); + bootmap_pfn = find_bootmap_pfn(mi, bootmap_pages); /* * Initialise the boot-time allocator @@ -354,10 +362,10 @@ static void __init setup_bootmem(void) /* * Register all available RAM with the bootmem allocator. */ - for (i = 0; i < meminfo.nr_banks; i++) - if (meminfo.bank[i].size) - free_bootmem(O_PFN_UP(meminfo.bank[i].start), - PFN_SIZE(meminfo.bank[i].size)); + for (i = 0; i < mi->nr_banks; i++) + if (mi->bank[i].size) + free_bootmem(O_PFN_UP(mi->bank[i].start), + PFN_SIZE(mi->bank[i].size)); /* * Register the reserved regions with bootmem @@ -379,7 +387,8 @@ static void __init setup_bootmem(void) #endif } -static void __init request_standard_resources(struct machine_desc *mdesc) +static void __init +request_standard_resources(struct meminfo *mi, struct machine_desc *mdesc) { struct resource *res; int i; @@ -389,14 +398,14 @@ static void __init request_standard_resources(struct machine_desc *mdesc) kernel_data.start = __virt_to_bus(init_mm.end_code); kernel_data.end = __virt_to_bus(init_mm.brk - 1); - for (i = 0; i < meminfo.nr_banks; i++) { + for (i = 0; i < mi->nr_banks; i++) { unsigned long virt_start, virt_end; - if (meminfo.bank[i].size == 0) + if (mi->bank[i].size == 0) continue; - virt_start = __phys_to_virt(meminfo.bank[i].start); - virt_end = virt_start + meminfo.bank[i].size - 1; + virt_start = __phys_to_virt(mi->bank[i].start); + virt_end = virt_start + mi->bank[i].size - 1; res = alloc_bootmem_low(sizeof(*res)); res->name = "System RAM"; @@ -432,270 +441,15 @@ static void __init request_standard_resources(struct machine_desc *mdesc) request_resource(&ioport_resource, &lp2); } -/* - * Architecture specific fixups. This is where any - * parameters in the params struct are fixed up, or - * any additional architecture specific information - * is pulled from the params struct. - */ -static void __init -fixup_acorn(struct machine_desc *desc, struct param_struct *params, - char **cmdline) -{ -#ifdef CONFIG_ARCH_ACORN - int i; - - if (machine_is_riscpc()) { - /* - * RiscPC can't handle half-word loads and stores - */ - elf_hwcap &= ~HWCAP_HALF; - - switch (params->u1.s.pages_in_vram) { - case 512: - vram_size += PAGE_SIZE * 256; - case 256: - vram_size += PAGE_SIZE * 256; - default: - break; - } - - if (vram_size) { - desc->video_start = 0x02000000; - desc->video_end = 0x02000000 + vram_size; - } - - for (i = 0; i < 4; i++) { - meminfo.bank[i].start = PHYS_OFFSET + (i << 26); - meminfo.bank[i].size = - params->u1.s.pages_in_bank[i] * - params->u1.s.page_size; - } - meminfo.nr_banks = 4; - } - memc_ctrl_reg = params->u1.s.memc_control_reg; - number_mfm_drives = (params->u1.s.adfsdrives >> 3) & 3; -#endif -} - -static void __init -fixup_ebsa285(struct machine_desc *desc, struct param_struct *params, - char **cmdline) -{ - ORIG_X = params->u1.s.video_x; - ORIG_Y = params->u1.s.video_y; - ORIG_VIDEO_COLS = params->u1.s.video_num_cols; - ORIG_VIDEO_LINES = params->u1.s.video_num_rows; -} - -/* - * Older NeTTroms either do not provide a parameters - * page, or they don't supply correct information in - * the parameter page. - */ -static void __init -fixup_netwinder(struct machine_desc *desc, struct param_struct *params, - char **cmdline) -{ - if (params->u1.s.nr_pages != 0x2000 && - params->u1.s.nr_pages != 0x4000) { - printk(KERN_WARNING "Warning: bad NeTTrom parameters " - "detected, using defaults\n"); - - params->u1.s.nr_pages = 0x2000; /* 32MB */ - params->u1.s.ramdisk_size = 0; - params->u1.s.flags = FLAG_READONLY; - params->u1.s.initrd_start = 0; - params->u1.s.initrd_size = 0; - params->u1.s.rd_start = 0; - } -} - -/* - * CATS uses soft-reboot by default, since - * hard reboots fail on early boards. - */ -static void __init -fixup_cats(struct machine_desc *desc, struct param_struct *params, - char **cmdline) -{ - ORIG_VIDEO_LINES = 25; - ORIG_VIDEO_POINTS = 16; - ORIG_Y = 24; -} - -static void __init -fixup_coebsa285(struct machine_desc *desc, struct param_struct *params, - char **cmdline) -{ -#if 0 - extern unsigned long boot_memory_end; - extern char boot_command_line[]; - - meminfo.nr_banks = 1; - meminfo.bank[0].start = PHYS_OFFSET; - meminfo.bank[0].size = boot_memory_end; - - *cmdline = boot_command_line; -#endif -} - -static void __init -fixup_sa1100(struct machine_desc *desc, struct param_struct *params, - char **cmdline) -{ -#ifdef CONFIG_ARCH_SA1100 - int i; - extern struct mem_desc { - unsigned long phys_start; - unsigned long length; - } mem_desc[]; - extern unsigned int mem_desc_size; - - for( i = 0; i < mem_desc_size; i++ ) { - if( i >= NR_BANKS ) { - printk( __FUNCTION__ - ": mem_desc too large for meminfo structure\n"); - break; - } - meminfo.bank[i].start = mem_desc[i].phys_start; - meminfo.bank[i].size = mem_desc[i].length; - } - meminfo.nr_banks = i; - -#if defined(CONFIG_SA1100_BRUTUS) - ROOT_DEV = MKDEV(RAMDISK_MAJOR,0); - setup_ramdisk( 1, 0, 0, 8192 ); - setup_initrd( __phys_to_virt(0xd8000000), 0x00400000 ); -#elif defined(CONFIG_SA1100_EMPEG) - ROOT_DEV = MKDEV( 3, 1 ); /* /dev/hda1 */ - setup_ramdisk( 1, 0, 0, 4096 ); - setup_initrd( 0xd0000000+((1024-320)*1024), (320*1024) ); -#elif defined(CONFIG_SA1100_TIFON) - ROOT_DEV = MKDEV(UNNAMED_MAJOR, 0); - setup_ramdisk(1, 0, 0, 4096); - setup_initrd( 0xd0000000 + 0x1100004, 0x140000 ); -#elif defined(CONFIG_SA1100_VICTOR) - ROOT_DEV = MKDEV( 60, 2 ); - - /* Get command line parameters passed from the loader (if any) */ - if( *((char*)0xc0000000) ) - strcpy( default_command_line, ((char *)0xc0000000) ); - - /* power off if any problem */ - strcat( default_command_line, " panic=1" ); -#elif defined(CONFIG_SA1100_LART) - ROOT_DEV = MKDEV(RAMDISK_MAJOR,0); - setup_ramdisk(1, 0, 0, 8192); - setup_initrd(0xc0400000, 0x00400000); -#endif -#endif -} - -#define NO_PARAMS 0 -#define NO_VIDEO 0, 0 - -/* - * This is the list of all architectures supported by - * this kernel. This should be integrated with the list - * in head-armv.S. - */ -static struct machine_desc machine_desc[] __initdata = { - { "EBSA110", /* RMK */ - 0x00000400, - NO_VIDEO, - 1, 0, 1, 1, 1, - NULL - }, { "Acorn-RiscPC", /* RMK */ - 0x10000100, - NO_VIDEO, - 1, 1, 0, 0, 0, - fixup_acorn - }, { "unknown", - NO_PARAMS, - NO_VIDEO, - 0, 0, 0, 0, 0, - NULL - }, { "FTV/PCI", /* Philip Blundell */ - NO_PARAMS, - NO_VIDEO, - 0, 0, 0, 0, 0, - NULL - }, { "EBSA285", /* RMK */ - 0x00000100, - 0x000a0000, 0x000bffff, - 0, 0, 0, 0, 0, - fixup_ebsa285 - }, { "Rebel-NetWinder", /* RMK */ - 0x00000100, - 0x000a0000, 0x000bffff, - 1, 0, 1, 0, 0, - fixup_netwinder - }, { "Chalice-CATS", /* Philip Blundell */ - NO_PARAMS, - 0x000a0000, 0x000bffff, - 0, 0, 0, 0, 1, - fixup_cats - }, { "unknown-TBOX", /* Philip Blundell */ - NO_PARAMS, - NO_VIDEO, - 0, 0, 0, 0, 0, - NULL - }, { "co-EBSA285", /* Mark van Doesburg */ - NO_PARAMS, - NO_VIDEO, - 0, 0, 0, 0, 0, - fixup_coebsa285 - }, { "CL-PS7110", /* Werner Almesberger */ - NO_PARAMS, - NO_VIDEO, - 0, 0, 0, 0, 0, - NULL - }, { "Acorn-Archimedes",/* RMK/DAG */ - 0x0207c000, - NO_VIDEO, - 0, 0, 0, 0, 0, - fixup_acorn - }, { "Acorn-A5000", /* RMK/PB */ - 0x0207c000, - NO_VIDEO, - 0, 0, 0, 0, 0, - fixup_acorn - }, { "Etoile", /* Alex de Vries */ - NO_PARAMS, - NO_VIDEO, - 0, 0, 0, 0, 0, - NULL - }, { "LaCie_NAS", /* Benjamin Herrenschmidt */ - NO_PARAMS, - NO_VIDEO, - 0, 0, 0, 0, 0, - NULL - }, { "CL-PS7500", /* Philip Blundell */ - NO_PARAMS, - NO_VIDEO, - 0, 0, 0, 0, 0, - NULL - }, { "Shark", /* Alexander Schulz */ - NO_PARAMS, - /* do you really mean 0x200000? */ - 0x06000000, 0x06000000+0x00200000, - 0, 0, 0, 0, 0, - NULL - }, { "SA1100-based", /* Nicolas Pitre */ - NO_PARAMS, - NO_VIDEO, - 0, 0, 0, 0, 0, - fixup_sa1100 - } -}; - void __init setup_arch(char **cmdline_p) { struct param_struct *params = NULL; struct machine_desc *mdesc; + struct meminfo meminfo; char *from = default_command_line; + memset(&meminfo, 0, sizeof(meminfo)); + #if defined(CONFIG_ARCH_ARC) __machine_arch_type = MACH_TYPE_ARCHIMEDES; #elif defined(CONFIG_ARCH_A5K) @@ -706,7 +460,7 @@ void __init setup_arch(char **cmdline_p) ROOT_DEV = MKDEV(0, 255); - mdesc = machine_desc + machine_arch_type; + mdesc = setup_architecture(machine_arch_type); machine_name = mdesc->name; if (mdesc->broken_hlt) @@ -719,7 +473,7 @@ void __init setup_arch(char **cmdline_p) params = phys_to_virt(mdesc->param_offset); if (mdesc->fixup) - mdesc->fixup(mdesc, params, &from); + mdesc->fixup(mdesc, params, &from, &meminfo); if (params && params->u1.s.page_size != PAGE_SIZE) { printk(KERN_WARNING "Warning: bad configuration page, " @@ -763,11 +517,11 @@ void __init setup_arch(char **cmdline_p) memcpy(saved_command_line, from, COMMAND_LINE_SIZE); saved_command_line[COMMAND_LINE_SIZE-1] = '\0'; - parse_cmdline(cmdline_p, from); - setup_bootmem(); - request_standard_resources(mdesc); + parse_cmdline(&meminfo, cmdline_p, from); + setup_bootmem(&meminfo); + request_standard_resources(&meminfo, mdesc); - paging_init(); + paging_init(&meminfo); #ifdef CONFIG_VT #if defined(CONFIG_VGA_CONSOLE) diff --git a/arch/arm/lib/Makefile b/arch/arm/lib/Makefile index 5046a3377..510a38451 100644 --- a/arch/arm/lib/Makefile +++ b/arch/arm/lib/Makefile @@ -14,37 +14,25 @@ L_OBJS := changebit.o csumipv6.o csumpartial.o csumpartialcopy.o \ O_TARGET := lib.o O_OBJS := backtrace.o delay.o +L_OBJS_arc := io-acorn.o +L_OBJS_a5k := io-acorn.o floppydma.o +L_OBJS_rpc := io-acorn.o floppydma.o +L_OBJS_clps7500 := io-acorn.o +L_OBJS_ebsa110 := io-ebsa110.o +L_OBJS_footbridge := io-footbridge.o +L_OBJS_nexuspci := io-footbridge.o +L_OBJS_sa1100 := io-footbridge.o +L_OBJS_shark := io-shark.o + ifeq ($(PROCESSOR),armo) L_OBJS += uaccess-armo.o endif -ifdef CONFIG_ARCH_ACORN - L_OBJS += io-acorn.o - ifdef CONFIG_ARCH_A5K - L_OBJS += floppydma.o - endif - ifdef CONFIG_ARCH_RPC - L_OBJS += floppydma.o - endif -endif - -ifeq ($(MACHINE),ebsa110) - L_OBJS += io-ebsa110.o -else +ifneq ($(MACHINE),ebsa110) OX_OBJS += io.o endif -ifeq ($(MACHINE),footbridge) - L_OBJS += io-footbridge.o -endif - -# -# SA1100 IO routines happen to be the -# same as the footbridge routines -# -ifeq ($(MACHINE),sa1100) - L_OBJS += io-footbridge.o -endif +L_OBJS += $(L_OBJS_$(MACHINE)) include $(TOPDIR)/Rules.make diff --git a/arch/arm/lib/io-shark.c b/arch/arm/lib/io-shark.c new file mode 100644 index 000000000..41595bc6f --- /dev/null +++ b/arch/arm/lib/io-shark.c @@ -0,0 +1,79 @@ +/* + * linux/arch/arm/lib/io-shark.c + * + * by Alexander.Schulz@stud.uni-karlsruhe.de + * + * derived from: + * linux/arch/arm/lib/io-ebsa.S + * Copyright (C) 1995, 1996 Russell King + */ +#include <linux/kernel.h> + +#include <asm/io.h> + +void print_warning(void) +{ + printk(KERN_WARNING "ins?/outs? not implemented on this architecture\n"); +} + +void insl(unsigned int port, void *to, int len) +{ + print_warning(); +} + +void insb(unsigned int port, void *to, int len) +{ + print_warning(); +} + +void outsl(unsigned int port, const void *from, int len) +{ + print_warning(); +} + +void outsb(unsigned int port, const void *from, int len) +{ + print_warning(); +} + +/* these should be in assembler again */ + +/* + * Purpose: read a block of data from a hardware register to memory. + * Proto : insw(int from_port, void *to, int len_in_words); + * Proto : inswb(int from_port, void *to, int len_in_bytes); + * Notes : increment to + */ + +void insw(unsigned int port, void *to, int len) +{ + int i; + + for (i = 0; i < len; i++) + ((unsigned short *) to)[i] = inw(port); +} + +void inswb(unsigned int port, void *to, int len) +{ + insw(port, to, len >> 2); +} + +/* + * Purpose: write a block of data from memory to a hardware register. + * Proto : outsw(int to_reg, void *from, int len_in_words); + * Proto : outswb(int to_reg, void *from, int len_in_bytes); + * Notes : increments from + */ + +void outsw(unsigned int port, const void *from, int len) +{ + int i; + + for (i = 0; i < len; i++) + outw(((unsigned short *) from)[i], port); +} + +void outswb(unsigned int port, const void *from, int len) +{ + outsw(port, from, len >> 2); +} diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index c58e66647..e7b8c8bb9 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c @@ -33,6 +33,7 @@ #include "map.h" static unsigned long totalram_pages; +struct meminfo meminfo; pgd_t swapper_pg_dir[PTRS_PER_PGD]; /* @@ -160,12 +161,14 @@ void show_mem(void) /* * paging_init() sets up the page tables... */ -void __init paging_init(void) +void __init paging_init(struct meminfo *mi) { void *zero_page, *bad_page, *bad_table; unsigned long zone_size[MAX_NR_ZONES]; int i; + memcpy(&meminfo, mi, sizeof(meminfo)); + #ifdef CONFIG_CPU_32 #define TABLE_OFFSET (PTRS_PER_PTE) #else @@ -197,12 +200,12 @@ void __init paging_init(void) * any problems with DMA or highmem, so all memory is * allocated to the DMA zone. */ - for (i = 0; i < meminfo.nr_banks; i++) { - if (meminfo.bank[i].size) { + for (i = 0; i < mi->nr_banks; i++) { + if (mi->bank[i].size) { unsigned int end; - end = (meminfo.bank[i].start - PHYS_OFFSET + - meminfo.bank[i].size) >> PAGE_SHIFT; + end = (mi->bank[i].start - PHYS_OFFSET + + mi->bank[i].size) >> PAGE_SHIFT; if (zone_size[0] < end) zone_size[0] = end; } @@ -328,24 +331,6 @@ void free_initmem(void) (unsigned long)(&__init_end), "init"); -#ifdef CONFIG_FOOTBRIDGE - { - extern int __netwinder_begin, __netwinder_end, - __ebsa285_begin, __ebsa285_end; - - if (!machine_is_netwinder()) - free_area((unsigned long)(&__netwinder_begin), - (unsigned long)(&__netwinder_end), - "netwinder"); - - if (!machine_is_ebsa285() && !machine_is_cats() && - !machine_is_co285()) - free_area((unsigned long)(&__ebsa285_begin), - (unsigned long)(&__ebsa285_end), - "ebsa285/cats"); - } -#endif - printk("\n"); } diff --git a/arch/arm/mm/proc-arm6,7.S b/arch/arm/mm/proc-arm6,7.S index c6c776acf..9814d2a9c 100644 --- a/arch/arm/mm/proc-arm6,7.S +++ b/arch/arm/mm/proc-arm6,7.S @@ -107,19 +107,45 @@ msg: .ascii "DA*%p=%p\n\0" ENTRY(cpu_arm6_data_abort) ldr r4, [r0] @ read instruction causing problem mov r2, r4, lsr #19 @ r2 b1 = L -Ldata_simple: + and r1, r4, #14 << 24 and r2, r2, #2 @ check read/write bit - mrc p15, 0, r0, c6, c0, 0 @ get FAR + teq r1, #4 << 23 + bne Ldata_simple + + +Ldata_ldmstm: tst r4, #1 << 21 @ check writeback bit + beq Ldata_simple + mov r7, #0x11 + orr r7, r7, r7, lsl #8 + and r0, r4, r7 + and r1, r4, r7, lsl #1 + add r0, r0, r1, lsr #1 + and r1, r4, r7, lsl #2 + add r0, r0, r1, lsr #2 + and r1, r4, r7, lsl #3 + add r0, r0, r1, lsr #3 + add r0, r0, r0, lsr #8 + add r0, r0, r0, lsr #4 + and r7, r0, #15 @ r7 = no. of registers to transfer. + and r5, r4, #15 << 16 @ Get Rn + ldr r0, [sp, r5, lsr #14] @ Get register + tst r4, #1 << 23 @ U bit + subne r7, r0, r7, lsl #2 + addeq r7, r0, r7, lsl #2 @ Do correction (signed) +Ldata_saver7: str r7, [sp, r5, lsr #14] @ Put register +Ldata_simple: mrc p15, 0, r0, c6, c0, 0 @ get FAR mrc p15, 0, r1, c5, c0, 0 @ get FSR - and r1, r1, #15 + and r1, r1, #255 mov pc, lr ENTRY(cpu_arm7_data_abort) ldr r4, [r0] @ read instruction causing problem mov r2, r4, lsr #19 @ r2 b1 = L and r1, r4, #15 << 24 + and r2, r2, #2 @ check read/write bit add pc, pc, r1, lsr #22 @ Now branch to the relevent processing routine movs pc, lr + b Ldata_unknown b Ldata_unknown b Ldata_unknown @@ -141,106 +167,24 @@ Ldata_unknown: @ Part of jumptable mov r2, r3 b baddataabort -Ldata_ldmstm: tst r4, #1 << 21 @ check writeback bit - beq Ldata_simple - - mov r7, #0x11 - orr r7, r7, r7, lsl #8 - and r0, r4, r7 - and r1, r4, r7, lsl #1 - add r0, r0, r1, lsr #1 - and r1, r4, r7, lsl #2 - add r0, r0, r1, lsr #2 - and r1, r4, r7, lsl #3 - add r0, r0, r1, lsr #3 - add r0, r0, r0, lsr #8 - add r0, r0, r0, lsr #4 - and r7, r0, #15 @ r7 = no. of registers to transfer. - and r5, r4, #15 << 16 @ Get Rn - ldr r0, [sp, r5, lsr #14] @ Get register - eor r6, r4, r4, lsl #2 - tst r6, #1 << 23 @ Check inc/dec ^ writeback - rsbeq r7, r7, #0 - add r7, r0, r7, lsl #2 @ Do correction (signed) - str r7, [sp, r5, lsr #14] @ Put register - -Ldata_lateldrpostconst: - movs r1, r4, lsl #20 @ Get offset - beq Ldata_simple @ if offset is zero, no effect - and r5, r4, #15 << 16 @ Get Rn - ldr r0, [sp, r5, lsr #14] - tst r4, #1 << 23 @ U bit - subne r0, r0, r1, lsr #20 - addeq r0, r0, r1, lsr #20 - str r0, [sp, r5, lsr #14] @ Put register - b Ldata_simple Ldata_lateldrpreconst: tst r4, #1 << 21 @ check writeback bit - movnes r1, r4, lsl #20 @ Get offset + beq Ldata_simple +Ldata_lateldrpostconst: + movs r1, r4, lsl #20 @ Get offset beq Ldata_simple and r5, r4, #15 << 16 @ Get Rn ldr r0, [sp, r5, lsr #14] tst r4, #1 << 23 @ U bit - subne r0, r0, r1, lsr #20 - addeq r0, r0, r1, lsr #20 - str r0, [sp, r5, lsr #14] @ Put register - b Ldata_simple - -Ldata_lateldrpostreg: - and r5, r4, #15 - ldr r1, [sp, r5, lsl #2] @ Get Rm - mov r3, r4, lsr #7 - ands r3, r3, #31 - and r6, r4, #0x70 - orreq r6, r6, #8 - add pc, pc, r6 - mov r0, r0 - - mov r1, r1, lsl r3 @ 0: LSL #!0 - b 1f - b 1f @ 1: LSL #0 - mov r0, r0 - b 1f @ 2: MUL? - mov r0, r0 - b 1f @ 3: MUL? - mov r0, r0 - mov r1, r1, lsr r3 @ 4: LSR #!0 - b 1f - mov r1, r1, lsr #32 @ 5: LSR #32 - b 1f - b 1f @ 6: MUL? - mov r0, r0 - b 1f @ 7: MUL? - mov r0, r0 - mov r1, r1, asr r3 @ 8: ASR #!0 - b 1f - mov r1, r1, asr #32 @ 9: ASR #32 - b 1f - b 1f @ A: MUL? - mov r0, r0 - b 1f @ B: MUL? - mov r0, r0 - mov r1, r1, ror r3 @ C: ROR #!0 - b 1f - mov r1, r1, rrx @ D: RRX - b 1f - mov r0, r0 @ E: MUL? - mov r0, r0 - mov r0, r0 @ F: MUL? - - -1: and r5, r4, #15 << 16 @ Get Rn - ldr r0, [sp, r5, lsr #14] - tst r4, #1 << 23 @ U bit - subne r0, r0, r1 - addeq r0, r0, r1 - str r0, [sp, r5, lsr #14] @ Put register - b Ldata_simple + subne r7, r0, r1, lsr #20 + addeq r7, r0, r1, lsr #20 + b Ldata_saver7 Ldata_lateldrprereg: tst r4, #1 << 21 @ check writeback bit beq Ldata_simple +Ldata_lateldrpostreg: and r5, r4, #15 ldr r1, [sp, r5, lsl #2] @ Get Rm mov r3, r4, lsr #7 @@ -286,10 +230,9 @@ Ldata_lateldrprereg: 1: and r5, r4, #15 << 16 @ Get Rn ldr r0, [sp, r5, lsr #14] tst r4, #1 << 23 @ U bit - subne r0, r0, r1 - addeq r0, r0, r1 - str r0, [sp, r5, lsr #14] @ Put register - b Ldata_simple + subne r7, r0, r1 + addeq r7, r0, r1 + b Ldata_saver7 /* * Function: arm6_7_check_bugs (void) diff --git a/arch/arm/vmlinux-armo.lds.in b/arch/arm/vmlinux-armo.lds.in index 94c155232..9d5ee058d 100644 --- a/arch/arm/vmlinux-armo.lds.in +++ b/arch/arm/vmlinux-armo.lds.in @@ -6,76 +6,89 @@ OUTPUT_ARCH(arm) ENTRY(stext) SECTIONS { - . = TEXTADDR; + . = TEXTADDR; - __init_begin = .; /* Init code and data */ - .text.init : { *(.text.init) } - __proc_info_begin = .; - .proc.info : { *(.proc.info) } - __proc_info_end = .; - .data.init : { *(.data.init) } - . = ALIGN(16); - __setup_start = .; - .setup.init : { *(.setup.init) } - __setup_end = .; - __initcall_start = .; - .initcall.init : { *(.initcall.init) } - __initcall_end = .; - . = ALIGN(32768); - __init_end = .; - - .init.task : { - *(.init.task) - } + .init : { + __init_begin = .; /* Init code and data */ + *(.text.init) + __proc_info_begin = .; + *(.proc.info) + __proc_info_end = .; + __arch_info_begin = .; + *(.arch.info) + __arch_info_end = .; + *(.data.init) + . = ALIGN(16); + __setup_start = .; + *(.setup.init) + __setup_end = .; + __initcall_start = .; + *(.initcall.init) + __initcall_end = .; + . = ALIGN(32768); + __init_end = .; + } - /DISCARD/ : { /* Exit code and data */ - *(.text.exit) - *(.data.exit) - } + .init.task : { + *(.init.task) + } - _text = .; /* Text and read-only data */ - .text : { - *(.text) - *(.fixup) - *(.gnu.warning) + /DISCARD/ : { /* Exit code and data */ + *(.text.exit) + *(.data.exit) } - .text.lock : { *(.text.lock) } /* out-of-line lock text */ - .rodata : { *(.rodata) } - .kstrtab : { *(.kstrtab) } + .text : { + _text = .; /* Text and read-only data */ + *(.text) + *(.fixup) + *(.gnu.warning) + *(.text.lock) /* out-of-line lock text */ + *(.rodata) + *(.kstrtab) + . = ALIGN(16); /* Exception table */ + __start___ex_table = .; + *(__ex_table) + __stop___ex_table = .; - . = ALIGN(16); /* Exception table */ - __start___ex_table = .; - __ex_table : { *(__ex_table) } - __stop___ex_table = .; + __start___ksymtab = .; /* Kernel symbol table */ + *(__ksymtab) + __stop___ksymtab = .; - __start___ksymtab = .; /* Kernel symbol table */ - __ksymtab : { *(__ksymtab) } - __stop___ksymtab = .; + *(.got) /* Global offset table */ + + _etext = .; /* End of text section */ + } - .got : { *(.got) } /* Global offset table */ + .data : { + /* + * The cacheline aligned data + */ + . = ALIGN(32); + *(.data.cacheline_aligned) - _etext = .; /* End of text section */ + /* + * and the usual data section + */ + *(.data) + CONSTRUCTORS - .data : { /* Data */ - *(.data) - CONSTRUCTORS + _edata = .; } - _edata = .; /* End of data section */ - __bss_start = .; /* BSS */ - .bss : { - *(.bss) + .bss : { + __bss_start = .; /* BSS */ + *(.bss) + _end = . ; } - _end = . ; - /* Stabs debugging sections. */ - .stab 0 : { *(.stab) } - .stabstr 0 : { *(.stabstr) } - .stab.excl 0 : { *(.stab.excl) } - .stab.exclstr 0 : { *(.stab.exclstr) } - .stab.index 0 : { *(.stab.index) } - .stab.indexstr 0 : { *(.stab.indexstr) } - .comment 0 : { *(.comment) } + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } } diff --git a/arch/arm/vmlinux-armv.lds.in b/arch/arm/vmlinux-armv.lds.in index d2a79ca9d..1476ba939 100644 --- a/arch/arm/vmlinux-armv.lds.in +++ b/arch/arm/vmlinux-armv.lds.in @@ -13,6 +13,9 @@ SECTIONS __proc_info_begin = .; *(.proc.info) __proc_info_end = .; + __arch_info_begin = .; + *(.arch.info) + __arch_info_end = .; *(.data.init) . = ALIGN(16); __setup_start = .; @@ -25,6 +28,11 @@ SECTIONS __init_end = .; } + /DISCARD/ : { /* Exit code and data */ + *(.text.exit) + *(.data.exit) + } + .text : { /* Real text segment */ _text = .; /* Text and read-only data */ *(.text) diff --git a/arch/i386/boot/tools/build.c b/arch/i386/boot/tools/build.c index bf16abf24..2149dcf51 100644 --- a/arch/i386/boot/tools/build.c +++ b/arch/i386/boot/tools/build.c @@ -150,9 +150,13 @@ int main(int argc, char ** argv) sz = sb.st_size; fprintf (stderr, "System is %d kB\n", sz/1024); sys_size = (sz + 15) / 16; - if (sys_size > (is_big_kernel ? 0xffff : DEF_SYSSIZE)) + /* 0x28000*16 = 2.5 MB, conservative estimate for the current maximum */ + if (sys_size > (is_big_kernel ? 0x28000 : DEF_SYSSIZE)) die("System is too big. Try using %smodules.", is_big_kernel ? "" : "bzImage or "); + if (sys_size > 0xffff) + fprintf(stderr,"warning: kernel is too big for standalone boot " + "from floppy\n"); while (sz > 0) { int l, n; diff --git a/arch/i386/config.in b/arch/i386/config.in index e1ba021e1..2a083ad09 100644 --- a/arch/i386/config.in +++ b/arch/i386/config.in @@ -175,6 +175,19 @@ fi source drivers/telephony/Config.in mainmenu_option next_comment +comment 'ATA/IDE/MFM/RLL support' + +tristate 'ATA/IDE/MFM/RLL support' CONFIG_IDE + +if [ "$CONFIG_IDE" != "n" ]; then + source drivers/ide/Config.in +else + define_bool CONFIG_BLK_DEV_IDE_MODES n + define_bool CONFIG_BLK_DEV_HD n +fi +endmenu + +mainmenu_option next_comment comment 'SCSI support' tristate 'SCSI support' CONFIG_SCSI diff --git a/arch/i386/defconfig b/arch/i386/defconfig index 813a2ecea..0f3f5cb8a 100644 --- a/arch/i386/defconfig +++ b/arch/i386/defconfig @@ -93,36 +93,10 @@ CONFIG_ISAPNP=y # Block devices # CONFIG_BLK_DEV_FD=y -CONFIG_BLK_DEV_IDE=y - -# -# Please see Documentation/ide.txt for help/info on IDE drives -# -# CONFIG_BLK_DEV_HD_IDE is not set -CONFIG_BLK_DEV_IDEDISK=y -# CONFIG_IDEDISK_MULTI_MODE is not set -# CONFIG_BLK_DEV_IDECS is not set -CONFIG_BLK_DEV_IDECD=y -# CONFIG_BLK_DEV_IDETAPE is not set -# CONFIG_BLK_DEV_IDEFLOPPY is not set -# CONFIG_BLK_DEV_IDESCSI is not set - -# -# IDE chipset support/bugfixes -# -CONFIG_BLK_DEV_CMD640=y -# CONFIG_BLK_DEV_CMD640_ENHANCED is not set -# CONFIG_BLK_DEV_ISAPNP is not set -CONFIG_BLK_DEV_RZ1000=y -CONFIG_BLK_DEV_IDEPCI=y -CONFIG_IDEPCI_SHARE_IRQ=y -# CONFIG_BLK_DEV_IDEDMA_PCI is not set -# CONFIG_BLK_DEV_OFFBOARD is not set -# CONFIG_BLK_DEV_AEC6210 is not set -# CONFIG_BLK_DEV_CMD64X is not set -# CONFIG_BLK_DEV_CS5530 is not set -# CONFIG_IDE_CHIPSETS is not set +# CONFIG_BLK_DEV_XD is not set +# CONFIG_PARIDE is not set # CONFIG_BLK_CPQ_DA is not set +# CONFIG_BLK_DEV_DAC960 is not set # # Additional Block Devices @@ -131,11 +105,6 @@ CONFIG_IDEPCI_SHARE_IRQ=y # CONFIG_BLK_DEV_NBD is not set # CONFIG_BLK_DEV_MD is not set # CONFIG_BLK_DEV_RAM is not set -# CONFIG_BLK_DEV_XD is not set -# CONFIG_BLK_DEV_DAC960 is not set -# CONFIG_PARIDE is not set -CONFIG_BLK_DEV_IDE_MODES=y -# CONFIG_BLK_DEV_HD is not set # # Networking options @@ -175,6 +144,73 @@ CONFIG_SKB_LARGE=y # CONFIG_PHONE_IXJ is not set # +# ATA/IDE/MFM/RLL support +# +CONFIG_IDE=y + +# +# IDE, ATA and ATAPI Block devices +# +CONFIG_BLK_DEV_IDE=y + +# +# Please see Documentation/ide.txt for help/info on IDE drives +# +# CONFIG_BLK_DEV_HD_IDE is not set +# CONFIG_BLK_DEV_HD is not set +CONFIG_BLK_DEV_IDEDISK=y +# CONFIG_IDEDISK_MULTI_MODE is not set +# CONFIG_BLK_DEV_IDECS is not set +CONFIG_BLK_DEV_IDECD=y +# CONFIG_BLK_DEV_IDETAPE is not set +# CONFIG_BLK_DEV_IDEFLOPPY is not set +# CONFIG_BLK_DEV_IDESCSI is not set + +# +# IDE chipset support/bugfixes +# +CONFIG_BLK_DEV_CMD640=y +# CONFIG_BLK_DEV_CMD640_ENHANCED is not set +# CONFIG_BLK_DEV_ISAPNP is not set +CONFIG_BLK_DEV_RZ1000=y +CONFIG_BLK_DEV_IDEPCI=y +CONFIG_IDEPCI_SHARE_IRQ=y +# CONFIG_BLK_DEV_IDEDMA_PCI is not set +# CONFIG_BLK_DEV_OFFBOARD is not set +# CONFIG_IDEDMA_PCI_AUTO is not set +# CONFIG_BLK_DEV_IDEDMA is not set +# CONFIG_IDEDMA_AUTO is not set +# CONFIG_IDEDMA_PCI_EXPERIMENTAL is not set +# CONFIG_IDEDMA_PCI_WIP is not set +# CONFIG_IDEDMA_NEW_DRIVE_LISTINGS is not set +# CONFIG_BLK_DEV_AEC6210 is not set +# CONFIG_AEC6210_TUNING is not set +# CONFIG_BLK_DEV_ALI15X3 is not set +# CONFIG_BLK_DEV_AMD7409 is not set +# CONFIG_AMD7409_OVERRIDE is not set +# CONFIG_BLK_DEV_CMD64X is not set +# CONFIG_CMD64X_RAID is not set +# CONFIG_BLK_DEV_CY82C693 is not set +# CONFIG_BLK_DEV_CS5530 is not set +# CONFIG_BLK_DEV_HPT34X is not set +# CONFIG_HPT34X_AUTODMA is not set +# CONFIG_BLK_DEV_HPT366 is not set +# CONFIG_HPT366_FIP is not set +# CONFIG_HPT366_MODE3 is not set +# CONFIG_BLK_DEV_PIIX is not set +# CONFIG_PIIX_TUNING is not set +# CONFIG_BLK_DEV_NS87415 is not set +# CONFIG_BLK_DEV_OPTI621 is not set +# CONFIG_BLK_DEV_PDC202XX is not set +# CONFIG_PDC202XX_BURST is not set +# CONFIG_PDC202XX_MASTER is not set +# CONFIG_BLK_DEV_SIS5513 is not set +# CONFIG_BLK_DEV_TRM290 is not set +# CONFIG_BLK_DEV_VIA82CXXX is not set +# CONFIG_IDE_CHIPSETS is not set +CONFIG_BLK_DEV_IDE_MODES=y + +# # SCSI support # CONFIG_SCSI=y @@ -339,7 +375,6 @@ CONFIG_PCMCIA_PCNET=y # CONFIG_PCMCIA_XIRC2PS is not set # CONFIG_ARCNET_COM20020_CS is not set # CONFIG_PCMCIA_3C575 is not set -# CONFIG_PCMCIA_TULIP is not set CONFIG_NET_PCMCIA_RADIO=y CONFIG_PCMCIA_RAYCS=y # CONFIG_PCMCIA_NETWAVE is not set diff --git a/arch/i386/kernel/Makefile b/arch/i386/kernel/Makefile index 6671bb35b..525bb2c07 100644 --- a/arch/i386/kernel/Makefile +++ b/arch/i386/kernel/Makefile @@ -29,7 +29,7 @@ endif endif ifdef CONFIG_MCA -O_OBJS += mca.o +OX_OBJS += mca.o endif ifeq ($(CONFIG_MTRR),y) diff --git a/arch/i386/kernel/acpi.c b/arch/i386/kernel/acpi.c index d95bbe6b1..8efa2832a 100644 --- a/arch/i386/kernel/acpi.c +++ b/arch/i386/kernel/acpi.c @@ -1,7 +1,7 @@ /* * acpi.c - Linux ACPI driver * - * Copyright (C) 1999 Andrew Henroid + * Copyright (C) 1999-2000 Andrew Henroid * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -55,6 +55,11 @@ static int acpi_do_ulong(ctl_table *ctl, struct file *file, void *buffer, size_t *len); +static int acpi_do_table(ctl_table *ctl, + int write, + struct file *file, + void *buffer, + size_t *len); static int acpi_do_event_reg(ctl_table *ctl, int write, struct file *file, @@ -73,12 +78,6 @@ static int acpi_do_sleep(ctl_table *ctl, static struct ctl_table_header *acpi_sysctl = NULL; -static struct acpi_facp *acpi_facp = NULL; -static int acpi_fake_facp = 0; -static struct acpi_facs *acpi_facs = NULL; -static unsigned long acpi_facp_addr = 0; -static unsigned long acpi_dsdt_addr = 0; - // current system sleep state (S0 - S4) static acpi_sstate_t acpi_sleep_state = ACPI_S0; // time sleep began @@ -123,15 +122,28 @@ static unsigned long acpi_slp_typ[] = ACPI_SLP_TYP_DISABLED /* S5 */ }; +struct acpi_table_info +{ + u32 expected_signature; + u32 expected_size; + + struct acpi_table *table; + size_t size; + int mapped; +}; + +static struct acpi_table_info acpi_facp + = {ACPI_FACP_SIG, sizeof(struct acpi_facp), NULL, 0, 0}; +static struct acpi_table_info acpi_dsdt = {ACPI_DSDT_SIG, 0, NULL, 0, 0}; +static struct acpi_table_info acpi_facs + = {ACPI_FACS_SIG, sizeof(struct acpi_facs), NULL, 0, 0}; +static rwlock_t acpi_do_table_lock = RW_LOCK_UNLOCKED; + static struct ctl_table acpi_table[] = { - {ACPI_FACP, "facp", - &acpi_facp_addr, sizeof(acpi_facp_addr), - 0400, NULL, &acpi_do_ulong}, + {ACPI_FACP, "facp", &acpi_facp, 0, 0644, NULL, &acpi_do_table}, - {ACPI_DSDT, "dsdt", - &acpi_dsdt_addr, sizeof(acpi_dsdt_addr), - 0400, NULL, &acpi_do_ulong}, + {ACPI_DSDT, "dsdt", &acpi_dsdt, 0, 0644, NULL, &acpi_do_table}, {ACPI_PM1_ENABLE, "pm1_enable", NULL, 0, @@ -409,6 +421,33 @@ static void acpi_unmap_table(struct acpi_table *table) } /* + * Initialize an ACPI table + */ +static void acpi_init_table(struct acpi_table_info *info, + void *data, + int mapped) +{ + struct acpi_table *table = (struct acpi_table*) data; + info->table = table; + info->size = (size_t)(table ? table->length:0); + info->mapped = mapped; +} + +/* + * Destroy an ACPI table + */ +static void acpi_destroy_table(struct acpi_table_info *info) +{ + if (info->table) { + if (info->mapped) + acpi_unmap_table(info->table); + else + kfree(info->table); + info->table = NULL; + } +} + +/* * Locate and map ACPI tables */ static int __init acpi_find_tables(void) @@ -458,37 +497,40 @@ static int __init acpi_find_tables(void) return -ENODEV; } // search RSDT for FACP - acpi_facp = NULL; + acpi_facp.table = NULL; rsdt_entry = (u32 *) (rsdt + 1); rsdt_entry_count = (int) ((rsdt->length - sizeof(*rsdt)) >> 2); while (rsdt_entry_count) { struct acpi_table *dt = acpi_map_table(*rsdt_entry); if (dt && dt->signature == ACPI_FACP_SIG) { - acpi_facp = (struct acpi_facp*) dt; - acpi_facp_addr = *rsdt_entry; - acpi_dsdt_addr = acpi_facp->dsdt; + struct acpi_facp *facp = (struct acpi_facp*) dt; + acpi_init_table(&acpi_facp, dt, 1); + + // map DSDT if it exists + dt = acpi_map_table(facp->dsdt); + if (dt && dt->signature == ACPI_DSDT_SIG) + acpi_init_table(&acpi_dsdt, dt, 1); + else + acpi_unmap_table(dt); // map FACS if it exists - if (acpi_facp->facs) { - dt = acpi_map_table(acpi_facp->facs); - if (dt && dt->signature == ACPI_FACS_SIG) { - acpi_facs = (struct acpi_facs*) dt; - } - else { - acpi_unmap_table(dt); - } - } + dt = acpi_map_table(facp->facs); + if (dt && dt->signature == ACPI_FACS_SIG) + acpi_init_table(&acpi_facs, dt, 1); + else + acpi_unmap_table(dt); } else { acpi_unmap_table(dt); } + rsdt_entry++; rsdt_entry_count--; } acpi_unmap_table(rsdt); - if (!acpi_facp) { + if (!acpi_facp.table) { printk(KERN_ERR "ACPI: missing FACP\n"); return -ENODEV; } @@ -500,11 +542,9 @@ static int __init acpi_find_tables(void) */ static void acpi_destroy_tables(void) { - if (!acpi_fake_facp) - acpi_unmap_table((struct acpi_table*) acpi_facp); - else - kfree(acpi_facp); - acpi_unmap_table((struct acpi_table*) acpi_facs); + acpi_destroy_table(&acpi_facs); + acpi_destroy_table(&acpi_dsdt); + acpi_destroy_table(&acpi_facp); } /* @@ -512,6 +552,7 @@ static void acpi_destroy_tables(void) */ static int __init acpi_init_piix4(struct pci_dev *dev) { + struct acpi_facp *facp; u32 base; u16 cmd; u8 pmregmisc; @@ -534,33 +575,34 @@ static int __init acpi_init_piix4(struct pci_dev *dev) printk(KERN_INFO "ACPI: found PIIX4 at 0x%04x\n", base); - acpi_facp = kmalloc(sizeof(struct acpi_facp), GFP_KERNEL); - if (!acpi_facp) + facp = kmalloc(sizeof(struct acpi_facp), GFP_KERNEL); + if (!facp) return -ENOMEM; - acpi_fake_facp = 1; - memset(acpi_facp, 0, sizeof(struct acpi_facp)); - acpi_facp->int_model = ACPI_PIIX4_INT_MODEL; - acpi_facp->sci_int = ACPI_PIIX4_SCI_INT; - acpi_facp->smi_cmd = ACPI_PIIX4_SMI_CMD; - acpi_facp->acpi_enable = ACPI_PIIX4_ACPI_ENABLE; - acpi_facp->acpi_disable = ACPI_PIIX4_ACPI_DISABLE; - acpi_facp->s4bios_req = ACPI_PIIX4_S4BIOS_REQ; - acpi_facp->pm1a_evt = base + ACPI_PIIX4_PM1_EVT; - acpi_facp->pm1a_cnt = base + ACPI_PIIX4_PM1_CNT; - acpi_facp->pm2_cnt = ACPI_PIIX4_PM2_CNT; - acpi_facp->pm_tmr = base + ACPI_PIIX4_PM_TMR; - acpi_facp->gpe0 = base + ACPI_PIIX4_GPE0; - acpi_facp->pm1_evt_len = ACPI_PIIX4_PM1_EVT_LEN; - acpi_facp->pm1_cnt_len = ACPI_PIIX4_PM1_CNT_LEN; - acpi_facp->pm2_cnt_len = ACPI_PIIX4_PM2_CNT_LEN; - acpi_facp->pm_tm_len = ACPI_PIIX4_PM_TM_LEN; - acpi_facp->gpe0_len = ACPI_PIIX4_GPE0_LEN; - acpi_facp->p_lvl2_lat = (__u16) ACPI_INFINITE_LAT; - acpi_facp->p_lvl3_lat = (__u16) ACPI_INFINITE_LAT; - - acpi_facp_addr = virt_to_phys(acpi_facp); - acpi_dsdt_addr = 0; + memset(facp, 0, sizeof(struct acpi_facp)); + facp->hdr.signature = ACPI_FACP_SIG; + facp->hdr.length = sizeof(struct acpi_facp); + facp->int_model = ACPI_PIIX4_INT_MODEL; + facp->sci_int = ACPI_PIIX4_SCI_INT; + facp->smi_cmd = ACPI_PIIX4_SMI_CMD; + facp->acpi_enable = ACPI_PIIX4_ACPI_ENABLE; + facp->acpi_disable = ACPI_PIIX4_ACPI_DISABLE; + facp->s4bios_req = ACPI_PIIX4_S4BIOS_REQ; + facp->pm1a_evt = base + ACPI_PIIX4_PM1_EVT; + facp->pm1a_cnt = base + ACPI_PIIX4_PM1_CNT; + facp->pm2_cnt = ACPI_PIIX4_PM2_CNT; + facp->pm_tmr = base + ACPI_PIIX4_PM_TMR; + facp->gpe0 = base + ACPI_PIIX4_GPE0; + facp->pm1_evt_len = ACPI_PIIX4_PM1_EVT_LEN; + facp->pm1_cnt_len = ACPI_PIIX4_PM1_CNT_LEN; + facp->pm2_cnt_len = ACPI_PIIX4_PM2_CNT_LEN; + facp->pm_tm_len = ACPI_PIIX4_PM_TM_LEN; + facp->gpe0_len = ACPI_PIIX4_GPE0_LEN; + facp->p_lvl2_lat = (__u16) ACPI_INFINITE_LAT; + facp->p_lvl3_lat = (__u16) ACPI_INFINITE_LAT; + + acpi_init_table(&acpi_facp, facp, 0); + acpi_init_table(&acpi_dsdt, NULL, 0); acpi_p_blk = base + ACPI_PIIX4_P_BLK; @@ -572,6 +614,7 @@ static int __init acpi_init_piix4(struct pci_dev *dev) */ static int __init acpi_init_via(struct pci_dev *dev) { + struct acpi_facp *facp; u32 base; u8 tmp, irq; @@ -594,39 +637,39 @@ static int __init acpi_init_via(struct pci_dev *dev) printk(KERN_INFO "ACPI: found %s at 0x%04x\n", dev->name, base); - acpi_facp = kmalloc(sizeof(struct acpi_facp), GFP_KERNEL); - if (!acpi_facp) + facp = kmalloc(sizeof(struct acpi_facp), GFP_KERNEL); + if (!facp) return -ENOMEM; - acpi_fake_facp = 1; - memset(acpi_facp, 0, sizeof(struct acpi_facp)); - - acpi_facp->int_model = ACPI_VIA_INT_MODEL; - acpi_facp->sci_int = irq; - acpi_facp->smi_cmd = base + ACPI_VIA_SMI_CMD; - acpi_facp->acpi_enable = ACPI_VIA_ACPI_ENABLE; - acpi_facp->acpi_disable = ACPI_VIA_ACPI_DISABLE; - acpi_facp->pm1a_evt = base + ACPI_VIA_PM1_EVT; - acpi_facp->pm1a_cnt = base + ACPI_VIA_PM1_CNT; - acpi_facp->pm_tmr = base + ACPI_VIA_PM_TMR; - acpi_facp->gpe0 = base + ACPI_VIA_GPE0; - - acpi_facp->pm1_evt_len = ACPI_VIA_PM1_EVT_LEN; - acpi_facp->pm1_cnt_len = ACPI_VIA_PM1_CNT_LEN; - acpi_facp->pm_tm_len = ACPI_VIA_PM_TM_LEN; - acpi_facp->gpe0_len = ACPI_VIA_GPE0_LEN; - acpi_facp->p_lvl2_lat = (__u16) ACPI_INFINITE_LAT; - acpi_facp->p_lvl3_lat = (__u16) ACPI_INFINITE_LAT; - - acpi_facp->duty_offset = ACPI_VIA_DUTY_OFFSET; - acpi_facp->duty_width = ACPI_VIA_DUTY_WIDTH; - - acpi_facp->day_alarm = ACPI_VIA_DAY_ALARM; - acpi_facp->mon_alarm = ACPI_VIA_MON_ALARM; - acpi_facp->century = ACPI_VIA_CENTURY; - - acpi_facp_addr = virt_to_phys(acpi_facp); - acpi_dsdt_addr = 0; + memset(facp, 0, sizeof(struct acpi_facp)); + facp->hdr.signature = ACPI_FACP_SIG; + facp->hdr.length = sizeof(struct acpi_facp); + facp->int_model = ACPI_VIA_INT_MODEL; + facp->sci_int = irq; + facp->smi_cmd = base + ACPI_VIA_SMI_CMD; + facp->acpi_enable = ACPI_VIA_ACPI_ENABLE; + facp->acpi_disable = ACPI_VIA_ACPI_DISABLE; + facp->pm1a_evt = base + ACPI_VIA_PM1_EVT; + facp->pm1a_cnt = base + ACPI_VIA_PM1_CNT; + facp->pm_tmr = base + ACPI_VIA_PM_TMR; + facp->gpe0 = base + ACPI_VIA_GPE0; + + facp->pm1_evt_len = ACPI_VIA_PM1_EVT_LEN; + facp->pm1_cnt_len = ACPI_VIA_PM1_CNT_LEN; + facp->pm_tm_len = ACPI_VIA_PM_TM_LEN; + facp->gpe0_len = ACPI_VIA_GPE0_LEN; + facp->p_lvl2_lat = (__u16) ACPI_INFINITE_LAT; + facp->p_lvl3_lat = (__u16) ACPI_INFINITE_LAT; + + facp->duty_offset = ACPI_VIA_DUTY_OFFSET; + facp->duty_width = ACPI_VIA_DUTY_WIDTH; + + facp->day_alarm = ACPI_VIA_DAY_ALARM; + facp->mon_alarm = ACPI_VIA_MON_ALARM; + facp->century = ACPI_VIA_CENTURY; + + acpi_init_table(&acpi_facp, facp, 0); + acpi_init_table(&acpi_dsdt, NULL, 0); acpi_p_blk = base + ACPI_VIA_P_BLK; @@ -693,29 +736,27 @@ static int __init acpi_find_chipset(void) */ static void acpi_irq(int irq, void *dev_id, struct pt_regs *regs) { + struct acpi_facp *facp = (struct acpi_facp*) acpi_facp.table; u32 pm1_status, gpe_status, gpe_level, gpe_edge; unsigned long flags; // detect and clear fixed events - pm1_status = (acpi_read_pm1_status(acpi_facp) - & acpi_read_pm1_enable(acpi_facp)); - acpi_write_pm1_status(acpi_facp, pm1_status); + pm1_status = (acpi_read_pm1_status(facp) & acpi_read_pm1_enable(facp)); + acpi_write_pm1_status(facp, pm1_status); // detect and handle general-purpose events - gpe_status = (acpi_read_gpe_status(acpi_facp) - & acpi_read_gpe_enable(acpi_facp)); + gpe_status = (acpi_read_gpe_status(facp) & acpi_read_gpe_enable(facp)); gpe_level = gpe_status & acpi_gpe_level; if (gpe_level) { // disable level-triggered events (re-enabled after handling) - acpi_write_gpe_enable( - acpi_facp, - acpi_read_gpe_enable(acpi_facp) & ~gpe_level); + acpi_write_gpe_enable(facp, + acpi_read_gpe_enable(facp) & ~gpe_level); } gpe_edge = gpe_status & ~gpe_level; if (gpe_edge) { // clear edge-triggered events - while (acpi_read_gpe_status(acpi_facp) & gpe_edge) - acpi_write_gpe_status(acpi_facp, gpe_edge); + while (acpi_read_gpe_status(facp) & gpe_edge) + acpi_write_gpe_status(facp, gpe_edge); } // notify process waiting on /dev/acpi @@ -804,7 +845,7 @@ static void wake_on_busmaster(struct acpi_facp *facp) static void acpi_idle(void) { static int sleep_level = 1; - struct acpi_facp *facp = acpi_facp; + struct acpi_facp *facp = (struct acpi_facp*) acpi_facp.table; if (!facp || !facp->pm_tmr || !acpi_p_blk) goto not_initialized; @@ -973,6 +1014,7 @@ static void acpi_enter_sx(acpi_sstate_t state) { unsigned long slp_typ = acpi_slp_typ[(int) state]; if (slp_typ != ACPI_SLP_TYP_DISABLED) { + struct acpi_facp *facp = (struct acpi_facp*) acpi_facp.table; u16 typa, typb, value; // bits 8-15 are SLP_TYPa, bits 0-7 are SLP_TYPb @@ -987,20 +1029,20 @@ static void acpi_enter_sx(acpi_sstate_t state) acpi_sleep_state = state; // clear wake status - acpi_write_pm1_status(acpi_facp, ACPI_WAK); + acpi_write_pm1_status(facp, ACPI_WAK); // set SLP_TYPa/b and SLP_EN - if (acpi_facp->pm1a_cnt) { - value = inw(acpi_facp->pm1a_cnt) & ~ACPI_SLP_TYP_MASK; - outw(value | typa | ACPI_SLP_EN, acpi_facp->pm1a_cnt); + if (facp->pm1a_cnt) { + value = inw(facp->pm1a_cnt) & ~ACPI_SLP_TYP_MASK; + outw(value | typa | ACPI_SLP_EN, facp->pm1a_cnt); } - if (acpi_facp->pm1b_cnt) { - value = inw(acpi_facp->pm1b_cnt) & ~ACPI_SLP_TYP_MASK; - outw(value | typb | ACPI_SLP_EN, acpi_facp->pm1b_cnt); + if (facp->pm1b_cnt) { + value = inw(facp->pm1b_cnt) & ~ACPI_SLP_TYP_MASK; + outw(value | typb | ACPI_SLP_EN, facp->pm1b_cnt); } // wait until S1 is entered - while (!(acpi_read_pm1_status(acpi_facp) & ACPI_WAK)) ; + while (!(acpi_read_pm1_status(facp) & ACPI_WAK)) ; // finished sleeping, update system time acpi_update_clock(); acpi_enter_dx(ACPI_D0); @@ -1115,6 +1157,120 @@ static int acpi_do_ulong(ctl_table *ctl, } /* + * Determine if user buffer contains a valid table + */ +static int acpi_verify_table(void *buffer, + size_t size, + struct acpi_table_info *info) +{ + if (size < sizeof(struct acpi_table)) + return -EINVAL; + else if (verify_area(VERIFY_READ, buffer, size)) + return -EFAULT; + else { + struct acpi_table hdr; + size_t table_size; + + copy_from_user(&hdr, buffer, sizeof(hdr)); + table_size = (size_t) hdr.length; + if (hdr.signature != info->expected_signature + || table_size < size + || (info->expected_size + && table_size != info->expected_size)) + return -EINVAL; + } + return 0; +} + +/* + * Examine/replace an ACPI table + */ +static int acpi_do_table(ctl_table *ctl, + int write, + struct file *file, + void *buffer, + size_t *len) +{ + struct acpi_table_info *info = (struct acpi_table_info *) ctl->data; + u8 *data = NULL; + size_t size = 0; + int error = 0; + + if (!info) { + *len = 0; + return 0; + } + + if (!write) { + // table read + read_lock(&acpi_do_table_lock); + if (info->table && file->f_pos < info->size) { + data = (u8*) info->table + file->f_pos; + size = info->size - file->f_pos; + if (size > *len) + size = *len; + if (copy_to_user(buffer, data, size)) + error = -EFAULT; + } + read_unlock(&acpi_do_table_lock); + } + else if (file->f_pos) { + // table body replacement + write_lock(&acpi_do_table_lock); + if (info->table && file->f_pos < info->size) { + data = (u8*) info->table + file->f_pos; + size = info->size - file->f_pos; + if (size > *len) + size = *len; + if (copy_from_user(data, buffer, size)) + error = -EFAULT; + } + write_unlock(&acpi_do_table_lock); + } + else { + // table header/body replacement + struct acpi_table hdr; + size_t table_size; + + // make sure we are being given a valid table + error = acpi_verify_table(buffer, *len, info); + if (error) + return error; + copy_from_user(&hdr, buffer, sizeof(hdr)); + table_size = (size_t) hdr.length; + + write_lock(&acpi_do_table_lock); + + data = (u8*) info->table; + size = *len; + + if (!data || info->mapped || table_size != info->size) { + // allocate a (different sized) table + data = kmalloc(table_size, GFP_KERNEL); + if (data) { + memset(data, 0, table_size); + memcpy(data, &hdr, sizeof(hdr)); + acpi_destroy_table(info); + acpi_init_table(info, data, 0); + } + else + error = -ENOMEM; + } + if (data) + copy_from_user(data, buffer, size); + + write_unlock(&acpi_do_table_lock); + } + + if (error) + return error; + + *len = size; + file->f_pos += size; + return 0; +} + +/* * Examine/modify event register */ static int acpi_do_event_reg(ctl_table *ctl, @@ -1123,6 +1279,7 @@ static int acpi_do_event_reg(ctl_table *ctl, void *buffer, size_t *len) { + struct acpi_facp *facp = (struct acpi_facp*) acpi_facp.table; char str[2 * sizeof(u32) + 4], *strend; u32 val, enabling; int size; @@ -1136,10 +1293,10 @@ static int acpi_do_event_reg(ctl_table *ctl, val = 0; switch (ctl->ctl_name) { case ACPI_PM1_ENABLE: - val = acpi_read_pm1_enable(acpi_facp); + val = acpi_read_pm1_enable(facp); break; case ACPI_GPE_ENABLE: - val = acpi_read_gpe_enable(acpi_facp); + val = acpi_read_gpe_enable(facp); break; case ACPI_GPE_LEVEL: val = acpi_gpe_level; @@ -1170,42 +1327,41 @@ static int acpi_do_event_reg(ctl_table *ctl, switch (ctl->ctl_name) { case ACPI_PM1_ENABLE: // clear previously disabled events - enabling = (val - & ~acpi_read_pm1_enable(acpi_facp)); - acpi_write_pm1_status(acpi_facp, enabling); + enabling = (val & ~acpi_read_pm1_enable(facp)); + acpi_write_pm1_status(facp, enabling); if (val) { // enable ACPI unless it is already - if (!acpi_is_enabled(acpi_facp)) - acpi_enable(acpi_facp); + if (!acpi_is_enabled(facp)) + acpi_enable(facp); } - else if (!acpi_read_gpe_enable(acpi_facp)) { + else if (!acpi_read_gpe_enable(facp)) { // disable ACPI unless it is already - if (acpi_is_enabled(acpi_facp)) - acpi_disable(acpi_facp); + if (acpi_is_enabled(facp)) + acpi_disable(facp); } - acpi_write_pm1_enable(acpi_facp, val); + acpi_write_pm1_enable(facp, val); break; case ACPI_GPE_ENABLE: // clear previously disabled events enabling = (val - & ~acpi_read_gpe_enable(acpi_facp)); - while (acpi_read_gpe_status(acpi_facp) & enabling) - acpi_write_gpe_status(acpi_facp, enabling); + & ~acpi_read_gpe_enable(facp)); + while (acpi_read_gpe_status(facp) & enabling) + acpi_write_gpe_status(facp, enabling); if (val) { // enable ACPI unless it is already - if (!acpi_is_enabled(acpi_facp)) - acpi_enable(acpi_facp); + if (!acpi_is_enabled(facp)) + acpi_enable(facp); } - else if (!acpi_read_pm1_enable(acpi_facp)) { + else if (!acpi_read_pm1_enable(facp)) { // disable ACPI unless it is already - if (acpi_is_enabled(acpi_facp)) - acpi_disable(acpi_facp); + if (acpi_is_enabled(facp)) + acpi_disable(facp); } - acpi_write_gpe_enable(acpi_facp, val); + acpi_write_gpe_enable(facp, val); break; case ACPI_GPE_LEVEL: acpi_gpe_level = val; @@ -1301,8 +1457,9 @@ static int acpi_do_sleep(ctl_table *ctl, */ static int __init acpi_init(void) { - switch(acpi_enabled) - { + struct acpi_facp *facp = NULL; + + switch (acpi_enabled) { case ACPI_ENABLED: if (acpi_find_tables() && acpi_find_chipset()) return -ENODEV; @@ -1319,37 +1476,39 @@ static int __init acpi_init(void) return -ENODEV; } + facp = (struct acpi_facp*) acpi_facp.table; + /* * Internally we always keep latencies in timer * ticks, which is simpler and more consistent (what is * an uS to us?). Besides, that gives people more * control in the /proc interfaces. */ - if (acpi_facp->p_lvl2_lat - && acpi_facp->p_lvl2_lat <= ACPI_MAX_P_LVL2_LAT) { - acpi_p_lvl2_lat = ACPI_uS_TO_TMR_TICKS(acpi_facp->p_lvl2_lat); + if (facp->p_lvl2_lat + && facp->p_lvl2_lat <= ACPI_MAX_P_LVL2_LAT) { + acpi_p_lvl2_lat = ACPI_uS_TO_TMR_TICKS(facp->p_lvl2_lat); acpi_enter_lvl2_lat = ACPI_uS_TO_TMR_TICKS(ACPI_TMR_HZ / 1000); } - if (acpi_facp->p_lvl3_lat - && acpi_facp->p_lvl3_lat <= ACPI_MAX_P_LVL3_LAT) { - acpi_p_lvl3_lat = ACPI_uS_TO_TMR_TICKS(acpi_facp->p_lvl3_lat); + if (facp->p_lvl3_lat + && facp->p_lvl3_lat <= ACPI_MAX_P_LVL3_LAT) { + acpi_p_lvl3_lat = ACPI_uS_TO_TMR_TICKS(facp->p_lvl3_lat); acpi_enter_lvl3_lat - = ACPI_uS_TO_TMR_TICKS(acpi_facp->p_lvl3_lat * 5); + = ACPI_uS_TO_TMR_TICKS(facp->p_lvl3_lat * 5); } - if (acpi_claim_ioports(acpi_facp)) { + if (acpi_claim_ioports(facp)) { printk(KERN_ERR "ACPI: I/O port allocation failed\n"); goto err_out; } - if (acpi_facp->sci_int - && request_irq(acpi_facp->sci_int, + if (facp->sci_int + && request_irq(facp->sci_int, acpi_irq, SA_INTERRUPT | SA_SHIRQ, "acpi", - acpi_facp)) { + &acpi_facp)) { printk(KERN_ERR "ACPI: SCI (IRQ%d) allocation failed\n", - acpi_facp->sci_int); + facp->sci_int); goto err_out; } @@ -1369,7 +1528,7 @@ static int __init acpi_init(void) return 0; #endif - if (acpi_facp->pm_tmr) + if (facp->pm_tmr) pm_idle = acpi_idle; return 0; @@ -1387,16 +1546,18 @@ err_out: */ static void __exit acpi_exit(void) { + struct acpi_facp *facp = (struct acpi_facp*) acpi_facp.table; + pm_idle = NULL; pm_active = 0; pm_power_off = NULL; unregister_sysctl_table(acpi_sysctl); - acpi_disable(acpi_facp); - acpi_release_ioports(acpi_facp); + acpi_disable(facp); + acpi_release_ioports(facp); - if (acpi_facp->sci_int) - free_irq(acpi_facp->sci_int, acpi_facp); + if (facp->sci_int) + free_irq(facp->sci_int, &acpi_facp); acpi_destroy_tables(); @@ -1429,3 +1590,4 @@ __setup("acpi=", acpi_setup); module_init(acpi_init); module_exit(acpi_exit); + diff --git a/arch/i386/kernel/entry.S b/arch/i386/kernel/entry.S index 0c3cae5d9..56500e466 100644 --- a/arch/i386/kernel/entry.S +++ b/arch/i386/kernel/entry.S @@ -638,6 +638,8 @@ ENTRY(sys_call_table) .long SYMBOL_NAME(sys_setfsuid) /* 215 */ .long SYMBOL_NAME(sys_setfsgid) .long SYMBOL_NAME(sys_pivot_root) + .long SYMBOL_NAME(sys_mincore) + .long SYMBOL_NAME(sys_madvise) /* @@ -646,6 +648,6 @@ ENTRY(sys_call_table) * entries. Don't panic if you notice that this hasn't * been shrunk every time we add a new system call. */ - .rept NR_syscalls-217 + .rept NR_syscalls-219 .long SYMBOL_NAME(sys_ni_syscall) .endr diff --git a/arch/i386/kernel/head.S b/arch/i386/kernel/head.S index f7138faa3..3340946be 100644 --- a/arch/i386/kernel/head.S +++ b/arch/i386/kernel/head.S @@ -67,10 +67,17 @@ startup_32: movl %eax,%cr4 #endif /* - * Setup paging (the tables are already set up, just switch them on) + * Setup paging (intialize tables, then switch them on) */ 1: - movl $0x101000,%eax + movl $pg0-__PAGE_OFFSET,%edi /* initialize page tables */ + movl $007,%eax /* "007" doesn't mean with right to kill, but + PRESENT+RW+USER */ +1: stosl + add $0x1000,%eax + cmp $empty_zero_page-__PAGE_OFFSET,%edi + jne 1b + movl $swapper_pg_dir-__PAGE_OFFSET,%eax movl %eax,%cr3 /* set the page table pointer.. */ movl %cr0,%eax orl $0x80000000,%eax @@ -350,8 +357,8 @@ SYMBOL_NAME(gdt): .long SYMBOL_NAME(gdt_table) /* - * This is initialized to create a identity-mapping at 0-4M (for bootup - * purposes) and another mapping of the 0-4M area at virtual address + * This is initialized to create an identity-mapping at 0-8M (for bootup + * purposes) and another mapping of the 0-8M area at virtual address * PAGE_OFFSET. */ .org 0x1000 @@ -366,270 +373,20 @@ ENTRY(swapper_pg_dir) .fill BOOT_KERNEL_PGD_PTRS-2,4,0 /* - * The page tables are initialized to only 4MB here - the final page - * tables are set up later depending on memory size. The "007" at the - * end doesn't mean with right to kill, but PRESENT+RW+USER + * The page tables are initialized to only 8MB here - the final page + * tables are set up later depending on memory size. */ .org 0x2000 ENTRY(pg0) - .long 0x000007,0x001007,0x002007,0x003007,0x004007,0x005007,0x006007,0x007007 - .long 0x008007,0x009007,0x00a007,0x00b007,0x00c007,0x00d007,0x00e007,0x00f007 - .long 0x010007,0x011007,0x012007,0x013007,0x014007,0x015007,0x016007,0x017007 - .long 0x018007,0x019007,0x01a007,0x01b007,0x01c007,0x01d007,0x01e007,0x01f007 - .long 0x020007,0x021007,0x022007,0x023007,0x024007,0x025007,0x026007,0x027007 - .long 0x028007,0x029007,0x02a007,0x02b007,0x02c007,0x02d007,0x02e007,0x02f007 - .long 0x030007,0x031007,0x032007,0x033007,0x034007,0x035007,0x036007,0x037007 - .long 0x038007,0x039007,0x03a007,0x03b007,0x03c007,0x03d007,0x03e007,0x03f007 - .long 0x040007,0x041007,0x042007,0x043007,0x044007,0x045007,0x046007,0x047007 - .long 0x048007,0x049007,0x04a007,0x04b007,0x04c007,0x04d007,0x04e007,0x04f007 - .long 0x050007,0x051007,0x052007,0x053007,0x054007,0x055007,0x056007,0x057007 - .long 0x058007,0x059007,0x05a007,0x05b007,0x05c007,0x05d007,0x05e007,0x05f007 - .long 0x060007,0x061007,0x062007,0x063007,0x064007,0x065007,0x066007,0x067007 - .long 0x068007,0x069007,0x06a007,0x06b007,0x06c007,0x06d007,0x06e007,0x06f007 - .long 0x070007,0x071007,0x072007,0x073007,0x074007,0x075007,0x076007,0x077007 - .long 0x078007,0x079007,0x07a007,0x07b007,0x07c007,0x07d007,0x07e007,0x07f007 - .long 0x080007,0x081007,0x082007,0x083007,0x084007,0x085007,0x086007,0x087007 - .long 0x088007,0x089007,0x08a007,0x08b007,0x08c007,0x08d007,0x08e007,0x08f007 - .long 0x090007,0x091007,0x092007,0x093007,0x094007,0x095007,0x096007,0x097007 - .long 0x098007,0x099007,0x09a007,0x09b007,0x09c007,0x09d007,0x09e007,0x09f007 - .long 0x0a0007,0x0a1007,0x0a2007,0x0a3007,0x0a4007,0x0a5007,0x0a6007,0x0a7007 - .long 0x0a8007,0x0a9007,0x0aa007,0x0ab007,0x0ac007,0x0ad007,0x0ae007,0x0af007 - .long 0x0b0007,0x0b1007,0x0b2007,0x0b3007,0x0b4007,0x0b5007,0x0b6007,0x0b7007 - .long 0x0b8007,0x0b9007,0x0ba007,0x0bb007,0x0bc007,0x0bd007,0x0be007,0x0bf007 - .long 0x0c0007,0x0c1007,0x0c2007,0x0c3007,0x0c4007,0x0c5007,0x0c6007,0x0c7007 - .long 0x0c8007,0x0c9007,0x0ca007,0x0cb007,0x0cc007,0x0cd007,0x0ce007,0x0cf007 - .long 0x0d0007,0x0d1007,0x0d2007,0x0d3007,0x0d4007,0x0d5007,0x0d6007,0x0d7007 - .long 0x0d8007,0x0d9007,0x0da007,0x0db007,0x0dc007,0x0dd007,0x0de007,0x0df007 - .long 0x0e0007,0x0e1007,0x0e2007,0x0e3007,0x0e4007,0x0e5007,0x0e6007,0x0e7007 - .long 0x0e8007,0x0e9007,0x0ea007,0x0eb007,0x0ec007,0x0ed007,0x0ee007,0x0ef007 - .long 0x0f0007,0x0f1007,0x0f2007,0x0f3007,0x0f4007,0x0f5007,0x0f6007,0x0f7007 - .long 0x0f8007,0x0f9007,0x0fa007,0x0fb007,0x0fc007,0x0fd007,0x0fe007,0x0ff007 - .long 0x100007,0x101007,0x102007,0x103007,0x104007,0x105007,0x106007,0x107007 - .long 0x108007,0x109007,0x10a007,0x10b007,0x10c007,0x10d007,0x10e007,0x10f007 - .long 0x110007,0x111007,0x112007,0x113007,0x114007,0x115007,0x116007,0x117007 - .long 0x118007,0x119007,0x11a007,0x11b007,0x11c007,0x11d007,0x11e007,0x11f007 - .long 0x120007,0x121007,0x122007,0x123007,0x124007,0x125007,0x126007,0x127007 - .long 0x128007,0x129007,0x12a007,0x12b007,0x12c007,0x12d007,0x12e007,0x12f007 - .long 0x130007,0x131007,0x132007,0x133007,0x134007,0x135007,0x136007,0x137007 - .long 0x138007,0x139007,0x13a007,0x13b007,0x13c007,0x13d007,0x13e007,0x13f007 - .long 0x140007,0x141007,0x142007,0x143007,0x144007,0x145007,0x146007,0x147007 - .long 0x148007,0x149007,0x14a007,0x14b007,0x14c007,0x14d007,0x14e007,0x14f007 - .long 0x150007,0x151007,0x152007,0x153007,0x154007,0x155007,0x156007,0x157007 - .long 0x158007,0x159007,0x15a007,0x15b007,0x15c007,0x15d007,0x15e007,0x15f007 - .long 0x160007,0x161007,0x162007,0x163007,0x164007,0x165007,0x166007,0x167007 - .long 0x168007,0x169007,0x16a007,0x16b007,0x16c007,0x16d007,0x16e007,0x16f007 - .long 0x170007,0x171007,0x172007,0x173007,0x174007,0x175007,0x176007,0x177007 - .long 0x178007,0x179007,0x17a007,0x17b007,0x17c007,0x17d007,0x17e007,0x17f007 - .long 0x180007,0x181007,0x182007,0x183007,0x184007,0x185007,0x186007,0x187007 - .long 0x188007,0x189007,0x18a007,0x18b007,0x18c007,0x18d007,0x18e007,0x18f007 - .long 0x190007,0x191007,0x192007,0x193007,0x194007,0x195007,0x196007,0x197007 - .long 0x198007,0x199007,0x19a007,0x19b007,0x19c007,0x19d007,0x19e007,0x19f007 - .long 0x1a0007,0x1a1007,0x1a2007,0x1a3007,0x1a4007,0x1a5007,0x1a6007,0x1a7007 - .long 0x1a8007,0x1a9007,0x1aa007,0x1ab007,0x1ac007,0x1ad007,0x1ae007,0x1af007 - .long 0x1b0007,0x1b1007,0x1b2007,0x1b3007,0x1b4007,0x1b5007,0x1b6007,0x1b7007 - .long 0x1b8007,0x1b9007,0x1ba007,0x1bb007,0x1bc007,0x1bd007,0x1be007,0x1bf007 - .long 0x1c0007,0x1c1007,0x1c2007,0x1c3007,0x1c4007,0x1c5007,0x1c6007,0x1c7007 - .long 0x1c8007,0x1c9007,0x1ca007,0x1cb007,0x1cc007,0x1cd007,0x1ce007,0x1cf007 - .long 0x1d0007,0x1d1007,0x1d2007,0x1d3007,0x1d4007,0x1d5007,0x1d6007,0x1d7007 - .long 0x1d8007,0x1d9007,0x1da007,0x1db007,0x1dc007,0x1dd007,0x1de007,0x1df007 - .long 0x1e0007,0x1e1007,0x1e2007,0x1e3007,0x1e4007,0x1e5007,0x1e6007,0x1e7007 - .long 0x1e8007,0x1e9007,0x1ea007,0x1eb007,0x1ec007,0x1ed007,0x1ee007,0x1ef007 - .long 0x1f0007,0x1f1007,0x1f2007,0x1f3007,0x1f4007,0x1f5007,0x1f6007,0x1f7007 - .long 0x1f8007,0x1f9007,0x1fa007,0x1fb007,0x1fc007,0x1fd007,0x1fe007,0x1ff007 - .long 0x200007,0x201007,0x202007,0x203007,0x204007,0x205007,0x206007,0x207007 - .long 0x208007,0x209007,0x20a007,0x20b007,0x20c007,0x20d007,0x20e007,0x20f007 - .long 0x210007,0x211007,0x212007,0x213007,0x214007,0x215007,0x216007,0x217007 - .long 0x218007,0x219007,0x21a007,0x21b007,0x21c007,0x21d007,0x21e007,0x21f007 - .long 0x220007,0x221007,0x222007,0x223007,0x224007,0x225007,0x226007,0x227007 - .long 0x228007,0x229007,0x22a007,0x22b007,0x22c007,0x22d007,0x22e007,0x22f007 - .long 0x230007,0x231007,0x232007,0x233007,0x234007,0x235007,0x236007,0x237007 - .long 0x238007,0x239007,0x23a007,0x23b007,0x23c007,0x23d007,0x23e007,0x23f007 - .long 0x240007,0x241007,0x242007,0x243007,0x244007,0x245007,0x246007,0x247007 - .long 0x248007,0x249007,0x24a007,0x24b007,0x24c007,0x24d007,0x24e007,0x24f007 - .long 0x250007,0x251007,0x252007,0x253007,0x254007,0x255007,0x256007,0x257007 - .long 0x258007,0x259007,0x25a007,0x25b007,0x25c007,0x25d007,0x25e007,0x25f007 - .long 0x260007,0x261007,0x262007,0x263007,0x264007,0x265007,0x266007,0x267007 - .long 0x268007,0x269007,0x26a007,0x26b007,0x26c007,0x26d007,0x26e007,0x26f007 - .long 0x270007,0x271007,0x272007,0x273007,0x274007,0x275007,0x276007,0x277007 - .long 0x278007,0x279007,0x27a007,0x27b007,0x27c007,0x27d007,0x27e007,0x27f007 - .long 0x280007,0x281007,0x282007,0x283007,0x284007,0x285007,0x286007,0x287007 - .long 0x288007,0x289007,0x28a007,0x28b007,0x28c007,0x28d007,0x28e007,0x28f007 - .long 0x290007,0x291007,0x292007,0x293007,0x294007,0x295007,0x296007,0x297007 - .long 0x298007,0x299007,0x29a007,0x29b007,0x29c007,0x29d007,0x29e007,0x29f007 - .long 0x2a0007,0x2a1007,0x2a2007,0x2a3007,0x2a4007,0x2a5007,0x2a6007,0x2a7007 - .long 0x2a8007,0x2a9007,0x2aa007,0x2ab007,0x2ac007,0x2ad007,0x2ae007,0x2af007 - .long 0x2b0007,0x2b1007,0x2b2007,0x2b3007,0x2b4007,0x2b5007,0x2b6007,0x2b7007 - .long 0x2b8007,0x2b9007,0x2ba007,0x2bb007,0x2bc007,0x2bd007,0x2be007,0x2bf007 - .long 0x2c0007,0x2c1007,0x2c2007,0x2c3007,0x2c4007,0x2c5007,0x2c6007,0x2c7007 - .long 0x2c8007,0x2c9007,0x2ca007,0x2cb007,0x2cc007,0x2cd007,0x2ce007,0x2cf007 - .long 0x2d0007,0x2d1007,0x2d2007,0x2d3007,0x2d4007,0x2d5007,0x2d6007,0x2d7007 - .long 0x2d8007,0x2d9007,0x2da007,0x2db007,0x2dc007,0x2dd007,0x2de007,0x2df007 - .long 0x2e0007,0x2e1007,0x2e2007,0x2e3007,0x2e4007,0x2e5007,0x2e6007,0x2e7007 - .long 0x2e8007,0x2e9007,0x2ea007,0x2eb007,0x2ec007,0x2ed007,0x2ee007,0x2ef007 - .long 0x2f0007,0x2f1007,0x2f2007,0x2f3007,0x2f4007,0x2f5007,0x2f6007,0x2f7007 - .long 0x2f8007,0x2f9007,0x2fa007,0x2fb007,0x2fc007,0x2fd007,0x2fe007,0x2ff007 - .long 0x300007,0x301007,0x302007,0x303007,0x304007,0x305007,0x306007,0x307007 - .long 0x308007,0x309007,0x30a007,0x30b007,0x30c007,0x30d007,0x30e007,0x30f007 - .long 0x310007,0x311007,0x312007,0x313007,0x314007,0x315007,0x316007,0x317007 - .long 0x318007,0x319007,0x31a007,0x31b007,0x31c007,0x31d007,0x31e007,0x31f007 - .long 0x320007,0x321007,0x322007,0x323007,0x324007,0x325007,0x326007,0x327007 - .long 0x328007,0x329007,0x32a007,0x32b007,0x32c007,0x32d007,0x32e007,0x32f007 - .long 0x330007,0x331007,0x332007,0x333007,0x334007,0x335007,0x336007,0x337007 - .long 0x338007,0x339007,0x33a007,0x33b007,0x33c007,0x33d007,0x33e007,0x33f007 - .long 0x340007,0x341007,0x342007,0x343007,0x344007,0x345007,0x346007,0x347007 - .long 0x348007,0x349007,0x34a007,0x34b007,0x34c007,0x34d007,0x34e007,0x34f007 - .long 0x350007,0x351007,0x352007,0x353007,0x354007,0x355007,0x356007,0x357007 - .long 0x358007,0x359007,0x35a007,0x35b007,0x35c007,0x35d007,0x35e007,0x35f007 - .long 0x360007,0x361007,0x362007,0x363007,0x364007,0x365007,0x366007,0x367007 - .long 0x368007,0x369007,0x36a007,0x36b007,0x36c007,0x36d007,0x36e007,0x36f007 - .long 0x370007,0x371007,0x372007,0x373007,0x374007,0x375007,0x376007,0x377007 - .long 0x378007,0x379007,0x37a007,0x37b007,0x37c007,0x37d007,0x37e007,0x37f007 - .long 0x380007,0x381007,0x382007,0x383007,0x384007,0x385007,0x386007,0x387007 - .long 0x388007,0x389007,0x38a007,0x38b007,0x38c007,0x38d007,0x38e007,0x38f007 - .long 0x390007,0x391007,0x392007,0x393007,0x394007,0x395007,0x396007,0x397007 - .long 0x398007,0x399007,0x39a007,0x39b007,0x39c007,0x39d007,0x39e007,0x39f007 - .long 0x3a0007,0x3a1007,0x3a2007,0x3a3007,0x3a4007,0x3a5007,0x3a6007,0x3a7007 - .long 0x3a8007,0x3a9007,0x3aa007,0x3ab007,0x3ac007,0x3ad007,0x3ae007,0x3af007 - .long 0x3b0007,0x3b1007,0x3b2007,0x3b3007,0x3b4007,0x3b5007,0x3b6007,0x3b7007 - .long 0x3b8007,0x3b9007,0x3ba007,0x3bb007,0x3bc007,0x3bd007,0x3be007,0x3bf007 - .long 0x3c0007,0x3c1007,0x3c2007,0x3c3007,0x3c4007,0x3c5007,0x3c6007,0x3c7007 - .long 0x3c8007,0x3c9007,0x3ca007,0x3cb007,0x3cc007,0x3cd007,0x3ce007,0x3cf007 - .long 0x3d0007,0x3d1007,0x3d2007,0x3d3007,0x3d4007,0x3d5007,0x3d6007,0x3d7007 - .long 0x3d8007,0x3d9007,0x3da007,0x3db007,0x3dc007,0x3dd007,0x3de007,0x3df007 - .long 0x3e0007,0x3e1007,0x3e2007,0x3e3007,0x3e4007,0x3e5007,0x3e6007,0x3e7007 - .long 0x3e8007,0x3e9007,0x3ea007,0x3eb007,0x3ec007,0x3ed007,0x3ee007,0x3ef007 - .long 0x3f0007,0x3f1007,0x3f2007,0x3f3007,0x3f4007,0x3f5007,0x3f6007,0x3f7007 - .long 0x3f8007,0x3f9007,0x3fa007,0x3fb007,0x3fc007,0x3fd007,0x3fe007,0x3ff007 +.org 0x3000 ENTRY(pg1) - .long 0x400007,0x001007,0x002007,0x003007,0x004007,0x005007,0x006007,0x007007 - .long 0x408007,0x009007,0x00a007,0x00b007,0x00c007,0x00d007,0x00e007,0x00f007 - .long 0x410007,0x011007,0x012007,0x013007,0x014007,0x015007,0x016007,0x017007 - .long 0x418007,0x019007,0x01a007,0x01b007,0x01c007,0x01d007,0x01e007,0x01f007 - .long 0x420007,0x021007,0x022007,0x023007,0x024007,0x025007,0x026007,0x027007 - .long 0x428007,0x029007,0x02a007,0x02b007,0x02c007,0x02d007,0x02e007,0x02f007 - .long 0x430007,0x031007,0x032007,0x033007,0x034007,0x035007,0x036007,0x037007 - .long 0x438007,0x039007,0x03a007,0x03b007,0x03c007,0x03d007,0x03e007,0x03f007 - .long 0x440007,0x041007,0x042007,0x043007,0x044007,0x045007,0x046007,0x047007 - .long 0x448007,0x049007,0x04a007,0x04b007,0x04c007,0x04d007,0x04e007,0x04f007 - .long 0x450007,0x051007,0x052007,0x053007,0x054007,0x055007,0x056007,0x057007 - .long 0x458007,0x059007,0x05a007,0x05b007,0x05c007,0x05d007,0x05e007,0x05f007 - .long 0x460007,0x061007,0x062007,0x063007,0x064007,0x065007,0x066007,0x067007 - .long 0x468007,0x069007,0x06a007,0x06b007,0x06c007,0x06d007,0x06e007,0x06f007 - .long 0x470007,0x071007,0x072007,0x073007,0x074007,0x075007,0x076007,0x077007 - .long 0x478007,0x079007,0x07a007,0x07b007,0x07c007,0x07d007,0x07e007,0x07f007 - .long 0x480007,0x081007,0x082007,0x083007,0x084007,0x085007,0x086007,0x087007 - .long 0x488007,0x089007,0x08a007,0x08b007,0x08c007,0x08d007,0x08e007,0x08f007 - .long 0x490007,0x091007,0x092007,0x093007,0x094007,0x095007,0x096007,0x097007 - .long 0x498007,0x099007,0x09a007,0x09b007,0x09c007,0x09d007,0x09e007,0x09f007 - .long 0x4a0007,0x0a1007,0x0a2007,0x0a3007,0x0a4007,0x0a5007,0x0a6007,0x0a7007 - .long 0x4a8007,0x0a9007,0x0aa007,0x0ab007,0x0ac007,0x0ad007,0x0ae007,0x0af007 - .long 0x4b0007,0x0b1007,0x0b2007,0x0b3007,0x0b4007,0x0b5007,0x0b6007,0x0b7007 - .long 0x4b8007,0x0b9007,0x0ba007,0x0bb007,0x0bc007,0x0bd007,0x0be007,0x0bf007 - .long 0x4c0007,0x0c1007,0x0c2007,0x0c3007,0x0c4007,0x0c5007,0x0c6007,0x0c7007 - .long 0x4c8007,0x0c9007,0x0ca007,0x0cb007,0x0cc007,0x0cd007,0x0ce007,0x0cf007 - .long 0x4d0007,0x0d1007,0x0d2007,0x0d3007,0x0d4007,0x0d5007,0x0d6007,0x0d7007 - .long 0x4d8007,0x0d9007,0x0da007,0x0db007,0x0dc007,0x0dd007,0x0de007,0x0df007 - .long 0x4e0007,0x0e1007,0x0e2007,0x0e3007,0x0e4007,0x0e5007,0x0e6007,0x0e7007 - .long 0x4e8007,0x0e9007,0x0ea007,0x0eb007,0x0ec007,0x0ed007,0x0ee007,0x0ef007 - .long 0x4f0007,0x0f1007,0x0f2007,0x0f3007,0x0f4007,0x0f5007,0x0f6007,0x0f7007 - .long 0x4f8007,0x0f9007,0x0fa007,0x0fb007,0x0fc007,0x0fd007,0x0fe007,0x0ff007 - .long 0x500007,0x001007,0x002007,0x003007,0x004007,0x005007,0x006007,0x007007 - .long 0x508007,0x009007,0x00a007,0x00b007,0x00c007,0x00d007,0x00e007,0x00f007 - .long 0x510007,0x011007,0x012007,0x013007,0x014007,0x015007,0x016007,0x017007 - .long 0x518007,0x019007,0x01a007,0x01b007,0x01c007,0x01d007,0x01e007,0x01f007 - .long 0x520007,0x021007,0x022007,0x023007,0x024007,0x025007,0x026007,0x027007 - .long 0x528007,0x029007,0x02a007,0x02b007,0x02c007,0x02d007,0x02e007,0x02f007 - .long 0x530007,0x031007,0x032007,0x033007,0x034007,0x035007,0x036007,0x037007 - .long 0x538007,0x039007,0x03a007,0x03b007,0x03c007,0x03d007,0x03e007,0x03f007 - .long 0x540007,0x041007,0x042007,0x043007,0x044007,0x045007,0x046007,0x047007 - .long 0x548007,0x049007,0x04a007,0x04b007,0x04c007,0x04d007,0x04e007,0x04f007 - .long 0x550007,0x051007,0x052007,0x053007,0x054007,0x055007,0x056007,0x057007 - .long 0x558007,0x059007,0x05a007,0x05b007,0x05c007,0x05d007,0x05e007,0x05f007 - .long 0x560007,0x061007,0x062007,0x063007,0x064007,0x065007,0x066007,0x067007 - .long 0x568007,0x069007,0x06a007,0x06b007,0x06c007,0x06d007,0x06e007,0x06f007 - .long 0x570007,0x071007,0x072007,0x073007,0x074007,0x075007,0x076007,0x077007 - .long 0x578007,0x079007,0x07a007,0x07b007,0x07c007,0x07d007,0x07e007,0x07f007 - .long 0x580007,0x081007,0x082007,0x083007,0x084007,0x085007,0x086007,0x087007 - .long 0x588007,0x089007,0x08a007,0x08b007,0x08c007,0x08d007,0x08e007,0x08f007 - .long 0x590007,0x091007,0x092007,0x093007,0x094007,0x095007,0x096007,0x097007 - .long 0x598007,0x099007,0x09a007,0x09b007,0x09c007,0x09d007,0x09e007,0x09f007 - .long 0x5a0007,0x0a1007,0x0a2007,0x0a3007,0x0a4007,0x0a5007,0x0a6007,0x0a7007 - .long 0x5a8007,0x0a9007,0x0aa007,0x0ab007,0x0ac007,0x0ad007,0x0ae007,0x0af007 - .long 0x5b0007,0x0b1007,0x0b2007,0x0b3007,0x0b4007,0x0b5007,0x0b6007,0x0b7007 - .long 0x5b8007,0x0b9007,0x0ba007,0x0bb007,0x0bc007,0x0bd007,0x0be007,0x0bf007 - .long 0x5c0007,0x0c1007,0x0c2007,0x0c3007,0x0c4007,0x0c5007,0x0c6007,0x0c7007 - .long 0x5c8007,0x0c9007,0x0ca007,0x0cb007,0x0cc007,0x0cd007,0x0ce007,0x0cf007 - .long 0x5d0007,0x0d1007,0x0d2007,0x0d3007,0x0d4007,0x0d5007,0x0d6007,0x0d7007 - .long 0x5d8007,0x0d9007,0x0da007,0x0db007,0x0dc007,0x0dd007,0x0de007,0x0df007 - .long 0x5e0007,0x0e1007,0x0e2007,0x0e3007,0x0e4007,0x0e5007,0x0e6007,0x0e7007 - .long 0x5e8007,0x0e9007,0x0ea007,0x0eb007,0x0ec007,0x0ed007,0x0ee007,0x0ef007 - .long 0x5f0007,0x0f1007,0x0f2007,0x0f3007,0x0f4007,0x0f5007,0x0f6007,0x0f7007 - .long 0x5f8007,0x0f9007,0x0fa007,0x0fb007,0x0fc007,0x0fd007,0x0fe007,0x0ff007 - .long 0x600007,0x001007,0x002007,0x003007,0x004007,0x005007,0x006007,0x007007 - .long 0x608007,0x009007,0x00a007,0x00b007,0x00c007,0x00d007,0x00e007,0x00f007 - .long 0x610007,0x011007,0x012007,0x013007,0x014007,0x015007,0x016007,0x017007 - .long 0x618007,0x019007,0x01a007,0x01b007,0x01c007,0x01d007,0x01e007,0x01f007 - .long 0x620007,0x021007,0x022007,0x023007,0x024007,0x025007,0x026007,0x027007 - .long 0x628007,0x029007,0x02a007,0x02b007,0x02c007,0x02d007,0x02e007,0x02f007 - .long 0x630007,0x031007,0x032007,0x033007,0x034007,0x035007,0x036007,0x037007 - .long 0x638007,0x039007,0x03a007,0x03b007,0x03c007,0x03d007,0x03e007,0x03f007 - .long 0x640007,0x041007,0x042007,0x043007,0x044007,0x045007,0x046007,0x047007 - .long 0x648007,0x049007,0x04a007,0x04b007,0x04c007,0x04d007,0x04e007,0x04f007 - .long 0x650007,0x051007,0x052007,0x053007,0x054007,0x055007,0x056007,0x057007 - .long 0x658007,0x059007,0x05a007,0x05b007,0x05c007,0x05d007,0x05e007,0x05f007 - .long 0x660007,0x061007,0x062007,0x063007,0x064007,0x065007,0x066007,0x067007 - .long 0x668007,0x069007,0x06a007,0x06b007,0x06c007,0x06d007,0x06e007,0x06f007 - .long 0x670007,0x071007,0x072007,0x073007,0x074007,0x075007,0x076007,0x077007 - .long 0x678007,0x079007,0x07a007,0x07b007,0x07c007,0x07d007,0x07e007,0x07f007 - .long 0x680007,0x081007,0x082007,0x083007,0x084007,0x085007,0x086007,0x087007 - .long 0x688007,0x089007,0x08a007,0x08b007,0x08c007,0x08d007,0x08e007,0x08f007 - .long 0x690007,0x091007,0x092007,0x093007,0x094007,0x095007,0x096007,0x097007 - .long 0x698007,0x099007,0x09a007,0x09b007,0x09c007,0x09d007,0x09e007,0x09f007 - .long 0x6a0007,0x0a1007,0x0a2007,0x0a3007,0x0a4007,0x0a5007,0x0a6007,0x0a7007 - .long 0x6a8007,0x0a9007,0x0aa007,0x0ab007,0x0ac007,0x0ad007,0x0ae007,0x0af007 - .long 0x6b0007,0x0b1007,0x0b2007,0x0b3007,0x0b4007,0x0b5007,0x0b6007,0x0b7007 - .long 0x6b8007,0x0b9007,0x0ba007,0x0bb007,0x0bc007,0x0bd007,0x0be007,0x0bf007 - .long 0x6c0007,0x0c1007,0x0c2007,0x0c3007,0x0c4007,0x0c5007,0x0c6007,0x0c7007 - .long 0x6c8007,0x0c9007,0x0ca007,0x0cb007,0x0cc007,0x0cd007,0x0ce007,0x0cf007 - .long 0x6d0007,0x0d1007,0x0d2007,0x0d3007,0x0d4007,0x0d5007,0x0d6007,0x0d7007 - .long 0x6d8007,0x0d9007,0x0da007,0x0db007,0x0dc007,0x0dd007,0x0de007,0x0df007 - .long 0x6e0007,0x0e1007,0x0e2007,0x0e3007,0x0e4007,0x0e5007,0x0e6007,0x0e7007 - .long 0x6e8007,0x0e9007,0x0ea007,0x0eb007,0x0ec007,0x0ed007,0x0ee007,0x0ef007 - .long 0x6f0007,0x0f1007,0x0f2007,0x0f3007,0x0f4007,0x0f5007,0x0f6007,0x0f7007 - .long 0x6f8007,0x0f9007,0x0fa007,0x0fb007,0x0fc007,0x0fd007,0x0fe007,0x0ff007 - .long 0x700007,0x001007,0x002007,0x003007,0x004007,0x005007,0x006007,0x007007 - .long 0x708007,0x009007,0x00a007,0x00b007,0x00c007,0x00d007,0x00e007,0x00f007 - .long 0x710007,0x011007,0x012007,0x013007,0x014007,0x015007,0x016007,0x017007 - .long 0x718007,0x019007,0x01a007,0x01b007,0x01c007,0x01d007,0x01e007,0x01f007 - .long 0x720007,0x021007,0x022007,0x023007,0x024007,0x025007,0x026007,0x027007 - .long 0x728007,0x029007,0x02a007,0x02b007,0x02c007,0x02d007,0x02e007,0x02f007 - .long 0x730007,0x031007,0x032007,0x033007,0x034007,0x035007,0x036007,0x037007 - .long 0x738007,0x039007,0x03a007,0x03b007,0x03c007,0x03d007,0x03e007,0x03f007 - .long 0x740007,0x041007,0x042007,0x043007,0x044007,0x045007,0x046007,0x047007 - .long 0x748007,0x049007,0x04a007,0x04b007,0x04c007,0x04d007,0x04e007,0x04f007 - .long 0x750007,0x051007,0x052007,0x053007,0x054007,0x055007,0x056007,0x057007 - .long 0x758007,0x059007,0x05a007,0x05b007,0x05c007,0x05d007,0x05e007,0x05f007 - .long 0x760007,0x061007,0x062007,0x063007,0x064007,0x065007,0x066007,0x067007 - .long 0x768007,0x069007,0x06a007,0x06b007,0x06c007,0x06d007,0x06e007,0x06f007 - .long 0x770007,0x071007,0x072007,0x073007,0x074007,0x075007,0x076007,0x077007 - .long 0x778007,0x079007,0x07a007,0x07b007,0x07c007,0x07d007,0x07e007,0x07f007 - .long 0x780007,0x081007,0x082007,0x083007,0x084007,0x085007,0x086007,0x087007 - .long 0x788007,0x089007,0x08a007,0x08b007,0x08c007,0x08d007,0x08e007,0x08f007 - .long 0x790007,0x091007,0x092007,0x093007,0x094007,0x095007,0x096007,0x097007 - .long 0x798007,0x099007,0x09a007,0x09b007,0x09c007,0x09d007,0x09e007,0x09f007 - .long 0x7a0007,0x0a1007,0x0a2007,0x0a3007,0x0a4007,0x0a5007,0x0a6007,0x0a7007 - .long 0x7a8007,0x0a9007,0x0aa007,0x0ab007,0x0ac007,0x0ad007,0x0ae007,0x0af007 - .long 0x7b0007,0x0b1007,0x0b2007,0x0b3007,0x0b4007,0x0b5007,0x0b6007,0x0b7007 - .long 0x7b8007,0x0b9007,0x0ba007,0x0bb007,0x0bc007,0x0bd007,0x0be007,0x0bf007 - .long 0x7c0007,0x0c1007,0x0c2007,0x0c3007,0x0c4007,0x0c5007,0x0c6007,0x0c7007 - .long 0x7c8007,0x0c9007,0x0ca007,0x0cb007,0x0cc007,0x0cd007,0x0ce007,0x0cf007 - .long 0x7d0007,0x0d1007,0x0d2007,0x0d3007,0x0d4007,0x0d5007,0x0d6007,0x0d7007 - .long 0x7d8007,0x0d9007,0x0da007,0x0db007,0x0dc007,0x0dd007,0x0de007,0x0df007 - .long 0x7e0007,0x0e1007,0x0e2007,0x0e3007,0x0e4007,0x0e5007,0x0e6007,0x0e7007 - .long 0x7e8007,0x0e9007,0x0ea007,0x0eb007,0x0ec007,0x0ed007,0x0ee007,0x0ef007 - .long 0x7f0007,0x0f1007,0x0f2007,0x0f3007,0x0f4007,0x0f5007,0x0f6007,0x0f7007 - .long 0x7f8007,0x0f9007,0x0fa007,0x0fb007,0x0fc007,0x0fd007,0x0fe007,0x0ff007 + +/* + * empty_zero_page must immediately follow the page tables ! (The + * initialization loop counts until empty_zero_page) + */ + .org 0x4000 ENTRY(empty_zero_page) diff --git a/arch/i386/kernel/i386_ksyms.c b/arch/i386/kernel/i386_ksyms.c index a3389c5f0..e21c33b6f 100644 --- a/arch/i386/kernel/i386_ksyms.c +++ b/arch/i386/kernel/i386_ksyms.c @@ -121,21 +121,7 @@ EXPORT_SYMBOL(smp_call_function); #endif #ifdef CONFIG_MCA -/* Adapter probing and info methods. */ EXPORT_SYMBOL(machine_id); -EXPORT_SYMBOL(mca_find_adapter); -EXPORT_SYMBOL(mca_write_pos); -EXPORT_SYMBOL(mca_read_pos); -EXPORT_SYMBOL(mca_read_stored_pos); -EXPORT_SYMBOL(mca_set_adapter_name); -EXPORT_SYMBOL(mca_get_adapter_name); -EXPORT_SYMBOL(mca_set_adapter_procfn); -EXPORT_SYMBOL(mca_isenabled); -EXPORT_SYMBOL(mca_isadapter); -EXPORT_SYMBOL(mca_mark_as_used); -EXPORT_SYMBOL(mca_mark_as_unused); -EXPORT_SYMBOL(mca_find_unused_adapter); -EXPORT_SYMBOL(mca_is_adapter_used); #endif #ifdef CONFIG_VT diff --git a/arch/i386/kernel/irq.c b/arch/i386/kernel/irq.c index 120c861e7..d2ba2fd9c 100644 --- a/arch/i386/kernel/irq.c +++ b/arch/i386/kernel/irq.c @@ -456,6 +456,18 @@ int handle_IRQ_event(unsigned int irq, struct pt_regs * regs, struct irqaction * * hardware disable after having gotten the irq * controller lock. */ + +/** + * disable_irq_nosync - disable an irq without waiting + * @irq: Interrupt to disable + * + * Disable the selected interrupt line. Disables of an interrupt + * stack. Unlike disable_irq, this function does not ensure existing + * instances of the irq handler have completed before returning. + * + * This function may be called from IRQ context. + */ + void inline disable_irq_nosync(unsigned int irq) { irq_desc_t *desc = irq_desc + irq; @@ -469,10 +481,19 @@ void inline disable_irq_nosync(unsigned int irq) spin_unlock_irqrestore(&desc->lock, flags); } -/* - * Synchronous version of the above, making sure the IRQ is - * no longer running on any other IRQ.. +/** + * disable_irq - disable an irq and wait for completion + * @irq: Interrupt to disable + * + * Disable the selected interrupt line. Disables of an interrupt + * stack. That is for two disables you need two enables. This + * function waits for any pending IRQ handlers for this interrupt + * to complete before returning. If you use this function while + * holding a resource the IRQ handler may need you will deadlock. + * + * This function may be called - with care - from IRQ context. */ + void disable_irq(unsigned int irq) { disable_irq_nosync(irq); @@ -484,6 +505,16 @@ void disable_irq(unsigned int irq) } } +/** + * enable_irq - enable interrupt handling on an irq + * @irq: Interrupt to enable + * + * Re-enables the processing of interrupts on this IRQ line + * providing no disable_irq calls are now in effect. + * + * This function may be called from IRQ context. + */ + void enable_irq(unsigned int irq) { irq_desc_t *desc = irq_desc + irq; @@ -598,6 +629,38 @@ out: return 1; } +/** + * request_irq - allocate an interrupt line + * @irq: Interrupt line to allocate + * @handler: Function to be called when the IRQ occurs + * @irqflags: Interrupt type flags + * @devname: An ascii name for the claiming device + * @dev_id: A cookie passed back to the handler function + * + * This call allocates interrupt resources and enables the + * interrupt line and IRQ handling. From the point this + * call is made your handler function may be invoked. Since + * your handler function must clear any interrupt the board + * raises, you must take care both to initialise your hardware + * and to set up the interrupt handler in the right order. + * + * Dev_id must be globally unique. Normally the address of the + * device data structure is used as the cookie. Since the handler + * receives this value it makes sense to use it. + * + * If your interrupt is shared you must pass a non NULL dev_id + * as this is required when freeing the interrupt. + * + * Flags: + * + * SA_SHIRQ Interrupt is shared + * + * SA_INTERRUPT Disable local interrupts while processing + * + * SA_SAMPLE_RANDOM The interrupt can be used for entropy + * + */ + int request_irq(unsigned int irq, void (*handler)(int, void *, struct pt_regs *), unsigned long irqflags, @@ -642,7 +705,25 @@ int request_irq(unsigned int irq, kfree(action); return retval; } - + +/** + * free_irq - free an interrupt + * @irq: Interrupt line to free + * @dev_id: Device identity to free + * + * Remove an interrupt handler. The handler is removed and if the + * interrupt line is no longer in use by any driver it is disabled. + * On a shared IRQ the caller must ensure the interrupt is disabled + * on the card it drives before calling this function. The function + * does not return until any executing interrupts for this IRQ + * have completed. + * + * This function may be called from interrupt context. + * + * Bugs: Attempting to free an irq in a handler for the same irq hangs + * the machine. + */ + void free_irq(unsigned int irq, void *dev_id) { irq_desc_t *desc; @@ -693,6 +774,15 @@ void free_irq(unsigned int irq, void *dev_id) * with "IRQ_WAITING" cleared and the interrupt * disabled. */ + +/** + * probe_irq_on - begin an interrupt autodetect + * + * Commence probing for an interrupt. The interrupts are scanned + * and a mask of potential interrupt lines is returned. + * + */ + unsigned long probe_irq_on(void) { unsigned int i; @@ -770,6 +860,16 @@ unsigned long probe_irq_on(void) * Return a mask of triggered interrupts (this * can handle only legacy ISA interrupts). */ + +/** + * probe_irq_mask + * @val: mask of interrupts to consider + * + * Scan the ISA bus interrupt lines and return a bitmap of + * active interrupts. The interrupt probe logic state is then + * returned to its previous value. + */ + unsigned int probe_irq_mask(unsigned long val) { int i; @@ -798,8 +898,27 @@ unsigned int probe_irq_mask(unsigned long val) /* * Return the one interrupt that triggered (this can - * handle any interrupt source) + * handle any interrupt source). + */ + +/** + * probe_irq_off - end an interrupt autodetect + * @val: mask of potential interrupts (unused) + * + * Scans the unused interrupt lines and returns the line which + * appears to have triggered the interrupt. If no interrupt was + * found then zero is returned. If more than one interrupt is + * found then minus the first candidate is returned to indicate + * their is doubt. + * + * The interrupt probe logic state is returned to its previous + * value. + * + * BUGS: When used in a module (which arguably shouldnt happen) + * nothing prevents two IRQ probe callers from overlapping. The + * results of this are non-optimal. */ + int probe_irq_off(unsigned long val) { int i, irq_found, nr_irqs; diff --git a/arch/i386/kernel/mca.c b/arch/i386/kernel/mca.c index 7061e55db..f0f0f9f37 100644 --- a/arch/i386/kernel/mca.c +++ b/arch/i386/kernel/mca.c @@ -34,6 +34,7 @@ * - switched to regular procfs methods. */ +#include <linux/module.h> #include <linux/types.h> #include <linux/errno.h> #include <linux/kernel.h> @@ -362,6 +363,19 @@ void mca_handle_nmi(void) /*--------------------------------------------------------------------*/ +/** + * mca_find_adapter - scan for adapters + * @id: MCA identification to search for + * @start: Starting slot + * + * Search the MCA configuration for adapters matching the 16bit + * ID given. The first time it should be called with start as zero + * and then further calls made passing the return value of the + * previous call until MCA_NOTFOUND is returned. + * + * Disabled adapters are not reported. + */ + int mca_find_adapter(int id, int start) { if(mca_info == NULL || id == 0xffff) { @@ -390,8 +404,25 @@ int mca_find_adapter(int id, int start) return MCA_NOTFOUND; } /* mca_find_adapter() */ +EXPORT_SYMBOL(mca_find_adapter); + /*--------------------------------------------------------------------*/ +/** + * mca_find_unused_adapter - scan for unused adapters + * @id: MCA identification to search for + * @start: Starting slot + * + * Search the MCA configuration for adapters matching the 16bit + * ID given. The first time it should be called with start as zero + * and then further calls made passing the return value of the + * previous call until MCA_NOTFOUND is returned. + * + * Adapters that have been claimed by drivers and those that + * are disabled are not reported. This function thus allows a driver + * to scan for further cards when some may already be driven. + */ + int mca_find_unused_adapter(int id, int start) { if(mca_info == NULL || id == 0xffff) { @@ -421,8 +452,20 @@ int mca_find_unused_adapter(int id, int start) return MCA_NOTFOUND; } /* mca_find_unused_adapter() */ +EXPORT_SYMBOL(mca_find_unused_adapter); + /*--------------------------------------------------------------------*/ +/** + * mca_read_stored_pos - read POS register from boot data + * @slot: slot number to read from + * @reg: register to read from + * + * Fetch a POS value that was stored at boot time by the kernel + * when it scanned the MCA space. The register value is returned. + * Missing or invalid registers report 0. + */ + unsigned char mca_read_stored_pos(int slot, int reg) { if(slot < 0 || slot >= MCA_NUMADAPTERS || mca_info == NULL) return 0; @@ -430,8 +473,22 @@ unsigned char mca_read_stored_pos(int slot, int reg) return mca_info->slot[slot].pos[reg]; } /* mca_read_stored_pos() */ +EXPORT_SYMBOL(mca_read_stored_pos); + /*--------------------------------------------------------------------*/ +/** + * mca_read_pos - read POS register from card + * @slot: slot number to read from + * @reg: register to read from + * + * Fetch a POS value directly from the hardware to obtain the + * current value. This is much slower than mca_read_stored_pos and + * may not be invoked from interrupt context. It handles the + * deep magic required for onboard devices transparently. + */ + + unsigned char mca_read_pos(int slot, int reg) { unsigned int byte = 0; @@ -489,16 +546,32 @@ unsigned char mca_read_pos(int slot, int reg) return byte; } /* mca_read_pos() */ +EXPORT_SYMBOL(mca_read_pos); + /*--------------------------------------------------------------------*/ -/* Note that this a technically a Bad Thing, as IBM tech stuff says - * you should only set POS values through their utilities. - * However, some devices such as the 3c523 recommend that you write - * back some data to make sure the configuration is consistent. - * I'd say that IBM is right, but I like my drivers to work. - * This function can't do checks to see if multiple devices end up - * with the same resources, so you might see magic smoke if someone - * screws up. +/** + * mca_write_pos - read POS register from card + * @slot: slot number to read from + * @reg: register to read from + * @byte: byte to write to the POS registers + * + * Store a POS value directly from the hardware. You should not + * normally need to use this function and should have a very good + * knowledge of MCA bus before you do so. Doing this wrongly can + * damage the hardware. + * + * This function may not be used from interrupt context. + * + * Note that this a technically a Bad Thing, as IBM tech stuff says + * you should only set POS values through their utilities. + * However, some devices such as the 3c523 recommend that you write + * back some data to make sure the configuration is consistent. + * I'd say that IBM is right, but I like my drivers to work. + * + * This function can't do checks to see if multiple devices end up + * with the same resources, so you might see magic smoke if someone + * screws up. */ void mca_write_pos(int slot, int reg, unsigned char byte) @@ -532,8 +605,20 @@ void mca_write_pos(int slot, int reg, unsigned char byte) mca_info->slot[slot].pos[reg] = byte; } /* mca_write_pos() */ +EXPORT_SYMBOL(mca_write_pos); + /*--------------------------------------------------------------------*/ +/** + * mca_set_adapter_name - Set the description of the card + * @slot: slot to name + * @name: text string for the namen + * + * This function sets the name reported via /proc for this + * adapter slot. This is for user information only. Setting a + * name deletes any previous name. + */ + void mca_set_adapter_name(int slot, char* name) { if(mca_info == NULL) return; @@ -550,6 +635,26 @@ void mca_set_adapter_name(int slot, char* name) } } +EXPORT_SYMBOL(mca_set_adapter_name); + +/** + * mca_set_adapter_procfn - Set the /proc callback + * @slot: slot to configure + * @procfn: callback function to call for /proc + * @dev: device information passed to the callback + * + * This sets up an information callback for /proc/mca/slot?. The + * function is called with the buffer, slot, and device pointer (or + * some equally informative context information, or nothing, if you + * prefer), and is expected to put useful information into the + * buffer. The adapter name, id, and POS registers get printed + * before this is called though, so don't do it again. + * + * This should be called with a NULL procfn when a module + * unregisters, thus preventing kernel crashes and other such + * nastiness. + */ + void mca_set_adapter_procfn(int slot, MCA_ProcFn procfn, void* dev) { if(mca_info == NULL) return; @@ -560,11 +665,33 @@ void mca_set_adapter_procfn(int slot, MCA_ProcFn procfn, void* dev) } } +EXPORT_SYMBOL(mca_set_adapter_procfn); + +/** + * mca_is_adapter_used - check if claimed by driver + * @slot: slot to check + * + * Returns 1 if the slot has been claimed by a driver + */ + int mca_is_adapter_used(int slot) { return mca_info->slot[slot].driver_loaded; } +EXPORT_SYMBOL(mca_is_adapter_used); + +/** + * mca_mark_as_used - claim an MCA device + * @slot: slot to claim + * FIXME: should we make this threadsafe + * + * Claim an MCA slot for a device driver. If the + * slot is already taken the function returns 1, + * if it is not taken it is claimed and 0 is + * returned. + */ + int mca_mark_as_used(int slot) { if(mca_info->slot[slot].driver_loaded) return 1; @@ -572,10 +699,29 @@ int mca_mark_as_used(int slot) return 0; } +EXPORT_SYMBOL(mca_mark_as_used); + +/** + * mca_mark_as_unused - release an MCA device + * @slot: slot to claim + * + * Release the slot for other drives to use. + */ + void mca_mark_as_unused(int slot) { mca_info->slot[slot].driver_loaded = 0; } + +EXPORT_SYMBOL(mca_mark_as_unused); + +/** + * mca_get_adapter_name - get the adapter description + * @slot: slot to query + * + * Return the adapter description if set. If it has not been + * set or the slot is out range then return NULL. + */ char *mca_get_adapter_name(int slot) { @@ -588,6 +734,16 @@ char *mca_get_adapter_name(int slot) return 0; } +EXPORT_SYMBOL(mca_get_adapter_name); + +/** + * mca_isadapter - check if the slot holds an adapter + * @slot: slot to query + * + * Returns zero if the slot does not hold an adapter, non zero if + * it does. + */ + int mca_isadapter(int slot) { if(mca_info == NULL) return 0; @@ -600,6 +756,17 @@ int mca_isadapter(int slot) return 0; } +EXPORT_SYMBOL(mca_isadapter); + + +/** + * mca_isadapter - check if the slot holds an adapter + * @slot: slot to query + * + * Returns a non zero value if the slot holds an enabled adapter + * and zero for any other case. + */ + int mca_isenabled(int slot) { if(mca_info == NULL) return 0; @@ -611,6 +778,8 @@ int mca_isenabled(int slot) return 0; } +EXPORT_SYMBOL(mca_isenabled); + /*--------------------------------------------------------------------*/ #ifdef CONFIG_PROC_FS diff --git a/arch/i386/kernel/mtrr.c b/arch/i386/kernel/mtrr.c index cc9c7eafe..1d6203f65 100644 --- a/arch/i386/kernel/mtrr.c +++ b/arch/i386/kernel/mtrr.c @@ -1101,8 +1101,44 @@ static int cyrix_get_free_region (unsigned long base, unsigned long size) static int (*get_free_region) (unsigned long base, unsigned long size) = generic_get_free_region; -int mtrr_add (unsigned long base, unsigned long size, unsigned int type, - char increment) +/** + * mtrr_add - Add a memory type region + * @base: Physical base address of region + * @size: Physical size of region + * @type: Type of MTRR desired + * @increment: If this is true do usage counting on the region + * + * Memory type region registers control the caching on newer Intel and + * non Intel processors. This function allows drivers to request an + * MTRR is added. The details and hardware specifics of each processors + * implementation are hidden from the caller, but nevertheless the + * caller should expect to need to provide a power of two size on an + * equivalent power of two boundary. + * + * If the region cannot be added either because all regions are in use + * or the CPU cannot support it a negative value is returned. On success + * the register number for this entry is returned, but should be treated + * as a cookie only. + * + * On a multiprocessor machine the changes are made to all processors. + * This is required on x86 by the Intel processors. + * + * The available types are + * + * MTRR_TYPE_UNCACHEABLE - No caching + * + * MTRR_TYPE_WRITEBACK - Write data back in bursts whenever + * + * MTRR_TYPE_WRCOMB - Write data back soon but allow bursts + * + * MTRR_TYPE_WRTHROUGH - Cache reads but not writes + * + * BUGS: Needs a quiet flag for the cases where drivers do not mind + * failures and do not wish system log messages to be sent. + */ + +int mtrr_add(unsigned long base, unsigned long size, unsigned int type, char increment) +{ /* [SUMMARY] Add an MTRR entry. <base> The starting (base) address of the region. <size> The size (in bytes) of the region. @@ -1113,7 +1149,6 @@ int mtrr_add (unsigned long base, unsigned long size, unsigned int type, the error code. [NOTE] This routine uses a spinlock. */ -{ int i, max; mtrr_type ltype; unsigned long lbase, lsize, last; @@ -1145,7 +1180,7 @@ int mtrr_add (unsigned long base, unsigned long size, unsigned int type, if ( (boot_cpu_data.x86 == 6) && (boot_cpu_data.x86_model == 1) && (boot_cpu_data.x86_mask <= 7) && ( base & ( (1 << 22) -1 ) ) ) { - printk ("mtrr: base(0x%lx) is not 4 MiB aligned\n", base); + printk (KERN_WARNING "mtrr: base(0x%lx) is not 4 MiB aligned\n", base); return -EINVAL; } } @@ -1162,13 +1197,13 @@ int mtrr_add (unsigned long base, unsigned long size, unsigned int type, { if (type != MTRR_TYPE_WRCOMB) { - printk ("mtrr: only write-combining is supported\n"); + printk (KERN_WARNING "mtrr: only write-combining is supported\n"); return -EINVAL; } } else if (base + size < 0x100000) { - printk ("mtrr: cannot set region below 1 MiB (0x%lx,0x%lx)\n", + printk (KERN_WARNING "mtrr: cannot set region below 1 MiB (0x%lx,0x%lx)\n", base, size); return -EINVAL; } @@ -1179,7 +1214,7 @@ int mtrr_add (unsigned long base, unsigned long size, unsigned int type, lbase = lbase >> 1, last = last >> 1); if (lbase != last) { - printk ("mtrr: base(0x%lx) is not aligned on a size(0x%lx) boundary\n", + printk (KERN_WARNING "mtrr: base(0x%lx) is not aligned on a size(0x%lx) boundary\n", base, size); return -EINVAL; } @@ -1196,7 +1231,7 @@ int mtrr_add (unsigned long base, unsigned long size, unsigned int type, /* If the type is WC, check that this processor supports it */ if ( (type == MTRR_TYPE_WRCOMB) && !have_wrcomb () ) { - printk ("mtrr: your processor doesn't support write-combining\n"); + printk (KERN_WARNING "mtrr: your processor doesn't support write-combining\n"); return -ENOSYS; } increment = increment ? 1 : 0; @@ -1212,7 +1247,7 @@ int mtrr_add (unsigned long base, unsigned long size, unsigned int type, if ( (base < lbase) || (base + size > lbase + lsize) ) { up(&main_lock); - printk ("mtrr: 0x%lx,0x%lx overlaps existing 0x%lx,0x%lx\n", + printk (KERN_WARNING "mtrr: 0x%lx,0x%lx overlaps existing 0x%lx,0x%lx\n", base, size, lbase, lsize); return -EINVAL; } @@ -1245,6 +1280,21 @@ int mtrr_add (unsigned long base, unsigned long size, unsigned int type, return i; } /* End Function mtrr_add */ +/** + * mtrr_del + * @reg: Register returned by mtrr_add + * @base: Physical base address + * @size: Size of region + * + * If register is supplied then base and size are ignored. This is + * how drivers should call it. + * + * Releases an MTRR region. If the usage count drops to zero the + * register is freed and the region returns to default state. + * On success the register is returned, on failure a negative error + * code. + */ + int mtrr_del (int reg, unsigned long base, unsigned long size) /* [SUMMARY] Delete MTRR/decrement usage count. <reg> The register. If this is less than 0 then <<base>> and <<size>> must diff --git a/arch/i386/kernel/setup.c b/arch/i386/kernel/setup.c index b5602ebec..a12b6b73d 100644 --- a/arch/i386/kernel/setup.c +++ b/arch/i386/kernel/setup.c @@ -790,14 +790,14 @@ void __init setup_arch(char **cmdline_p) static int __init get_model_name(struct cpuinfo_x86 *c) { - unsigned int n, dummy, *v; + unsigned int n, dummy, *v, ecx, edx; /* Actually we must have cpuid or we could never have * figured out that this was AMD from the vendor info :-). */ cpuid(0x80000000, &n, &dummy, &dummy, &dummy); - if (n < 4) + if (n < 0x80000004) return 0; cpuid(0x80000001, &dummy, &dummy, &dummy, &(c->x86_capability)); v = (unsigned int *) c->x86_model_id; @@ -806,13 +806,24 @@ static int __init get_model_name(struct cpuinfo_x86 *c) cpuid(0x80000004, &v[8], &v[9], &v[10], &v[11]); c->x86_model_id[48] = 0; /* Set MTRR capability flag if appropriate */ - if(boot_cpu_data.x86 !=5) - return 1; - if((boot_cpu_data.x86_model == 9) || - ((boot_cpu_data.x86_model == 8) && - (boot_cpu_data.x86_mask >= 8))) - c->x86_capability |= X86_FEATURE_MTRR; + if(boot_cpu_data.x86 == 5) { + if((boot_cpu_data.x86_model == 9) || + ((boot_cpu_data.x86_model == 8) && + (boot_cpu_data.x86_mask >= 8))) + c->x86_capability |= X86_FEATURE_MTRR; + } + if (n >= 0x80000005){ + cpuid(0x80000005, &dummy, &dummy, &ecx, &edx); + printk("CPU: L1 I Cache: %dK L1 D Cache: %dK\n", + ecx>>24, edx>>24); + c->x86_cache_size=(ecx>>24)+(edx>>24); + } + if (n >= 0x80000006){ + cpuid(0x80000006, &dummy, &dummy, &ecx, &edx); + printk("CPU: L2 Cache: %dK\n", ecx>>16); + c->x86_cache_size=(ecx>>16); + } return 1; } @@ -882,18 +893,7 @@ static int __init amd_model(struct cpuinfo_x86 *c) } break; case 6: /* An Athlon. We can trust the BIOS probably */ - { - - u32 ecx, edx, dummy; - cpuid(0x80000005, &dummy, &dummy, &ecx, &edx); - printk("L1 I Cache: %dK L1 D Cache: %dK\n", - ecx>>24, edx>>24); - cpuid(0x80000006, &dummy, &dummy, &ecx, &edx); - printk("L2 Cache: %dK\n", ecx>>16); - c->x86_cache_size = ecx>>16; - break; - } - + break; } return r; } @@ -1021,10 +1021,18 @@ static void __init cyrix_model(struct cpuinfo_x86 *c) /* It isnt really a PCI quirk directly, but the cure is the same. The MediaGX has deep magic SMM stuff that handles the SB emulation. It thows away the fifo on disable_dma() which - is wrong and ruins the audio. */ + is wrong and ruins the audio. + + Bug2: VSA1 has a wrap bug so that using maximum sized DMA + causes bad things. According to NatSemi VSA2 has another + bug to do with 'hlt'. I've not seen any boards using VSA2 + and X doesn't seem to support it either so who cares 8). + VSA1 we work around however. + + */ - printk(KERN_INFO "Working around Cyrix MediaGX virtual DMA bug.\n"); - isa_dma_bridge_buggy = 1; + printk(KERN_INFO "Working around Cyrix MediaGX virtual DMA bugs.\n"); + isa_dma_bridge_buggy = 2; #endif /* GXm supports extended cpuid levels 'ala' AMD */ if (c->cpuid_level == 2) { diff --git a/arch/i386/kernel/time.c b/arch/i386/kernel/time.c index 84e20b225..b4a7753b8 100644 --- a/arch/i386/kernel/time.c +++ b/arch/i386/kernel/time.c @@ -615,6 +615,8 @@ bad_ctc: void __init time_init(void) { + extern int x86_udelay_tsc; + xtime.tv_sec = get_cmos_time(); xtime.tv_usec = 0; @@ -650,6 +652,11 @@ void __init time_init(void) if (tsc_quotient) { fast_gettimeoffset_quotient = tsc_quotient; use_tsc = 1; + /* + * We could be more selective here I suspect + * and just enable this for the next intel chips ? + */ + x86_udelay_tsc = 1; #ifndef do_gettimeoffset do_gettimeoffset = do_fast_gettimeoffset; #endif diff --git a/arch/i386/lib/delay.c b/arch/i386/lib/delay.c index 6918451a6..ca5eeb796 100644 --- a/arch/i386/lib/delay.c +++ b/arch/i386/lib/delay.c @@ -12,12 +12,38 @@ #include <linux/sched.h> #include <linux/delay.h> +#include <asm/delay.h> #ifdef __SMP__ #include <asm/smp.h> #endif -void __delay(unsigned long loops) +int x86_udelay_tsc = 0; /* Delay via TSC */ + + +/* + * Do a udelay using the TSC for any CPU that happens + * to have one that we trust. This could be optimised to avoid + * the multiply per loop but its a delay loop so who are we kidding... + */ + +static void __rdtsc_delay(unsigned long loops) +{ + unsigned long bclock, now; + + rdtscl(bclock); + do + { + rdtscl(now); + } + while((now-bclock) < loops); +} + +/* + * Non TSC based delay loop for 386, 486, MediaGX + */ + +static void __loop_delay(unsigned long loops) { int d0; __asm__ __volatile__( @@ -30,6 +56,14 @@ void __delay(unsigned long loops) :"0" (loops)); } +void __delay(unsigned long loops) +{ + if(x86_udelay_tsc) + __rdtsc_delay(loops); + else + __loop_delay(loops); +} + inline void __const_udelay(unsigned long xloops) { int d0; diff --git a/arch/ia64/config.in b/arch/ia64/config.in index 3d1dd7e02..e22e1dd01 100644 --- a/arch/ia64/config.in +++ b/arch/ia64/config.in @@ -80,6 +80,19 @@ if [ "$CONFIG_NET" = "y" ]; then fi mainmenu_option next_comment +comment 'ATA/IDE/MFM/RLL support' + +tristate 'ATA/IDE/MFM/RLL support' CONFIG_IDE + +if [ "$CONFIG_IDE" != "n" ]; then + source drivers/ide/Config.in +else + define_bool CONFIG_BLK_DEV_IDE_MODES n + define_bool CONFIG_BLK_DEV_HD n +fi +endmenu + +mainmenu_option next_comment comment 'SCSI support' tristate 'SCSI support' CONFIG_SCSI diff --git a/arch/ia64/defconfig b/arch/ia64/defconfig index a96599889..f0e36f6b2 100644 --- a/arch/ia64/defconfig +++ b/arch/ia64/defconfig @@ -38,12 +38,6 @@ CONFIG_PCI_OLD_PROC=y # Block devices # # CONFIG_BLK_DEV_FD is not set -# CONFIG_BLK_DEV_IDE is not set - -# -# Please see Documentation/ide.txt for help/info on IDE drives -# -# CONFIG_BLK_DEV_HD_ONLY is not set # # Additional Block Devices @@ -55,6 +49,45 @@ CONFIG_PCI_OLD_PROC=y # CONFIG_BLK_DEV_XD is not set CONFIG_PARIDE_PARPORT=y # CONFIG_PARIDE is not set + +# +# ATA/IDE/MFM/RLL support +# +CONFIG_IDE=y +CONFIG_BLK_DEV_IDE=y + +# +# Please see Documentation/ide.txt for help/info on IDE drives +# +# CONFIG_BLK_DEV_HD_IDE is not set +CONFIG_BLK_DEV_IDEDISK=y +# CONFIG_IDEDISK_MULTI_MODE is not set +# CONFIG_BLK_DEV_IDECS is not set +CONFIG_BLK_DEV_IDECD=y +# CONFIG_BLK_DEV_IDETAPE is not set +# CONFIG_BLK_DEV_IDEFLOPPY is not set +# CONFIG_BLK_DEV_IDESCSI is not set + +# +# IDE chipset support/bugfixes +# +# CONFIG_BLK_DEV_CMD640 is not set +# CONFIG_BLK_DEV_CMD640_ENHANCED is not set +# CONFIG_BLK_DEV_ISAPNP is not set +# CONFIG_BLK_DEV_RZ1000 is not set +CONFIG_BLK_DEV_IDEPCI=y +CONFIG_IDEPCI_SHARE_IRQ=y +CONFIG_BLK_DEV_IDEDMA_PCI=y +CONFIG_IDEDMA_PCI_AUTO=y +# CONFIG_IDEDMA_NEW_DRIVE_LISTINGS is not set +CONFIG_IDEDMA_PCI_EXPERIMENTAL=y +# CONFIG_BLK_DEV_OFFBOARD is not set +CONFIG_BLK_DEV_PIIX=y +CONFIG_PIIX_TUNING=y +CONFIG_BLK_DEV_IDEDMA=y +CONFIG_IDEDMA_AUTO=y +# CONFIG_IDE_CHIPSETS is not set +CONFIG_BLK_DEV_IDE_MODES=y # CONFIG_BLK_DEV_HD is not set # diff --git a/arch/m68k/config.in b/arch/m68k/config.in index 5b12f470e..52b81739e 100644 --- a/arch/m68k/config.in +++ b/arch/m68k/config.in @@ -152,6 +152,19 @@ if [ "$CONFIG_NET" = "y" ]; then fi mainmenu_option next_comment +comment 'ATA/IDE/MFM/RLL support' + +tristate 'ATA/IDE/MFM/RLL support' CONFIG_IDE + +if [ "$CONFIG_IDE" != "n" ]; then + source drivers/ide/Config.in +else + define_bool CONFIG_BLK_DEV_IDE_MODES n + define_bool CONFIG_BLK_DEV_HD n +fi +endmenu + +mainmenu_option next_comment comment 'SCSI support' tristate 'SCSI support' CONFIG_SCSI diff --git a/arch/m68k/defconfig b/arch/m68k/defconfig index cbea6ba63..e11c32b95 100644 --- a/arch/m68k/defconfig +++ b/arch/m68k/defconfig @@ -56,13 +56,6 @@ CONFIG_PROC_HARDWARE=y CONFIG_AMIGA_FLOPPY=y CONFIG_ATARI_FLOPPY=y # CONFIG_BLK_DEV_LOOP is not set -# CONFIG_BLK_DEV_IDE is not set -# CONFIG_BLK_DEV_IDEDISK is not set -# CONFIG_BLK_DEV_IDECD is not set -# CONFIG_BLK_DEV_IDETAPE is not set -# CONFIG_BLK_DEV_IDEFLOPPY is not set -# CONFIG_BLK_DEV_IDESCSI is not set -# CONFIG_BLK_DEV_IDEDOUBLER is not set # CONFIG_AMIGA_Z2RAM is not set # CONFIG_ATARI_ACSI is not set # CONFIG_ACSI_MULTI_LUN is not set @@ -121,6 +114,11 @@ CONFIG_IP_NOSR=y # CONFIG_NET_SCHED is not set # +# ATA/IDE/MFM/RLL support +# +# CONFIG_IDE is not set + +# # SCSI support # CONFIG_SCSI=y diff --git a/arch/mips/arc/init.c b/arch/mips/arc/init.c index 81cf6cf74..05200cb42 100644 --- a/arch/mips/arc/init.c +++ b/arch/mips/arc/init.c @@ -1,4 +1,4 @@ -/* $Id: init.c,v 1.4 1999/10/09 00:00:57 ralf Exp $ +/* $Id: init.c,v 1.5 2000/03/07 15:45:27 ralf Exp $ * This file is subject to the terms and conditions of the GNU General Public+ * License. See the file "COPYING" in the main directory of this archive * for more details. @@ -23,7 +23,7 @@ unsigned short prom_vers, prom_rev; extern void prom_testtree(void); -int __init prom_init(int argc, char **argv, char **envp) +int __init prom_init(int argc, char **argv, char **envp, int *prom_vec) { struct linux_promblock *pb; diff --git a/arch/mips/config.in b/arch/mips/config.in index c26394e33..1f70c46ad 100644 --- a/arch/mips/config.in +++ b/arch/mips/config.in @@ -1,4 +1,4 @@ -# $Id: config.in,v 1.43 2000/03/12 10:07:55 harald Exp $ +# $Id: config.in,v 1.44 2000/03/13 20:55:19 ralf Exp $ # For a description of the syntax of this configuration file, # see the Configure script. # @@ -168,6 +168,19 @@ fi source drivers/telephony/Config.in mainmenu_option next_comment +comment 'ATA/IDE/MFM/RLL support' + +tristate 'ATA/IDE/MFM/RLL support' CONFIG_IDE + +if [ "$CONFIG_IDE" != "n" ]; then + source drivers/ide/Config.in +else + define_bool CONFIG_BLK_DEV_IDE_MODES n + define_bool CONFIG_BLK_DEV_HD n +fi +endmenu + +mainmenu_option next_comment comment 'SCSI support' tristate 'SCSI support' CONFIG_SCSI diff --git a/arch/mips/defconfig b/arch/mips/defconfig index 1fda5e771..90b6b4882 100644 --- a/arch/mips/defconfig +++ b/arch/mips/defconfig @@ -73,12 +73,8 @@ CONFIG_KMOD=y # Block devices # # CONFIG_BLK_DEV_FD is not set -# CONFIG_BLK_DEV_IDE is not set - -# -# Please see Documentation/ide.txt for help/info on IDE drives -# -# CONFIG_BLK_DEV_HD_ONLY is not set +# CONFIG_BLK_DEV_XD is not set +# CONFIG_PARIDE is not set # # Additional Block Devices @@ -87,10 +83,6 @@ CONFIG_KMOD=y # CONFIG_BLK_DEV_NBD is not set # CONFIG_BLK_DEV_MD is not set # CONFIG_BLK_DEV_RAM is not set -# CONFIG_BLK_DEV_XD is not set -# CONFIG_PARIDE is not set -# CONFIG_BLK_DEV_IDE_MODES is not set -# CONFIG_BLK_DEV_HD is not set # # Networking options @@ -148,6 +140,13 @@ CONFIG_IP_PNP_BOOTP=y # CONFIG_PHONE_IXJ is not set # +# ATA/IDE/MFM/RLL support +# +# CONFIG_IDE is not set +# CONFIG_BLK_DEV_IDE_MODES is not set +# CONFIG_BLK_DEV_HD is not set + +# # SCSI support # CONFIG_SCSI=y @@ -158,7 +157,6 @@ CONFIG_SCSI=y CONFIG_BLK_DEV_SD=y CONFIG_SD_EXTRA_DEVS=40 CONFIG_CHR_DEV_ST=y -CONFIG_ST_EXTRA_DEVS=2 CONFIG_BLK_DEV_SR=y # CONFIG_BLK_DEV_SR_VENDOR is not set CONFIG_SR_EXTRA_DEVS=2 diff --git a/arch/mips/defconfig-ip22 b/arch/mips/defconfig-ip22 index 1fda5e771..90b6b4882 100644 --- a/arch/mips/defconfig-ip22 +++ b/arch/mips/defconfig-ip22 @@ -73,12 +73,8 @@ CONFIG_KMOD=y # Block devices # # CONFIG_BLK_DEV_FD is not set -# CONFIG_BLK_DEV_IDE is not set - -# -# Please see Documentation/ide.txt for help/info on IDE drives -# -# CONFIG_BLK_DEV_HD_ONLY is not set +# CONFIG_BLK_DEV_XD is not set +# CONFIG_PARIDE is not set # # Additional Block Devices @@ -87,10 +83,6 @@ CONFIG_KMOD=y # CONFIG_BLK_DEV_NBD is not set # CONFIG_BLK_DEV_MD is not set # CONFIG_BLK_DEV_RAM is not set -# CONFIG_BLK_DEV_XD is not set -# CONFIG_PARIDE is not set -# CONFIG_BLK_DEV_IDE_MODES is not set -# CONFIG_BLK_DEV_HD is not set # # Networking options @@ -148,6 +140,13 @@ CONFIG_IP_PNP_BOOTP=y # CONFIG_PHONE_IXJ is not set # +# ATA/IDE/MFM/RLL support +# +# CONFIG_IDE is not set +# CONFIG_BLK_DEV_IDE_MODES is not set +# CONFIG_BLK_DEV_HD is not set + +# # SCSI support # CONFIG_SCSI=y @@ -158,7 +157,6 @@ CONFIG_SCSI=y CONFIG_BLK_DEV_SD=y CONFIG_SD_EXTRA_DEVS=40 CONFIG_CHR_DEV_ST=y -CONFIG_ST_EXTRA_DEVS=2 CONFIG_BLK_DEV_SR=y # CONFIG_BLK_DEV_SR_VENDOR is not set CONFIG_SR_EXTRA_DEVS=2 diff --git a/arch/mips/kernel/irixelf.c b/arch/mips/kernel/irixelf.c index fa9e68e6f..35055ac68 100644 --- a/arch/mips/kernel/irixelf.c +++ b/arch/mips/kernel/irixelf.c @@ -1,4 +1,4 @@ -/* $Id: irixelf.c,v 1.25 2000/03/02 02:36:50 ralf Exp $ +/* $Id: irixelf.c,v 1.26 2000/03/07 15:45:28 ralf Exp $ * * irixelf.c: Code to load IRIX ELF executables which conform to * the MIPS ABI. @@ -36,8 +36,6 @@ #include <asm/mipsregs.h> #include <asm/prctl.h> -#include <linux/config.h> - #define DLINFO_ITEMS 12 #include <linux/elf.h> @@ -609,8 +607,7 @@ void irix_map_prda_page (void) /* These are the functions used to load ELF style executables and shared * libraries. There is no binary dependent code anywhere else. */ -static inline int do_load_irix_binary(struct linux_binprm * bprm, - struct pt_regs * regs) +static int load_irix_binary(struct linux_binprm * bprm, struct pt_regs * regs) { struct elfhdr elf_ex, interp_elf_ex; struct dentry *interpreter_dentry; @@ -755,14 +752,11 @@ static inline int do_load_irix_binary(struct linux_binprm * bprm, sys_close(elf_exec_fileno); current->personality = PER_IRIX32; - if (current->exec_domain && current->exec_domain->module) - __MOD_DEC_USE_COUNT(current->exec_domain->module); + put_exec_domain(current->exec_domain); if (current->binfmt && current->binfmt->module) __MOD_DEC_USE_COUNT(current->binfmt->module); current->exec_domain = lookup_exec_domain(current->personality); current->binfmt = &irix_format; - if (current->exec_domain && current->exec_domain->module) - __MOD_INC_USE_COUNT(current->exec_domain->module); if (current->binfmt && current->binfmt->module) __MOD_INC_USE_COUNT(current->binfmt->module); @@ -832,16 +826,6 @@ out_free_ph: goto out; } -static int load_irix_binary(struct linux_binprm * bprm, struct pt_regs * regs) -{ - int retval; - - MOD_INC_USE_COUNT; - retval = do_load_irix_binary(bprm, regs); - MOD_DEC_USE_COUNT; - return retval; -} - /* This is really simpleminded and specialized - we are loading an * a.out library that is given an ELF header. */ @@ -943,13 +927,11 @@ static int load_irix_library(int fd) int retval = -EACCES; struct file *file; - MOD_INC_USE_COUNT; file = fget(fd); if (file) { retval = do_load_irix_library(file); fput(file); } - MOD_DEC_USE_COUNT; return retval; } @@ -1152,10 +1134,6 @@ static int irix_core_dump(long signr, struct pt_regs * regs, struct file *file) elf_fpregset_t fpu; /* NT_PRFPREG */ struct elf_prpsinfo psinfo; /* NT_PRPSINFO */ -#ifndef CONFIG_BINFMT_IRIX - MOD_INC_USE_COUNT; -#endif - /* Count what's needed to dump, up to the limit of coredump size. */ segs = 0; size = 0; @@ -1365,9 +1343,6 @@ static int irix_core_dump(long signr, struct pt_regs * regs, struct file *file) end_coredump: set_fs(fs); -#ifndef CONFIG_BINFMT_IRIX - MOD_DEC_USE_COUNT; -#endif return has_dumped; } diff --git a/arch/mips/kernel/syscalls.h b/arch/mips/kernel/syscalls.h index 84ab41425..d5edf1660 100644 --- a/arch/mips/kernel/syscalls.h +++ b/arch/mips/kernel/syscalls.h @@ -1,4 +1,4 @@ -/* $Id: syscalls.h,v 1.21 2000/02/05 06:47:08 ralf Exp $ +/* $Id: syscalls.h,v 1.22 2000/02/18 00:24:30 ralf Exp $ * * This file is subject to the terms and conditions of the GNU General Public * License. See the file "COPYING" in the main directory of this archive @@ -232,3 +232,5 @@ SYS(sys_stat64, 3) SYS(sys_lstat64, 3) SYS(sys_fstat64, 3) /* 4215 */ SYS(sys_pivot_root, 2) +SYS(sys_mincore, 3) +SYS(sys_madvise, 3) diff --git a/arch/mips64/config.in b/arch/mips64/config.in index be0501f60..5efcf06e6 100644 --- a/arch/mips64/config.in +++ b/arch/mips64/config.in @@ -1,4 +1,4 @@ -# $Id: config.in,v 1.15 2000/03/09 15:38:28 ralf Exp $ +# $Id: config.in,v 1.16 2000/03/13 20:55:19 ralf Exp $ # # For a description of the syntax of this configuration file, # see the Configure script. @@ -111,6 +111,19 @@ fi source drivers/telephony/Config.in mainmenu_option next_comment +comment 'ATA/IDE/MFM/RLL support' + +tristate 'ATA/IDE/MFM/RLL support' CONFIG_IDE + +if [ "$CONFIG_IDE" != "n" ]; then + source drivers/ide/Config.in +else + define_bool CONFIG_BLK_DEV_IDE_MODES n + define_bool CONFIG_BLK_DEV_HD n +fi +endmenu + +mainmenu_option next_comment comment 'SCSI support' tristate 'SCSI support' CONFIG_SCSI diff --git a/arch/mips64/defconfig b/arch/mips64/defconfig index f34f2e63a..8838fed35 100644 --- a/arch/mips64/defconfig +++ b/arch/mips64/defconfig @@ -63,13 +63,10 @@ CONFIG_PCI_NAMES=y # Block devices # # CONFIG_BLK_DEV_FD is not set -# CONFIG_BLK_DEV_IDE is not set - -# -# Please see Documentation/ide.txt for help/info on IDE drives -# -# CONFIG_BLK_DEV_HD_ONLY is not set +# CONFIG_BLK_DEV_XD is not set +# CONFIG_PARIDE is not set # CONFIG_BLK_CPQ_DA is not set +# CONFIG_BLK_DEV_DAC960 is not set # # Additional Block Devices @@ -78,11 +75,6 @@ CONFIG_PCI_NAMES=y # CONFIG_BLK_DEV_NBD is not set # CONFIG_BLK_DEV_MD is not set # CONFIG_BLK_DEV_RAM is not set -# CONFIG_BLK_DEV_XD is not set -# CONFIG_BLK_DEV_DAC960 is not set -# CONFIG_PARIDE is not set -# CONFIG_BLK_DEV_IDE_MODES is not set -# CONFIG_BLK_DEV_HD is not set # # Networking options @@ -123,6 +115,13 @@ CONFIG_SKB_LARGE=y # CONFIG_PHONE_IXJ is not set # +# ATA/IDE/MFM/RLL support +# +# CONFIG_IDE is not set +# CONFIG_BLK_DEV_IDE_MODES is not set +# CONFIG_BLK_DEV_HD is not set + +# # SCSI support # CONFIG_SCSI=y diff --git a/arch/mips64/defconfig-ip27 b/arch/mips64/defconfig-ip27 index f34f2e63a..8838fed35 100644 --- a/arch/mips64/defconfig-ip27 +++ b/arch/mips64/defconfig-ip27 @@ -63,13 +63,10 @@ CONFIG_PCI_NAMES=y # Block devices # # CONFIG_BLK_DEV_FD is not set -# CONFIG_BLK_DEV_IDE is not set - -# -# Please see Documentation/ide.txt for help/info on IDE drives -# -# CONFIG_BLK_DEV_HD_ONLY is not set +# CONFIG_BLK_DEV_XD is not set +# CONFIG_PARIDE is not set # CONFIG_BLK_CPQ_DA is not set +# CONFIG_BLK_DEV_DAC960 is not set # # Additional Block Devices @@ -78,11 +75,6 @@ CONFIG_PCI_NAMES=y # CONFIG_BLK_DEV_NBD is not set # CONFIG_BLK_DEV_MD is not set # CONFIG_BLK_DEV_RAM is not set -# CONFIG_BLK_DEV_XD is not set -# CONFIG_BLK_DEV_DAC960 is not set -# CONFIG_PARIDE is not set -# CONFIG_BLK_DEV_IDE_MODES is not set -# CONFIG_BLK_DEV_HD is not set # # Networking options @@ -123,6 +115,13 @@ CONFIG_SKB_LARGE=y # CONFIG_PHONE_IXJ is not set # +# ATA/IDE/MFM/RLL support +# +# CONFIG_IDE is not set +# CONFIG_BLK_DEV_IDE_MODES is not set +# CONFIG_BLK_DEV_HD is not set + +# # SCSI support # CONFIG_SCSI=y diff --git a/arch/mips64/kernel/scall_64.S b/arch/mips64/kernel/scall_64.S index d739e50c1..af3dd1d87 100644 --- a/arch/mips64/kernel/scall_64.S +++ b/arch/mips64/kernel/scall_64.S @@ -1,4 +1,4 @@ -/* $Id: scall_64.S,v 1.6 2000/02/18 00:24:30 ralf Exp $ +/* $Id: scall_64.S,v 1.7 2000/02/23 00:41:00 ralf Exp $ * * This file is subject to the terms and conditions of the GNU General Public * License. See the file "COPYING" in the main directory of this archive @@ -345,3 +345,5 @@ sys_call_table: PTR sys_ni_syscall PTR sys_ni_syscall PTR sys_pivot_root /* 4210 */ + PTR sys_mincore + PTR sys_madvise diff --git a/arch/mips64/kernel/scall_o32.S b/arch/mips64/kernel/scall_o32.S index 9d09499c6..246fd8346 100644 --- a/arch/mips64/kernel/scall_o32.S +++ b/arch/mips64/kernel/scall_o32.S @@ -1,4 +1,4 @@ -/* $Id: scall_o32.S,v 1.12 2000/03/18 09:02:17 ulfc Exp $ +/* $Id: scall_o32.S,v 1.13 2000/03/18 15:08:06 ulfc Exp $ * * This file is subject to the terms and conditions of the GNU General Public * License. See the file "COPYING" in the main directory of this archive @@ -409,6 +409,8 @@ illegal_syscall: sys sys_lstat64 3 sys sys_fstat64 3 /* 4210 */ sys sys_pivot_root 2 + sys sys_mincore 3 + sys sys_madvise 3 .endm .macro sys function, nargs diff --git a/arch/ppc/config.in b/arch/ppc/config.in index 7d0ab5fa0..38d9dc72e 100644 --- a/arch/ppc/config.in +++ b/arch/ppc/config.in @@ -187,6 +187,19 @@ if [ "$CONFIG_NET" = "y" ]; then fi mainmenu_option next_comment +comment 'ATA/IDE/MFM/RLL support' + +tristate 'ATA/IDE/MFM/RLL support' CONFIG_IDE + +if [ "$CONFIG_IDE" != "n" ]; then + source drivers/ide/Config.in +else + define_bool CONFIG_BLK_DEV_IDE_MODES n + define_bool CONFIG_BLK_DEV_HD n +fi +endmenu + +mainmenu_option next_comment comment 'SCSI support' tristate 'SCSI support' CONFIG_SCSI if [ "$CONFIG_SCSI" != "n" ]; then diff --git a/arch/ppc/defconfig b/arch/ppc/defconfig index bcab91ec6..5b5288b30 100644 --- a/arch/ppc/defconfig +++ b/arch/ppc/defconfig @@ -79,32 +79,6 @@ CONFIG_BOOTX_TEXT=y # Block devices # # CONFIG_BLK_DEV_FD is not set -CONFIG_BLK_DEV_IDE=y -# CONFIG_BLK_DEV_HD_IDE is not set -CONFIG_BLK_DEV_IDEDISK=y -# CONFIG_IDEDISK_MULTI_MODE is not set -# CONFIG_BLK_DEV_IDECS is not set -CONFIG_BLK_DEV_IDECD=y -# CONFIG_BLK_DEV_IDETAPE is not set -CONFIG_BLK_DEV_IDEFLOPPY=y -CONFIG_BLK_DEV_IDESCSI=y -# CONFIG_BLK_DEV_CMD640 is not set -# CONFIG_BLK_DEV_RZ1000 is not set -CONFIG_BLK_DEV_IDEPCI=y -# CONFIG_IDEPCI_SHARE_IRQ is not set -# CONFIG_BLK_DEV_IDEDMA_PCI is not set -# CONFIG_BLK_DEV_OFFBOARD is not set -# CONFIG_BLK_DEV_AEC6210 is not set -# CONFIG_BLK_DEV_CMD64X is not set -# CONFIG_BLK_DEV_CS5530 is not set -# CONFIG_BLK_DEV_OPTI621 is not set -CONFIG_BLK_DEV_SL82C105=y -CONFIG_BLK_DEV_IDE_PMAC=y -CONFIG_BLK_DEV_IDEDMA_PMAC=y -CONFIG_IDEDMA_PMAC_AUTO=y -CONFIG_BLK_DEV_IDEDMA=y -CONFIG_IDEDMA_AUTO=y -# CONFIG_IDE_CHIPSETS is not set # CONFIG_BLK_CPQ_DA is not set CONFIG_BLK_DEV_LOOP=y # CONFIG_BLK_DEV_NBD is not set @@ -114,8 +88,6 @@ CONFIG_BLK_DEV_INITRD=y # CONFIG_BLK_DEV_XD is not set # CONFIG_BLK_DEV_DAC960 is not set # CONFIG_PARIDE is not set -CONFIG_BLK_DEV_IDE_MODES=y -# CONFIG_BLK_DEV_HD is not set # # Networking options @@ -160,6 +132,40 @@ CONFIG_ATALK=m # CONFIG_NET_SCHED is not set # +# ATA/IDE/MFM/RLL support +# +CONFIG_IDE=y +CONFIG_BLK_DEV_IDE=y + +# CONFIG_BLK_DEV_HD_IDE is not set +CONFIG_BLK_DEV_IDEDISK=y +# CONFIG_IDEDISK_MULTI_MODE is not set +# CONFIG_BLK_DEV_IDECS is not set +CONFIG_BLK_DEV_IDECD=y +# CONFIG_BLK_DEV_IDETAPE is not set +CONFIG_BLK_DEV_IDEFLOPPY=y +CONFIG_BLK_DEV_IDESCSI=y +# CONFIG_BLK_DEV_CMD640 is not set +# CONFIG_BLK_DEV_RZ1000 is not set +CONFIG_BLK_DEV_IDEPCI=y +# CONFIG_IDEPCI_SHARE_IRQ is not set +# CONFIG_BLK_DEV_IDEDMA_PCI is not set +# CONFIG_BLK_DEV_OFFBOARD is not set +# CONFIG_BLK_DEV_AEC6210 is not set +# CONFIG_BLK_DEV_CMD64X is not set +# CONFIG_BLK_DEV_CS5530 is not set +# CONFIG_BLK_DEV_OPTI621 is not set +CONFIG_BLK_DEV_SL82C105=y +CONFIG_BLK_DEV_IDE_PMAC=y +CONFIG_BLK_DEV_IDEDMA_PMAC=y +CONFIG_IDEDMA_PMAC_AUTO=y +CONFIG_BLK_DEV_IDEDMA=y +CONFIG_IDEDMA_AUTO=y +# CONFIG_IDE_CHIPSETS is not set +CONFIG_BLK_DEV_IDE_MODES=y +# CONFIG_BLK_DEV_HD is not set + +# # SCSI support # CONFIG_SCSI=y diff --git a/arch/sh/config.in b/arch/sh/config.in index fd858e00e..c711ee931 100644 --- a/arch/sh/config.in +++ b/arch/sh/config.in @@ -95,6 +95,19 @@ if [ "$CONFIG_NET" = "y" ]; then fi mainmenu_option next_comment +comment 'ATA/IDE/MFM/RLL support' + +tristate 'ATA/IDE/MFM/RLL support' CONFIG_IDE + +if [ "$CONFIG_IDE" != "n" ]; then + source drivers/ide/Config.in +else + define_bool CONFIG_BLK_DEV_IDE_MODES n + define_bool CONFIG_BLK_DEV_HD n +fi +endmenu + +mainmenu_option next_comment comment 'SCSI support' tristate 'SCSI support' CONFIG_SCSI diff --git a/arch/sh/defconfig b/arch/sh/defconfig index ea5851d39..a3f901220 100644 --- a/arch/sh/defconfig +++ b/arch/sh/defconfig @@ -45,6 +45,21 @@ CONFIG_BINFMT_ELF=y # Block devices # # CONFIG_BLK_DEV_FD is not set + +# +# Additional Block Devices +# +# CONFIG_BLK_DEV_LOOP is not set +# CONFIG_BLK_DEV_MD is not set +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_INITRD=y +# CONFIG_BLK_DEV_XD is not set +# CONFIG_PARIDE is not set + +# +# ATA/IDE/MFM/RLL support +# +CONFIG_IDE=y CONFIG_BLK_DEV_IDE=y # @@ -63,16 +78,6 @@ CONFIG_BLK_DEV_IDEDISK=y # # CONFIG_BLK_DEV_CMD640 is not set # CONFIG_IDE_CHIPSETS is not set - -# -# Additional Block Devices -# -# CONFIG_BLK_DEV_LOOP is not set -# CONFIG_BLK_DEV_MD is not set -CONFIG_BLK_DEV_RAM=y -CONFIG_BLK_DEV_INITRD=y -# CONFIG_BLK_DEV_XD is not set -# CONFIG_PARIDE is not set # CONFIG_BLK_DEV_IDE_MODES is not set # CONFIG_BLK_DEV_HD is not set diff --git a/arch/sparc/boot/piggyback.c b/arch/sparc/boot/piggyback.c index b75edb418..04049be7a 100644 --- a/arch/sparc/boot/piggyback.c +++ b/arch/sparc/boot/piggyback.c @@ -1,4 +1,4 @@ -/* $Id: piggyback.c,v 1.2 1998/12/15 12:24:43 jj Exp $ +/* $Id: piggyback.c,v 1.3 2000/03/11 00:22:26 zaitcev Exp $ Simple utility to make a single-image install kernel with initial ramdisk for Sparc tftpbooting without need to set up nfs. @@ -29,8 +29,18 @@ #include <sys/types.h> #include <sys/stat.h> -/* Note: run this on an a.out kernel (use elftoaout for it), as PROM looks for a.out image onlly - usage: piggyback vmlinux System.map tail, where tail is gzipped fs of the initial ramdisk */ +/* + * Note: run this on an a.out kernel (use elftoaout for it), + * as PROM looks for a.out image only. + */ + +void usage(void) +{ + /* fs_img.gz is an image of initial ramdisk. */ + fprintf(stderr, "Usage: piggyback vmlinux.aout System.map fs_img.gz\n"); + fprintf(stderr, "\tKernel image will be modified in place.\n"); + exit(1); +} void die(char *str) { @@ -45,7 +55,8 @@ int main(int argc,char **argv) FILE *map; struct stat s; int image, tail; - + + if (argc != 4) usage(); start = end = 0; if (stat (argv[3], &s) < 0) die (argv[3]); map = fopen (argv[2], "r"); diff --git a/arch/sparc/config.in b/arch/sparc/config.in index 756e531c2..adb0ebe4c 100644 --- a/arch/sparc/config.in +++ b/arch/sparc/config.in @@ -1,4 +1,4 @@ -# $Id: config.in,v 1.87 2000/02/27 19:34:12 davem Exp $ +# $Id: config.in,v 1.88 2000/03/13 03:40:27 davem Exp $ # For a description of the syntax of this configuration file, # see the Configure script. # @@ -74,10 +74,9 @@ fi endmenu mainmenu_option next_comment -comment 'Floppy, IDE, and other block devices' +comment 'Floppy and other block devices' bool 'Normal floppy disk support' CONFIG_BLK_DEV_FD -define_bool CONFIG_BLK_DEV_IDE n bool 'Multiple devices driver support' CONFIG_BLK_DEV_MD if [ "$CONFIG_BLK_DEV_MD" = "y" ]; then tristate ' Linear (append) mode' CONFIG_MD_LINEAR @@ -109,6 +108,24 @@ if [ "$CONFIG_ISDN" != "n" ]; then fi endmenu + +define_bool CONFIG_IDE n +define_bool CONFIG_BLK_DEV_IDE_MODES n +define_bool CONFIG_BLK_DEV_HD n + +# mainmenu_option next_comment +# comment 'ATA/IDE/MFM/RLL support' +# +# tristate 'ATA/IDE/MFM/RLL support' CONFIG_IDE +# +# if [ "$CONFIG_IDE" != "n" ]; then +# source drivers/ide/Config.in +# else +# define_bool CONFIG_BLK_DEV_IDE_MODES n +# define_bool CONFIG_BLK_DEV_HD n +# fi +# endmenu + mainmenu_option next_comment comment 'SCSI support' diff --git a/arch/sparc/defconfig b/arch/sparc/defconfig index e719d9214..de483af6e 100644 --- a/arch/sparc/defconfig +++ b/arch/sparc/defconfig @@ -101,7 +101,6 @@ CONFIG_KMOD=y # Floppy, IDE, and other block devices # CONFIG_BLK_DEV_FD=y -# CONFIG_BLK_DEV_IDE is not set CONFIG_BLK_DEV_MD=y CONFIG_MD_LINEAR=m CONFIG_MD_STRIPED=m @@ -170,6 +169,11 @@ CONFIG_DECNET_SIOCGIFCONF=y # CONFIG_ISDN is not set # +# ATA/IDE/MFM/RLL support +# +# CONFIG_IDE is not set + +# # SCSI support # CONFIG_SCSI=y diff --git a/arch/sparc/kernel/sys_solaris.c b/arch/sparc/kernel/sys_solaris.c index 6c46c60f0..8a9d54913 100644 --- a/arch/sparc/kernel/sys_solaris.c +++ b/arch/sparc/kernel/sys_solaris.c @@ -15,12 +15,14 @@ #include <linux/smp.h> #include <linux/smp_lock.h> +/* CHECKME: this stuff looks rather bogus */ asmlinkage int do_solaris_syscall (struct pt_regs *regs) { int ret; lock_kernel(); + put_exec_domain(current->exec_domain); current->personality = PER_SVR4; current->exec_domain = lookup_exec_domain(PER_SVR4); diff --git a/arch/sparc/kernel/sys_sunos.c b/arch/sparc/kernel/sys_sunos.c index 1d6f208f6..262f6afdd 100644 --- a/arch/sparc/kernel/sys_sunos.c +++ b/arch/sparc/kernel/sys_sunos.c @@ -1,4 +1,4 @@ -/* $Id: sys_sunos.c,v 1.114 2000/03/07 22:27:27 davem Exp $ +/* $Id: sys_sunos.c,v 1.115 2000/03/13 21:57:23 davem Exp $ * sys_sunos.c: SunOS specific syscall compatibility support. * * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) @@ -296,57 +296,6 @@ asmlinkage void sunos_madvise(unsigned long address, unsigned long len, unlock_kernel(); } -/* Places into character array, the status of all the pages in the passed - * range from 'addr' to 'addr + len'. -1 on failure, 0 on success... - * The encoding in each character is: - * low-bit is zero == Page is not in physical ram right now - * low-bit is one == Page is currently residing in core - * All other bits are undefined within the character so there... - * Also, if you try to get stats on an area outside of the user vm area - * *or* the passed base address is not aligned on a page boundary you - * get an error. - */ -asmlinkage int sunos_mincore(unsigned long addr, unsigned long len, char *array) -{ - pgd_t *pgdp; - pmd_t *pmdp; - pte_t *ptep; - unsigned long limit; - int num_pages, pnum, retval = -EINVAL; - - lock_kernel(); - if(addr & ~(PAGE_MASK)) - goto out; - - num_pages = (len / PAGE_SIZE); - retval = -EFAULT; - if(verify_area(VERIFY_WRITE, array, num_pages)) - goto out; - retval = -ENOMEM; - if((addr >= PAGE_OFFSET) || ((addr + len) > PAGE_OFFSET)) - goto out; /* I'm sure you're curious about kernel mappings.. */ - - /* Wheee, go through pte's */ - pnum = 0; - for(limit = addr + len; addr < limit; addr += PAGE_SIZE, pnum++) { - pgdp = pgd_offset(current->mm, addr); - if(pgd_none(*pgdp)) - goto out; /* As per SunOS manpage */ - pmdp = pmd_offset(pgdp, addr); - if(pmd_none(*pmdp)) - goto out; /* As per SunOS manpage */ - ptep = pte_offset(pmdp, addr); - if(pte_none(*ptep)) - goto out; /* As per SunOS manpage */ - /* Page in core or Swapped page? */ - __put_user((pte_present(*ptep) ? 1 : 0), &array[pnum]); - } - retval = 0; /* Success... I think... */ -out: - unlock_kernel(); - return retval; -} - /* This just wants the soft limit (ie. rlim_cur element) of the RLIMIT_NOFILE * resource limit and is for backwards compatibility with older sunos * revs. diff --git a/arch/sparc/kernel/systbls.S b/arch/sparc/kernel/systbls.S index 8746958d7..42c072164 100644 --- a/arch/sparc/kernel/systbls.S +++ b/arch/sparc/kernel/systbls.S @@ -1,4 +1,4 @@ -/* $Id: systbls.S,v 1.94 2000/02/16 07:31:30 davem Exp $ +/* $Id: systbls.S,v 1.95 2000/03/13 21:57:23 davem Exp $ * systbls.S: System call entry point tables for OS compatibility. * The native Linux system call table lives here also. * @@ -33,7 +33,7 @@ sys_call_table: /*60*/ .long sys_umask, sys_chroot, sys_newfstat, sys_fstat64, sys_getpagesize /*65*/ .long sys_msync, sys_vfork, sys_pread, sys_pwrite, sys_geteuid /*70*/ .long sys_getegid, sys_mmap, sys_setreuid, sys_munmap, sys_mprotect -/*75*/ .long sys_nis_syscall, sys_vhangup, sys_truncate64, sys_nis_syscall, sys_getgroups16 +/*75*/ .long sys_nis_syscall, sys_vhangup, sys_truncate64, sys_mincore, sys_getgroups16 /*80*/ .long sys_setgroups16, sys_getpgrp, sys_setgroups, sys_setitimer, sys_ftruncate64 /*85*/ .long sys_swapon, sys_getitimer, sys_setuid, sys_sethostname, sys_setgid /*90*/ .long sys_dup2, sys_setfsuid, sys_fcntl, sys_select, sys_setfsgid @@ -104,7 +104,7 @@ sunos_sys_table: .long sunos_nosys, sunos_sbrk, sunos_sstk .long sunos_mmap, sunos_vadvise, sys_munmap .long sys_mprotect, sunos_madvise, sys_vhangup - .long sunos_nosys, sunos_mincore, sys_getgroups16 + .long sunos_nosys, sys_mincore, sys_getgroups16 .long sys_setgroups16, sys_getpgrp, sunos_setpgrp .long sys_setitimer, sunos_nosys, sys_swapon .long sys_getitimer, sys_gethostname, sys_sethostname diff --git a/arch/sparc64/config.in b/arch/sparc64/config.in index 47c6a5afd..a1fb222c1 100644 --- a/arch/sparc64/config.in +++ b/arch/sparc64/config.in @@ -1,4 +1,4 @@ -# $Id: config.in,v 1.99 2000/02/27 19:34:17 davem Exp $ +# $Id: config.in,v 1.101 2000/03/13 05:49:55 jj Exp $ # For a description of the syntax of this configuration file, # see the Configure script. # @@ -98,29 +98,22 @@ fi tristate 'Loopback device support' CONFIG_BLK_DEV_LOOP tristate 'Network block device support' CONFIG_BLK_DEV_NBD -if [ "$CONFIG_PCI" = "y" ]; then - tristate 'Ultra/PCI IDE disk/cdrom/tape/floppy support' CONFIG_BLK_DEV_IDE - if [ "$CONFIG_BLK_DEV_IDE" != "n" ]; then - dep_tristate ' Include IDE/ATA-2 DISK support' CONFIG_BLK_DEV_IDEDISK $CONFIG_BLK_DEV_IDE - dep_tristate ' Include IDE/ATAPI CDROM support' CONFIG_BLK_DEV_IDECD $CONFIG_BLK_DEV_IDE - dep_tristate ' Include IDE/ATAPI TAPE support' CONFIG_BLK_DEV_IDETAPE $CONFIG_BLK_DEV_IDE - dep_tristate ' Include IDE/ATAPI FLOPPY support' CONFIG_BLK_DEV_IDEFLOPPY $CONFIG_BLK_DEV_IDE - dep_tristate ' SCSI emulation support' CONFIG_BLK_DEV_IDESCSI $CONFIG_BLK_DEV_IDE - define_bool CONFIG_BLK_DEV_IDEPCI y - define_bool CONFIG_BLK_DEV_IDEDMA y - define_bool CONFIG_IDEDMA_AUTO y - define_bool CONFIG_IDEDMA_NEW_DRIVE_LISTINGS y - define_bool CONFIG_BLK_DEV_NS87415 y - define_bool CONFIG_BLK_DEV_CMD64X y - define_bool CONFIG_BLK_DEV_IDE_MODES y - fi +if [ "$CONFIG_NET" = "y" ]; then + source net/Config.in fi -endmenu +mainmenu_option next_comment +comment 'ATA/IDE/MFM/RLL support' -if [ "$CONFIG_NET" = "y" ]; then - source net/Config.in +tristate 'ATA/IDE/MFM/RLL support' CONFIG_IDE + +if [ "$CONFIG_IDE" != "n" ]; then + source drivers/ide/Config.in +else + define_bool CONFIG_BLK_DEV_IDE_MODES n + define_bool CONFIG_BLK_DEV_HD n fi +endmenu mainmenu_option next_comment comment 'SCSI support' @@ -172,12 +165,16 @@ if [ "$CONFIG_SCSI" != "n" ]; then bool ' Collect statistics to report in /proc' CONFIG_AIC7XXX_PROC_STATS N int ' Delay in seconds after SCSI bus reset' CONFIG_AIC7XXX_RESET_DELAY 5 fi + dep_tristate 'NCR53C8XX SCSI support' CONFIG_SCSI_NCR53C8XX $CONFIG_SCSI dep_tristate 'SYM53C8XX SCSI support' CONFIG_SCSI_SYM53C8XX $CONFIG_SCSI - if [ "$CONFIG_SCSI_SYM53C8XX" != "n" ]; then + if [ "$CONFIG_SCSI_NCR53C8XX" != "n" -o "$CONFIG_SCSI_SYM53C8XX" != "n" ]; then int 'default tagged command queue depth' CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS 8 int 'maximum number of queued commands' CONFIG_SCSI_NCR53C8XX_MAX_TAGS 32 int 'synchronous transfers frequency in MHz' CONFIG_SCSI_NCR53C8XX_SYNC 10 bool ' enable profiling' CONFIG_SCSI_NCR53C8XX_PROFILE + if [ "$CONFIG_SCSI_SYM53C8XX" != "n" ]; then + bool ' include support for the NCR PQS/PDS SCSI card' CONFIG_SCSI_NCR53C8XX_PQS_PDS + fi if [ "$CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS" = "0" ]; then bool ' not allow targets to disconnect' CONFIG_SCSI_NCR53C8XX_NO_DISCONNECT fi @@ -219,7 +216,7 @@ if [ "$CONFIG_NET" = "y" ]; then mainmenu_option next_comment comment 'Ethernet (10 or 100Mbit)' - bool 'Sun LANCE support' CONFIG_SUNLANCE + tristate 'Sun LANCE support' CONFIG_SUNLANCE tristate 'Sun Happy Meal 10/100baseT support' CONFIG_HAPPYMEAL if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then tristate 'Sun BigMAC 10/100baseT support (EXPERIMENTAL)' CONFIG_SUNBMAC diff --git a/arch/sparc64/defconfig b/arch/sparc64/defconfig index a61d4d049..db85cfe1e 100644 --- a/arch/sparc64/defconfig +++ b/arch/sparc64/defconfig @@ -128,19 +128,6 @@ CONFIG_BLK_DEV_FD=y # CONFIG_BLK_DEV_RAM is not set CONFIG_BLK_DEV_LOOP=m CONFIG_BLK_DEV_NBD=m -CONFIG_BLK_DEV_IDE=y -CONFIG_BLK_DEV_IDEDISK=y -CONFIG_BLK_DEV_IDECD=y -CONFIG_BLK_DEV_IDETAPE=m -CONFIG_BLK_DEV_IDEFLOPPY=m -# CONFIG_BLK_DEV_IDESCSI is not set -CONFIG_BLK_DEV_IDEPCI=y -CONFIG_BLK_DEV_IDEDMA=y -CONFIG_IDEDMA_AUTO=y -CONFIG_IDEDMA_NEW_DRIVE_LISTINGS=y -CONFIG_BLK_DEV_NS87415=y -CONFIG_BLK_DEV_CMD64X=y -CONFIG_BLK_DEV_IDE_MODES=y # # Networking options @@ -195,6 +182,71 @@ CONFIG_DECNET_SIOCGIFCONF=y # CONFIG_NET_SCHED is not set # +# ATA/IDE/MFM/RLL support +# +CONFIG_IDE=y + +# +# IDE, ATA and ATAPI Block devices +# +CONFIG_BLK_DEV_IDE=y + +# +# Please see Documentation/ide.txt for help/info on IDE drives +# +# CONFIG_BLK_DEV_HD_IDE is not set +# CONFIG_BLK_DEV_HD is not set +CONFIG_BLK_DEV_IDEDISK=y +# CONFIG_IDEDISK_MULTI_MODE is not set +# CONFIG_BLK_DEV_IDECS is not set +CONFIG_BLK_DEV_IDECD=y +CONFIG_BLK_DEV_IDETAPE=m +CONFIG_BLK_DEV_IDEFLOPPY=m +# CONFIG_BLK_DEV_IDESCSI is not set + +# +# IDE chipset support/bugfixes +# +# CONFIG_BLK_DEV_CMD640 is not set +# CONFIG_BLK_DEV_CMD640_ENHANCED is not set +# CONFIG_BLK_DEV_ISAPNP is not set +# CONFIG_BLK_DEV_RZ1000 is not set +CONFIG_BLK_DEV_IDEPCI=y +# CONFIG_IDEPCI_SHARE_IRQ is not set +CONFIG_BLK_DEV_IDEDMA_PCI=y +# CONFIG_BLK_DEV_OFFBOARD is not set +CONFIG_IDEDMA_PCI_AUTO=y +CONFIG_BLK_DEV_IDEDMA=y +CONFIG_IDEDMA_AUTO=y +CONFIG_IDEDMA_PCI_EXPERIMENTAL=y +# CONFIG_IDEDMA_PCI_WIP is not set +# CONFIG_IDEDMA_NEW_DRIVE_LISTINGS is not set +# CONFIG_BLK_DEV_AEC6210 is not set +# CONFIG_AEC6210_TUNING is not set +# CONFIG_BLK_DEV_ALI15X3 is not set +# CONFIG_BLK_DEV_AMD7409 is not set +# CONFIG_AMD7409_OVERRIDE is not set +CONFIG_BLK_DEV_CMD64X=y +# CONFIG_CMD64X_RAID is not set +# CONFIG_BLK_DEV_CY82C693 is not set +# CONFIG_BLK_DEV_CS5530 is not set +# CONFIG_BLK_DEV_HPT34X is not set +# CONFIG_HPT34X_AUTODMA is not set +# CONFIG_BLK_DEV_HPT366 is not set +# CONFIG_HPT366_FIP is not set +# CONFIG_HPT366_MODE3 is not set +CONFIG_BLK_DEV_NS87415=y +# CONFIG_BLK_DEV_OPTI621 is not set +# CONFIG_BLK_DEV_PDC202XX is not set +# CONFIG_PDC202XX_BURST is not set +# CONFIG_PDC202XX_MASTER is not set +# CONFIG_BLK_DEV_SIS5513 is not set +# CONFIG_BLK_DEV_TRM290 is not set +# CONFIG_BLK_DEV_VIA82CXXX is not set +# CONFIG_IDE_CHIPSETS is not set +CONFIG_BLK_DEV_IDE_MODES=y + +# # SCSI support # CONFIG_SCSI=y @@ -228,11 +280,13 @@ CONFIG_AIC7XXX_TAGGED_QUEUEING=y CONFIG_AIC7XXX_CMDS_PER_DEVICE=8 CONFIG_AIC7XXX_PROC_STATS=y CONFIG_AIC7XXX_RESET_DELAY=5 +CONFIG_SCSI_NCR53C8XX=y CONFIG_SCSI_SYM53C8XX=y CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS=4 CONFIG_SCSI_NCR53C8XX_MAX_TAGS=32 CONFIG_SCSI_NCR53C8XX_SYNC=10 # CONFIG_SCSI_NCR53C8XX_PROFILE is not set +# CONFIG_SCSI_NCR53C8XX_PQS_PDS is not set # CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT is not set CONFIG_SCSI_QLOGIC_ISP=y diff --git a/arch/sparc64/kernel/binfmt_aout32.c b/arch/sparc64/kernel/binfmt_aout32.c index 009c506a0..3e95ed9cf 100644 --- a/arch/sparc64/kernel/binfmt_aout32.c +++ b/arch/sparc64/kernel/binfmt_aout32.c @@ -82,8 +82,7 @@ if (file->f_op->llseek) { \ * dumping of the process results in another error.. */ -static inline int -do_aout32_core_dump(long signr, struct pt_regs * regs, struct file *file) +static int aout32_core_dump(long signr, struct pt_regs *regs, struct file *file) { mm_segment_t fs; int has_dumped = 0; @@ -143,17 +142,6 @@ end_coredump: return has_dumped; } -static int -aout32_core_dump(long signr, struct pt_regs * regs, struct file * file) -{ - int retval; - - MOD_INC_USE_COUNT; - retval = do_aout32_core_dump(signr, regs, file); - MOD_DEC_USE_COUNT; - return retval; -} - /* * create_aout32_tables() parses the env- and arg-strings in new user * memory and creates the pointer tables from them, and puts their @@ -207,8 +195,7 @@ static u32 *create_aout32_tables(char * p, struct linux_binprm * bprm) * libraries. There is no binary dependent code anywhere else. */ -static inline int do_load_aout32_binary(struct linux_binprm * bprm, - struct pt_regs * regs) +static int load_aout32_binary(struct linux_binprm * bprm, struct pt_regs * regs) { struct exec ex; struct file * file; @@ -320,14 +307,11 @@ static inline int do_load_aout32_binary(struct linux_binprm * bprm, } } beyond_if: - if (current->exec_domain && current->exec_domain->module) - __MOD_DEC_USE_COUNT(current->exec_domain->module); + put_exec_domain(current->exec_domain); if (current->binfmt && current->binfmt->module) __MOD_DEC_USE_COUNT(current->binfmt->module); current->exec_domain = lookup_exec_domain(current->personality); current->binfmt = &aout32_format; - if (current->exec_domain && current->exec_domain->module) - __MOD_INC_USE_COUNT(current->exec_domain->module); if (current->binfmt && current->binfmt->module) __MOD_INC_USE_COUNT(current->binfmt->module); @@ -358,21 +342,8 @@ beyond_if: return 0; } - -static int -load_aout32_binary(struct linux_binprm * bprm, struct pt_regs * regs) -{ - int retval; - - MOD_INC_USE_COUNT; - retval = do_load_aout32_binary(bprm, regs); - MOD_DEC_USE_COUNT; - return retval; -} - /* N.B. Move to .h file and use code in fs/binfmt_aout.c? */ -static inline int -do_load_aout32_library(int fd) +static int load_aout32_library(int fd) { struct file * file; struct inode * inode; @@ -444,17 +415,6 @@ out: return retval; } -static int -load_aout32_library(int fd) -{ - int retval; - - MOD_INC_USE_COUNT; - retval = do_load_aout32_library(fd); - MOD_DEC_USE_COUNT; - return retval; -} - static int __init init_aout32_binfmt(void) { return register_binfmt(&aout32_format); diff --git a/arch/sparc64/kernel/ioctl32.c b/arch/sparc64/kernel/ioctl32.c index 39a000ef3..d3a3814a8 100644 --- a/arch/sparc64/kernel/ioctl32.c +++ b/arch/sparc64/kernel/ioctl32.c @@ -1,4 +1,4 @@ -/* $Id: ioctl32.c,v 1.80 2000/02/17 06:45:09 jj Exp $ +/* $Id: ioctl32.c,v 1.82 2000/03/13 21:57:27 davem Exp $ * ioctl32.c: Conversion between 32bit and 64bit native ioctls. * * Copyright (C) 1997-2000 Jakub Jelinek (jakub@redhat.com) @@ -34,6 +34,7 @@ #include <linux/cdrom.h> #include <linux/loop.h> #include <linux/auto_fs.h> +#include <linux/devfs_fs.h> #include <linux/tty.h> #include <linux/vt_kern.h> #include <linux/fb.h> @@ -2334,6 +2335,10 @@ COMPATIBLE_IOCTL(PPPIOCSDEBUG) COMPATIBLE_IOCTL(PPPIOCNEWUNIT) COMPATIBLE_IOCTL(PPPIOCATTACH) COMPATIBLE_IOCTL(PPPIOCDETACH) +COMPATIBLE_IOCTL(PPPIOCSMRRU) +COMPATIBLE_IOCTL(PPPIOCCONNECT) +COMPATIBLE_IOCTL(PPPIOCDISCONN) +COMPATIBLE_IOCTL(PPPIOCATTCHAN) /* CDROM stuff */ COMPATIBLE_IOCTL(CDROMPAUSE) COMPATIBLE_IOCTL(CDROMRESUME) @@ -2517,6 +2522,11 @@ COMPATIBLE_IOCTL(AUTOFS_IOC_FAIL) COMPATIBLE_IOCTL(AUTOFS_IOC_CATATONIC) COMPATIBLE_IOCTL(AUTOFS_IOC_PROTOVER) COMPATIBLE_IOCTL(AUTOFS_IOC_EXPIRE) +/* DEVFS */ +COMPATIBLE_IOCTL(DEVFSDIOC_GET_PROTO_REV) +COMPATIBLE_IOCTL(DEVFSDIOC_SET_EVENT_MASK) +COMPATIBLE_IOCTL(DEVFSDIOC_RELEASE_EVENT_QUEUE) +COMPATIBLE_IOCTL(DEVFSDIOC_SET_DEBUG_MASK) /* Raw devices */ COMPATIBLE_IOCTL(RAW_SETBIND) COMPATIBLE_IOCTL(RAW_GETBIND) diff --git a/arch/sparc64/kernel/sys_sparc32.c b/arch/sparc64/kernel/sys_sparc32.c index 1fc0b1ba5..d4ecb0f4f 100644 --- a/arch/sparc64/kernel/sys_sparc32.c +++ b/arch/sparc64/kernel/sys_sparc32.c @@ -1,4 +1,4 @@ -/* $Id: sys_sparc32.c,v 1.134 2000/03/07 22:27:30 davem Exp $ +/* $Id: sys_sparc32.c,v 1.136 2000/03/13 21:57:29 davem Exp $ * sys_sparc32.c: Conversion between 32bit and 64bit native syscalls. * * Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) @@ -3645,7 +3645,7 @@ struct nfsctl_arg32 { }; union nfsctl_res32 { - struct knfs_fh cr32_getfh; + __u8 cr32_getfh[NFS_FHSIZE]; u32 cr32_debug; }; @@ -4218,3 +4218,12 @@ out_sem: out: return ret; } + +extern asmlinkage long sys_mincore(unsigned long start, size_t len, unsigned char *vec); + +asmlinkage long sys32_mincore(unsigned long start, u32 __len, unsigned char *vec) +{ + size_t len = (size_t) __len; + + return sys_mincore(start, len, vec); +} diff --git a/arch/sparc64/kernel/sys_sunos32.c b/arch/sparc64/kernel/sys_sunos32.c index 9673cdd36..f7f5964e9 100644 --- a/arch/sparc64/kernel/sys_sunos32.c +++ b/arch/sparc64/kernel/sys_sunos32.c @@ -1,4 +1,4 @@ -/* $Id: sys_sunos32.c,v 1.40 2000/03/07 22:27:31 davem Exp $ +/* $Id: sys_sunos32.c,v 1.41 2000/03/13 21:57:31 davem Exp $ * sys_sunos32.c: SunOS binary compatability layer on sparc64. * * Copyright (C) 1995, 1996, 1997 David S. Miller (davem@caip.rutgers.edu) @@ -252,56 +252,6 @@ asmlinkage void sunos_madvise(u32 address, u32 len, u32 strategy) unlock_kernel(); } -/* Places into character array, the status of all the pages in the passed - * range from 'addr' to 'addr + len'. -1 on failure, 0 on success... - * The encoding in each character is: - * low-bit is zero == Page is not in physical ram right now - * low-bit is one == Page is currently residing in core - * All other bits are undefined within the character so there... - * Also, if you try to get stats on an area outside of the user vm area - * *or* the passed base address is not aligned on a page boundary you - * get an error. - */ -asmlinkage int sunos_mincore(u32 __addr, u32 len, u32 u_array) -{ - pgd_t *pgdp; - pmd_t *pmdp; - pte_t *ptep; - unsigned long limit, addr = (unsigned long)__addr; - int num_pages, pnum, retval = -EINVAL; - char *array = (char *)A(u_array); - - lock_kernel(); - if(addr & ~(4096)) - goto out; - num_pages = (len / 4096); - retval = -EFAULT; - if(verify_area(VERIFY_WRITE, array, num_pages)) - goto out; - retval = -ENOMEM; - if((addr >= 0xf0000000) || ((addr + len) > 0xf0000000)) - goto out; /* I'm sure you're curious about kernel mappings.. */ - /* Wheee, go through pte's */ - pnum = 0; - for(limit = addr + len; addr < limit; addr += 4096, pnum++) { - pgdp = pgd_offset(current->mm, addr); - if(pgd_none(*pgdp)) - goto out; /* As per SunOS manpage */ - pmdp = pmd_offset(pgdp, addr); - if(pmd_none(*pmdp)) - goto out; /* As per SunOS manpage */ - ptep = pte_offset(pmdp, addr); - if(pte_none(*ptep)) - goto out; /* As per SunOS manpage */ - /* Page in core or Swapped page? */ - __put_user((pte_present(*ptep) ? 1 : 0), &array[pnum]); - } - retval = 0; /* Success... I think... */ -out: - unlock_kernel(); - return retval; -} - /* This just wants the soft limit (ie. rlim_cur element) of the RLIMIT_NOFILE * resource limit and is for backwards compatibility with older sunos * revs. diff --git a/arch/sparc64/kernel/systbls.S b/arch/sparc64/kernel/systbls.S index 1f7ab3fef..0a0edbf82 100644 --- a/arch/sparc64/kernel/systbls.S +++ b/arch/sparc64/kernel/systbls.S @@ -1,4 +1,4 @@ -/* $Id: systbls.S,v 1.68 2000/02/16 07:31:38 davem Exp $ +/* $Id: systbls.S,v 1.69 2000/03/13 21:57:28 davem Exp $ * systbls.S: System call entry point tables for OS compatibility. * The native Linux system call table lives here also. * @@ -34,7 +34,7 @@ sys_call_table32: /*60*/ .word sys_umask, sys_chroot, sys32_newfstat, sys_fstat64, sys_getpagesize .word sys_msync, sys_vfork, sys32_pread, sys32_pwrite, sys_geteuid /*70*/ .word sys_getegid, sys32_mmap, sys_setreuid, sys_munmap, sys_mprotect - .word sys_nis_syscall, sys_vhangup, sys32_truncate64, sys_nis_syscall, sys32_getgroups16 + .word sys_nis_syscall, sys_vhangup, sys32_truncate64, sys32_mincore, sys32_getgroups16 /*80*/ .word sys32_setgroups16, sys_getpgrp, sys_setgroups, sys32_setitimer, sys32_ftruncate64 .word sys_swapon, sys32_getitimer, sys_setuid, sys_sethostname, sys_setgid /*90*/ .word sys_dup2, sys_setfsuid, sys32_fcntl, sys32_select, sys_setfsgid @@ -93,7 +93,7 @@ sys_call_table: /*60*/ .word sys_umask, sys_chroot, sys_newfstat, sys_nis_syscall, sys_getpagesize .word sys_msync, sys_vfork, sys_pread, sys_pwrite, sys_nis_syscall /*70*/ .word sys_nis_syscall, sys_mmap, sys_nis_syscall, sys64_munmap, sys_mprotect - .word sys_nis_syscall, sys_vhangup, sys_nis_syscall, sys_nis_syscall, sys_getgroups + .word sys_nis_syscall, sys_vhangup, sys_nis_syscall, sys_mincore, sys_getgroups /*80*/ .word sys_setgroups, sys_getpgrp, sys_nis_syscall, sys_setitimer, sys_nis_syscall .word sys_swapon, sys_getitimer, sys_nis_syscall, sys_sethostname, sys_nis_syscall /*90*/ .word sys_dup2, sys_nis_syscall, sys_fcntl, sys_select, sys_nis_syscall @@ -164,7 +164,7 @@ sunos_sys_table: .word sunos_nosys, sunos_sbrk, sunos_sstk .word sunos_mmap, sunos_vadvise, sys_munmap .word sys_mprotect, sunos_madvise, sys_vhangup - .word sunos_nosys, sunos_mincore, sys32_getgroups16 + .word sunos_nosys, sys32_mincore, sys32_getgroups16 .word sys32_setgroups16, sys_getpgrp, sunos_setpgrp .word sys32_setitimer, sunos_nosys, sys_swapon .word sys32_getitimer, sys_gethostname, sys_sethostname diff --git a/arch/sparc64/solaris/misc.c b/arch/sparc64/solaris/misc.c index 9e2bd4118..b77a27236 100644 --- a/arch/sparc64/solaris/misc.c +++ b/arch/sparc64/solaris/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.22 2000/02/16 07:31:41 davem Exp $ +/* $Id: misc.c,v 1.23 2000/03/13 21:57:34 davem Exp $ * misc.c: Miscelaneous syscall emulation for Solaris * * Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) @@ -721,11 +721,8 @@ asmlinkage void solaris_register(void) { lock_kernel(); current->personality = PER_SVR4; - if (current->exec_domain && current->exec_domain->module) - __MOD_DEC_USE_COUNT(current->exec_domain->module); + put_exec_domain(current->exec_domain); current->exec_domain = lookup_exec_domain(current->personality); - if (current->exec_domain && current->exec_domain->module) - __MOD_INC_USE_COUNT(current->exec_domain->module); unlock_kernel(); } diff --git a/arch/sparc64/solaris/systbl.S b/arch/sparc64/solaris/systbl.S index 17562bafd..ca78499b1 100644 --- a/arch/sparc64/solaris/systbl.S +++ b/arch/sparc64/solaris/systbl.S @@ -1,4 +1,4 @@ -/* $Id: systbl.S,v 1.10 2000/01/12 02:59:26 davem Exp $ +/* $Id: systbl.S,v 1.11 2000/03/13 21:57:35 davem Exp $ * systbl.S: System call entry point table for Solaris compatibility. * * Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) @@ -142,7 +142,7 @@ solaris_sys_table: .word solaris_unimplemented /* async 111 */ .word solaris_unimplemented /* priocntlsys 112 */ .word solaris_pathconf /* pathconf sd 113 */ - .word solaris_unimplemented /* mincore xdx 114 */ + .word CHAIN(mincore) /* mincore d 114 */ .word solaris_mmap /* mmap xxxxdx 115 */ .word CHAIN(mprotect) /* mprotect xdx 116 */ .word CHAIN(munmap) /* munmap xd 117 */ |