Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
Kirill Smelkov
linux
Commits
ab34ca8e
Commit
ab34ca8e
authored
22 years ago
by
Jaroslav Kysela
Browse files
Options
Download
Plain Diff
Merge
http://linux.bkbits.net/linux-2.5
into suse.cz:/home/perex/bk/linux-sound/linux-sound
parents
eb4458e9
71660e15
Changes
203
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
874 additions
and
252 deletions
+874
-252
Documentation/Changes
Documentation/Changes
+3
-3
Documentation/arm/XScale/ADIFCC/80200EVB
Documentation/arm/XScale/ADIFCC/80200EVB
+111
-0
Documentation/arm/XScale/IOP310/IQ80310
Documentation/arm/XScale/IOP310/IQ80310
+295
-0
Documentation/filesystems/proc.txt
Documentation/filesystems/proc.txt
+1
-1
Documentation/sysctl/vm.txt
Documentation/sysctl/vm.txt
+2
-2
MAINTAINERS
MAINTAINERS
+5
-0
arch/arm/Makefile
arch/arm/Makefile
+16
-4
arch/arm/boot/compressed/Makefile
arch/arm/boot/compressed/Makefile
+1
-1
arch/arm/boot/compressed/head.S
arch/arm/boot/compressed/head.S
+54
-4
arch/arm/boot/compressed/ll_char_wr.S
arch/arm/boot/compressed/ll_char_wr.S
+94
-122
arch/arm/config.in
arch/arm/config.in
+4
-0
arch/arm/kernel/arch.c
arch/arm/kernel/arch.c
+1
-0
arch/arm/kernel/bios32.c
arch/arm/kernel/bios32.c
+31
-1
arch/arm/kernel/ecard.c
arch/arm/kernel/ecard.c
+104
-12
arch/arm/kernel/entry-armv.S
arch/arm/kernel/entry-armv.S
+9
-6
arch/arm/kernel/process.c
arch/arm/kernel/process.c
+2
-2
arch/arm/kernel/ptrace.c
arch/arm/kernel/ptrace.c
+102
-37
arch/arm/kernel/setup.c
arch/arm/kernel/setup.c
+13
-14
arch/arm/kernel/signal.c
arch/arm/kernel/signal.c
+13
-23
arch/arm/kernel/time-acorn.c
arch/arm/kernel/time-acorn.c
+13
-20
No files found.
Documentation/Changes
View file @
ab34ca8e
...
...
@@ -95,7 +95,7 @@ your version of gcc 2.95.x, may necessitate using -fno-strict-aliasing).
Make
----
You will need Gnu make 3.7
7
or later to build the kernel.
You will need Gnu make 3.7
8
or later to build the kernel.
Binutils
--------
...
...
@@ -287,9 +287,9 @@ gcc 2.95.3
----------
o <ftp://ftp.gnu.org/gnu/gcc/gcc-2.95.3.tar.gz>
Make 3.7
7
Make 3.7
8
---------
o <ftp://ftp.gnu.org/gnu/make/make-3.7
7
.tar.gz>
o <ftp://ftp.gnu.org/gnu/make/make-3.7
8.1
.tar.gz>
Binutils
--------
...
...
This diff is collapsed.
Click to expand it.
Documentation/arm/XScale/ADIFCC/80200EVB
0 → 100644
View file @
ab34ca8e
Board Overview
-----------------------------
This is an beta release of the Xscale Linux port to the ADI 80200EVB
evaluation board.
The 80200EVB is an evaluation platform for ADI Engineering's high-performance
80200FCC chipset for the Intel 80200 XScale CPU. The 80200FCC is an open
source FPGA based system that contains a PCI unit and a high performance
memory controller.
In addition to the 80200FCC, the board also contains a 16C550 UART, and 4MB
of flash.
The board is still under development and currently only the UART is functional
as the PCI bits have not been programmed into the FPGA.
For more information on the board, see http://www.adiengineering.com
Port Status
-----------------------------
Supported:
- Onboard UART (Polled operation only)
- Cache/TLB locking on 80200 CPU
TODO:
- PCI when hardware supports it
Building the Kernel
-----------------------------
change Linux makefile
make adi_evb_config
make oldconfig
make dep
make zImage
Loading Linux
-----------------------------
Before you can use Linux on the ADI board, you need to grab the following:
ADI 80200EVB Monitor:
ftp://source.mvista.com/pub/xscale/ADI_EVB/monitor.srec
ADI JFFS2 Image:
ftp://source.mvista.com/pub/xscale/ADI_EVB/adi.jffs2
Once you've got the Cygnus prompt, type in the following command:
load
On another terminal window:
cat monitor.srec > /dev/ttyS0
(replace ttyS0 with the serial port you are using)
Once completed, just type 'go' at the cygmon prompt and you should see:
MontaVista IQ80310 Monitor Version 0.1
monitor>
Type 'b 115200' at the prompt and change your terminal speed to 115200
The first thing to do is to upload and burn the jffs2 filesystem image
onto the boards 4MB of flash:
monitor> u c1000000
Uploading file at 0xc1000000
Now send file with ymodem
Do as the monitor says and transfer the file adi.jffs2. Once complete,
the following will copy the jffs2 image to location 0x80000 in the flash.
monitor> f 8000 c1000000 200000
Erasing sector 0x00080000
Writing sector 0x00080000 with data at 0xC1000000
Erasing sector 0x000A0000
Writing sector 0x000A0000 with data at 0xC1020000
Erasing sector 0x000C0000
...
Now use the same command as above to upload your zImage to location c1000000.
When you've done that, type 'j c1000000' to run Linux. Login as
root and you're all set to go.
Misc Notes
-----------------------------
The current version of the HW does not have an onboard timer, so the 80200
PMU is not available for general use as it is being used for a timer source.
By default, the MTD driver reserves the first 512K for bootloaders and
the remaining 3.5MB for the filesystem. You can edit drivers/mtd/map/adi_evb.c
to change this as needed for your application.
Contributors
-----------------------------
Thanks to ADI Engineering for providing the hardware for development
Deepak Saxena <dsaxena@mvista.com> - Initial port
-----------------------------
Enjoy. If you have any problem please contact Deepak Saxena
dsaxena@mvista.com
This diff is collapsed.
Click to expand it.
Documentation/arm/XScale/IOP310/IQ80310
0 → 100644
View file @
ab34ca8e
Board Overview
-----------------------------
The Cyclone IQ80310 board is an evaluation platform for Intel's 80200 Xscale
CPU and 80312 Intelligent I/O chipset (collectively called IOP310 chipset).
The 80312 contains dual PCI hoses (called the ATUs), a PCI-to-PCI bridge,
three DMA channels (1 on secondary PCI, one on primary PCI ), I2C, I2O
messaging unit, XOR unit for RAID operations, a bus performance monitoring
unit, and a memory controller with ECC features.
For more information on the board, see http://developer.intel.com/iio
Port Status
-----------------------------
Supported:
- MTD/JFFS/JFFS2
- NFS root
- RAMDISK root
- 2ndary PCI slots
- Onboard ethernet
- Serial ports (ttyS0/S1)
- Cache/TLB locking on 80200 CPU
- Performance monitoring unit on 80200 CPU
- 80200 Performance Monitoring Unit
- Acting as a system controller on Cyclone 80303BP PCI backplane
- DMA engines (EXPERIMENTAL)
- 80312 Bus Performance Monitor (EXPERIMENTAL)
- Application Accelerator Unit (XOR engine for RAID) (EXPERIMENTAL)
- Messaging Unit (EXPERIMENTAL)
TODO:
- I2C
Building the Kernel
-----------------------------
make iq80310_config
make oldconfig
make dep
make zImage
This will build an image setup for BOOTP/NFS root support. To change this,
just run make menuconfig and disable nfs root or add a "root=" option.
Preparing the Hardware
-----------------------------
This document assumes you're using a Rev D or newer board running
Redboot as the bootloader.
The as-supplied RedBoot image appears to leave the first page of RAM
in a corrupt state such that certain words in that page are unwritable
and contain random data. The value of the data, and the location within
the first page changes with each boot, but is generally in the range
0xa0000150 to 0xa0000fff.
You can grab the source from the ECOS CVS or you can get a prebuilt image
from:
ftp://source.mvista.com/pub/xscale/iop310/IQ80310/redboot.bin
which is:
# strings redboot.bin | grep bootstrap
RedBoot(tm) bootstrap and debug environment, version UNKNOWN - built 14:58:21, Aug 15 2001
md5sum of this version:
bcb96edbc6f8e55b16c165930b6e4439 redboot.bin
You have two options to program it:
1. Using the FRU program (see the instructions in the user manual).
2. Using a Linux host, with MTD support built into the host kernel:
- ensure that the RedBoot image is not locked (issue the following
command under the existing RedBoot image):
RedBoot> fis unlock -f 0 -l 0x40000
- switch S3-1 and S3-2 on.
- reboot the host
- login as root
- identify the 80310 card:
# lspci
...
00:0c.1 Memory controller: Intel Corporation 80310 IOP [IO Processor] (rev 01)
- in this example, bus 0, slot 0c, function 1.
- insert the MTD modules, and the PCI map module:
# insmod drivers/mtd/maps/pci.o
- locate the MTD device (using the bus, slot, function)
# cat /proc/mtd
dev: size erasesize name
mtd0: 00800000 00020000 "00:0c.1"
- in this example, it is mtd device 0. Yours will be different.
Check carefully.
- program the flash
# cat redboot.bin > /dev/mtdblock0
- check the kernel message log for errors (some cat commands don't
error on failure)
# dmesg
- switch S3-1 and S3-2 off
- reboot host
In any case, make sure you do an 'fis init' command once you boot with the new
RedBoot image.
Downloading Linux
-----------------------------
Assuming you have your development system setup to act as a bootp/dhcp
server and running tftp:
RedBoot> load -r -b 0xa1008000 /tftpboot/zImage.xs
Raw file loaded 0xa1008000-0xa1094bd8
If you're not using dhcp/tftp, you can use y-modem instead:
RedBoot> load -r -b 0xa1008000 -m y
Note that on Rev D. of the board, tftp does not work due to intermittent
interrupt issues, so you need to download using ymodem.
Once the download is completed:
RedBoot> go 0xa1008000
Root Devices
-----------------------------
A kernel is not useful without a root filesystem, and you have several
choices with this board: NFS root, RAMDISK, or JFFS/JFFS2. For development
purposes, it is suggested that you use NFS root for easy access to various
tools. Once you're ready to deploy, probably want to utilize JFFS/JFFS2 on
the flash device.
MTD on the IQ80310
-----------------------------
Linux on the IQ80310 supports RedBoot FIS paritioning if it is enabled.
Out of the box, once you've done 'fis init' on RedBoot, you will get
the following partitioning scheme:
root@192.168.0.14:~# cat /proc/mtd
dev: size erasesize name
mtd0: 00040000 00020000 "RedBoot"
mtd1: 00040000 00020000 "RedBoot[backup]"
mtd2: 0075f000 00020000 "unallocated space"
mtd3: 00001000 00020000 "RedBoot config"
mtd4: 00020000 00020000 "FIS directory"
To create an FIS directory, you need to use the fis command in RedBoot.
As an example, you can burn the kernel into the flash once it's downloaded:
RedBoot> fis create -b 0xa1008000 -l 0x8CBAC -r 0xa1008000 -f 0x80000 kernel
... Erase from 0x00080000-0x00120000: .....
... Program from 0xa1008000-0xa1094bac at 0x00080000: .....
... Unlock from 0x007e0000-0x00800000: .
... Erase from 0x007e0000-0x00800000: .
... Program from 0xa1fdf000-0xa1fff000 at 0x007e0000: .
... Lock from 0x007e0000-0x00800000: .
RedBoot> fis list
Name FLASH addr Mem addr Length Entry point
RedBoot 0x00000000 0x00000000 0x00040000 0x00000000
RedBoot[backup] 0x00040000 0x00040000 0x00040000 0x00000000
RedBoot config 0x007DF000 0x007DF000 0x00001000 0x00000000
FIS directory 0x007E0000 0x007E0000 0x00020000 0x00000000
kernel 0x00080000 0xA1008000 0x000A0000 0x00000000
This leads to the following Linux MTD setup:
mtroot@192.168.0.14:~# cat /proc/mtd
dev: size erasesize name
mtd0: 00040000 00020000 "RedBoot"
mtd1: 00040000 00020000 "RedBoot[backup]"
mtd2: 000a0000 00020000 "kernel"
mtd3: 006bf000 00020000 "unallocated space"
mtd4: 00001000 00020000 "RedBoot config"
mtd5: 00020000 00020000 "FIS directory"
Note that there is not a 1:1 mapping to the number of RedBoot paritions to
MTD partitions as unused space also gets allocated into MTD partitions.
As an aside, the -r option when creating the Kernel entry allows you to
simply do an 'fis load kernel' to copy the image from flash into memory.
You can then do an 'fis go 0xa1008000' to start Linux.
If you choose to use static partitioning instead of the RedBoot partioning:
/dev/mtd0 0x00000000 - 0x0007ffff: Boot Monitor (512k)
/dev/mtd1 0x00080000 - 0x0011ffff: Kernel Image (640K)
/dev/mtd2 0x00120000 - 0x0071ffff: File System (6M)
/dev/mtd3 0x00720000 - 0x00800000: RedBoot Reserved (896K)
To use a JFFS1/2 root FS, you need to donwload the JFFS image using either
tftp or ymodem, and then copy it to flash:
RedBoot> load -r -b 0xa1000000 /tftpboot/jffs.img
Raw file loaded 0xa1000000-0xa1600000
RedBoot> fis create -b 0xa1000000 -l 0x600000 -f 0x120000 jffs
... Erase from 0x00120000-0x00720000: ..................................
... Program from 0xa1000000-0xa1600000 at 0x00120000: ..................
......................
... Unlock from 0x007e0000-0x00800000: .
... Erase from 0x007e0000-0x00800000: .
... Program from 0xa1fdf000-0xa1fff000 at 0x007e0000: .
... Lock from 0x007e0000-0x00800000: .
RedBoot> fis list
Name FLASH addr Mem addr Length Entry point
RedBoot 0x00000000 0x00000000 0x00040000 0x00000000
RedBoot[backup] 0x00040000 0x00040000 0x00040000 0x00000000
RedBoot config 0x007DF000 0x007DF000 0x00001000 0x00000000
FIS directory 0x007E0000 0x007E0000 0x00020000 0x00000000
kernel 0x00080000 0xA1008000 0x000A0000 0xA1008000
jffs 0x00120000 0x00120000 0x00600000 0x00000000
This looks like this in Linux:
root@192.168.0.14:~# cat /proc/mtd
dev: size erasesize name
mtd0: 00040000 00020000 "RedBoot"
mtd1: 00040000 00020000 "RedBoot[backup]"
mtd2: 000a0000 00020000 "kernel"
mtd3: 00600000 00020000 "jffs"
mtd4: 000bf000 00020000 "unallocated space"
mtd5: 00001000 00020000 "RedBoot config"
mtd6: 00020000 00020000 "FIS directory"
You need to boot the kernel once and watch the boot messages to see how the
JFFS RedBoot partition mapped into the MTD partition scheme.
You can grab a pre-built JFFS image to use as a root file system at:
ftp://source.mvista.com/pub/xscale/iop310/IQ80310/jffs.img
For detailed info on using MTD and creating a JFFS image go to:
http://www.linux-mtd.infradead.org.
For details on using RedBoot's FIS commands, type 'fis help' or consult
your RedBoot manual.
Contributors
-----------------------------
Thanks to Intel Corporation for providing the hardware.
John Clark <jclark@teamasa.com> - Initial discovery of RedBoot issues
Dave Jiang <dave.jiang@intel.com> - IRQ demux fixes, AAU, DMA, MU
Nicolas Pitre <nico@cam.org> - Initial port, cleanup, debugging
Matt Porter <mporter@mvista.com> - PCI subsystem development, debugging
Tim Sanders <tsanders@sanders.org> - Initial PCI code
Mark Salter <msalter@redhat.com> - RedBoot fixes
Deepak Saxena <dsaxena@mvista.com> - Cleanup, debug, cache lock, PMU
-----------------------------
Enjoy.
If you have any problems please contact Deepak Saxena <dsaxena@mvista.com>
A few notes from rmk
-----------------------------
These are notes of my initial experience getting the IQ80310 Rev D up and
running. In total, it has taken many hours to work out what's going on...
The version of redboot used is:
RedBoot(tm) bootstrap and debug environment, version UNKNOWN - built 14:58:21, Aug 15 2001
1. I've had a corrupted download of the redboot.bin file from Montavista's
FTP site. It would be a good idea if there were md5sums, sum or gpg
signatures available to ensure the integrity of the downloaded files.
The result of this was an apparantly 100% dead card.
2. RedBoot Intel EtherExpress Pro 100 driver seems to be very unstable -
I've had it take out the whole of a 100mbit network for several minutes.
The Hub indiates ZERO activity, despite machines attempting to communicate.
Further to this, while tftping the kernel, the transfer will stall regularly,
and might even drop the link LED.
3. There appears to be a bug in the Intel Documentation Pack that comes with
the IQ80310 board. Serial port 1, which is the socket next to the LEDs
is address 0xfe810000, not 0xfe800000.
Note that RedBoot uses either serial port 1 OR serial port 2, so if you
have your console connected to the wrong port, you'll see redboot messages
but not kernel boot messages.
4. Trying to use fconfig to setup a boot script fails - it hangs when trying
to erase the flash.
This diff is collapsed.
Click to expand it.
Documentation/filesystems/proc.txt
View file @
ab34ca8e
...
...
@@ -966,7 +966,7 @@ dirty_background_ratio
Contains, as a percentage of total system memory, the number of pages at which
the pdflush background writeback daemon will start writing out dirty data.
dirty_
async_
ratio
dirty_ratio
-----------------
Contains, as a percentage of total system memory, the number of pages at which
...
...
This diff is collapsed.
Click to expand it.
Documentation/sysctl/vm.txt
View file @
ab34ca8e
...
...
@@ -18,14 +18,14 @@ files can be found in mm/swap.c.
Currently, these files are in /proc/sys/vm:
- overcommit_memory
- page-cluster
- dirty_
async_
ratio
- dirty_ratio
- dirty_background_ratio
- dirty_expire_centisecs
- dirty_writeback_centisecs
==============================================================
dirty_
async_
ratio, dirty_background_ratio, dirty_expire_centisecs,
dirty_ratio, dirty_background_ratio, dirty_expire_centisecs,
dirty_writeback_centisecs:
See Documentation/filesystems/proc.txt
...
...
This diff is collapsed.
Click to expand it.
MAINTAINERS
View file @
ab34ca8e
...
...
@@ -1592,6 +1592,11 @@ P: Julien Blache
M: jb@technologeek.org
S: Maintained
TI PARALLEL LINK CABLE DRIVER
P: Romain Lievin
M: roms@lpg.ticalc.org
S: Maintained
TIEMAN VOYAGER USB BRAILLE DISPLAY DRIVER
P: Stephane Dalton
M: sdalton@videotron.ca
...
...
This diff is collapsed.
Click to expand it.
arch/arm/Makefile
View file @
ab34ca8e
...
...
@@ -8,6 +8,7 @@
# Copyright (C) 1995-2001 by Russell King
LDFLAGS_vmlinux
:=
-p
-X
AFLAGS_vmlinux.lds.o
=
-DTEXTADDR
=
$(TEXTADDR)
-DDATAADDR
=
$(DATAADDR)
OBJCOPYFLAGS
:=
-O
binary
-R
.note
-R
.comment
-S
GZFLAGS
:=
-9
#CFLAGS +=-pipe
...
...
@@ -50,18 +51,29 @@ tune-$(CONFIG_CPU_SA110) :=-mtune=strongarm110
tune-$(CONFIG_CPU_SA1100)
:=
-mtune
=
strongarm1100
tune-$(CONFIG_CPU_XSCALE)
:=
-mtune
=
strongarm
#-mtune=xscale
CFLAGS_BOOT
:=
$
(
apcs-y
)
$
(
arch-y
)
$
(
tune-y
)
-mshort-load-bytes
-msoft-float
CFLAGS
+=
$
(
apcs-y
)
$
(
arch-y
)
$
(
tune-y
)
-mshort-load-bytes
-msoft-float
AFLAGS
+=
$
(
apcs-y
)
$
(
arch-y
)
-mno-fpu
-msoft-float
# Force -mno-fpu to be passed to the assembler. Some versions of gcc don't
# do this with -msoft-float
CFLAGS_BOOT
:=
$
(
apcs-y
)
$
(
arch-y
)
$
(
tune-y
)
-mshort-load-bytes
-msoft-float
-Wa
,-mno-fpu
CFLAGS
+=
$
(
apcs-y
)
$
(
arch-y
)
$
(
tune-y
)
-mshort-load-bytes
-msoft-float
-Wa
,-mno-fpu
AFLAGS
+=
$
(
apcs-y
)
$
(
arch-y
)
-mno-fpu
-msoft-float
-Wa
,-mno-fpu
ifeq
($(CONFIG_CPU_26),y)
PROCESSOR
:=
armo
HEAD
:=
arch
/arm/mach-arc/head.o
arch
/arm/kernel/init_task.o
ifeq
($(CONFIG_ROM_KERNEL),y)
DATAADDR
=
0x02080000
TEXTADDR
=
0x03800000
LDSCRIPT
=
arch
/arm/vmlinux-armo-rom.lds.in
else
TEXTADDR
=
0x02080000
LDSCRIPT
=
arch
/arm/vmlinux-armo.lds.in
endif
endif
ifeq
($(CONFIG_CPU_32),y)
PROCESSOR
=
armv
HEAD
:=
arch
/arm/kernel/head.o
arch
/arm/kernel/init_task.o
TEXTADDR
=
0xC0008000
endif
ifeq
($(CONFIG_ARCH_ARCA5K),y)
...
...
@@ -175,7 +187,7 @@ core-$(CONFIG_FPE_NWFPE) += arch/arm/nwfpe/
core-$(CONFIG_FPE_FASTFPE)
+=
$(FASTFPE_OBJ)
drivers-$(CONFIG_ARCH_CLPS7500)
+=
drivers/acorn/char/
drivers-$(CONFIG_ARCH_L7200)
)
+=
drivers/acorn/char/
drivers-$(CONFIG_ARCH_L7200)
+=
drivers/acorn/char/
libs-y
+=
arch
/arm/lib/
...
...
This diff is collapsed.
Click to expand it.
arch/arm/boot/compressed/Makefile
View file @
ab34ca8e
...
...
@@ -18,7 +18,7 @@ ZLDFLAGS = -p -X -T vmlinux.lds
#
ifeq
($(CONFIG_ARCH_ACORN),y)
OBJS
+=
ll_char_wr.o font.o
ZLD
FLAGS
+=
-
defsym
params
=
$(PARAMS_PHYS)
C
FLAGS
+=
-
DPARAMS_PHYS
=
$(PARAMS_PHYS)
endif
ifeq
($(CONFIG_ARCH_NETWINDER),y)
...
...
This diff is collapsed.
Click to expand it.
arch/arm/boot/compressed/head.S
View file @
ab34ca8e
...
...
@@ -55,6 +55,18 @@
.
macro
writeb
,
rb
strb
\
rb
,
[
r3
,
#
0
]
.
endm
#elif defined(CONFIG_ARCH_SA1100)
.
macro
loadsp
,
rb
mov
\
rb
,
#
0x80000000
@
physical
base
address
# if defined(CONFIG_DEBUG_LL_SER3)
add
\
rb
,
\
rb
,
#
0x00050000
@
Ser3
# else
add
\
rb
,
\
rb
,
#
0x00010000
@
Ser1
# endif
.
endm
.
macro
writeb
,
rb
str
\
rb
,
[
r3
,
#
0x14
]
@
UTDR
.
endm
#else
#error no serial architecture defined
#endif
...
...
@@ -151,22 +163,55 @@ not_angel:
ldmia
r0
,
{
r1
,
r2
,
r3
,
r4
,
r5
,
r6
,
ip
,
sp
}
subs
r0
,
r0
,
r1
@
calculate
the
delta
offset
teq
r0
,
#
0
@
if
delta
is
zero
,
we
're
@
if
delta
is
zero
,
we
're
beq
not_relocated
@
running
at
the
address
we
@
were
linked
at
.
add
r2
,
r2
,
r0
@
different
address
,
so
we
add
r3
,
r3
,
r0
@
need
to
fix
up
various
add
r5
,
r5
,
r0
@
pointers
.
/
*
*
We
're running at a different address. We need to fix
*
up
various
pointers
:
*
r5
-
zImage
base
address
*
r6
-
GOT
start
*
ip
-
GOT
end
*/
add
r5
,
r5
,
r0
add
r6
,
r6
,
r0
add
ip
,
ip
,
r0
#ifndef CONFIG_ZBOOT_ROM
/
*
*
If
we
're running fully PIC === CONFIG_ZBOOT_ROM = n,
*
we
need
to
fix
up
pointers
into
the
BSS
region
.
*
r2
-
BSS
start
*
r3
-
BSS
end
*
sp
-
stack
pointer
*/
add
r2
,
r2
,
r0
add
r3
,
r3
,
r0
add
sp
,
sp
,
r0
/
*
*
Relocate
all
entries
in
the
GOT
table
.
*/
1
:
ldr
r1
,
[
r6
,
#
0
]
@
relocate
entries
in
the
GOT
add
r1
,
r1
,
r0
@
table
.
This
fixes
up
the
str
r1
,
[
r6
],
#
4
@
C
references
.
cmp
r6
,
ip
blo
1
b
#else
/
*
*
Relocate
entries
in
the
GOT
table
.
We
only
relocate
*
the
entries
that
are
outside
the
(
relocated
)
BSS
region
.
*/
1
:
ldr
r1
,
[
r6
,
#
0
]
@
relocate
entries
in
the
GOT
cmp
r1
,
r2
@
entry
<
bss_start
||
cmphs
r3
,
r1
@
_end
<
entry
addlo
r1
,
r1
,
r0
@
table
.
This
fixes
up
the
str
r1
,
[
r6
],
#
4
@
C
references
.
cmp
r6
,
ip
blo
1
b
#endif
not_relocated
:
mov
r0
,
#
0
1
:
str
r0
,
[
r2
],
#
4
@
clear
bss
...
...
@@ -176,6 +221,11 @@ not_relocated: mov r0, #0
cmp
r2
,
r3
blo
1
b
/
*
*
The
C
runtime
environment
should
now
be
setup
*
sufficiently
.
Turn
the
cache
on
,
set
up
some
*
pointers
,
and
start
decompressing
.
*/
bl
cache_on
mov
r1
,
sp
@
malloc
space
above
stack
...
...
This diff is collapsed.
Click to expand it.
arch/arm/boot/compressed/ll_char_wr.S
View file @
ab34ca8e
...
...
@@ -19,144 +19,116 @@
#include <linux/linkage.h>
#include <asm/assembler.h>
.
text
.
text
#define BOLD 0x01
#define ITALIC 0x02
#define UNDERLINE 0x04
#define FLASH 0x08
#define INVERSE 0x10
LC0
:
.
word
bytes_per_char_h
.
word
video_size_row
.
word
acorndata_8x8
.
word
con_charconvtable
LC0
:
.
word
LC0
.
word
bytes_per_char_h
.
word
video_size_row
.
word
acorndata_8x8
.
word
con_charconvtable
/*
*
r0
=
ptr
*
r1
=
char
*
r2
=
white
*/
ENTRY
(
ll_write_char
)
stmfd
sp
!,
{
r4
-
r7
,
lr
}
stmfd
sp
!,
{
r4
-
r7
,
lr
}
@
@
Smashable
regs
:
{
r0
-
r3
},
[
r4
-
r7
],
(
r8
-
fp
),
[
ip
],
(
sp
),
[
lr
],
(
pc
)
@
eor
ip
,
r1
,
#
UNDERLINE
<<
9
/*
*
calculate
colours
*/
tst
r1
,
#
INVERSE
<<
9
moveq
r2
,
r1
,
lsr
#
16
moveq
r3
,
r1
,
lsr
#
24
movne
r2
,
r1
,
lsr
#
24
movne
r3
,
r1
,
lsr
#
16
and
r3
,
r3
,
#
255
and
r2
,
r2
,
#
255
/*
*
calculate
offset
into
character
table
*/
mov
r1
,
r1
,
lsl
#
23
mov
r1
,
r1
,
lsr
#
20
/*
*
calculate
offset
required
for
each
row
[
maybe
I
should
make
this
an
argument
to
this
fn
.
*
Have
to
see
what
the
register
usage
is
like
in
the
calling
routines
.
*/
adr
r4
,
LC0
ldmia
r4
,
{
r4
,
r5
,
r6
,
lr
}
ldr
r4
,
[
r4
]
ldr
r5
,
[
r5
]
/*
*
Go
to
resolution
-
dependent
routine
...
*/
cmp
r4
,
#
4
blt
Lrow1bpp
eor
r2
,
r3
,
r2
@
Create
eor
mask
to
change
colour
from
bg
orr
r3
,
r3
,
r3
,
lsl
#
8
@
to
fg
.
orr
r3
,
r3
,
r3
,
lsl
#
16
add
r0
,
r0
,
r5
,
lsl
#
3
@
Move
to
bottom
of
character
add
r1
,
r1
,
#
7
ldrb
r7
,
[
r6
,
r1
]
tst
ip
,
#
UNDERLINE
<<
9
eoreq
r7
,
r7
,
#
255
teq
r4
,
#
8
beq
Lrow8bpplp
/
*
*
calculate
offset
into
character
table
*/
mov
r1
,
r1
,
lsl
#
3
/
*
*
calculate
offset
required
for
each
row
.
*/
adr
ip
,
LC0
ldmia
ip
,
{
r3
,
r4
,
r5
,
r6
,
lr
}
sub
ip
,
ip
,
r3
add
r6
,
r6
,
ip
add
lr
,
lr
,
ip
ldr
r4
,
[
r4
,
ip
]
ldr
r5
,
[
r5
,
ip
]
/
*
*
Go
to
resolution
-
dependent
routine
...
*/
cmp
r4
,
#
4
blt
Lrow1bpp
add
r0
,
r0
,
r5
,
lsl
#
3
@
Move
to
bottom
of
character
orr
r1
,
r1
,
#
7
ldrb
r7
,
[
r6
,
r1
]
teq
r4
,
#
8
beq
Lrow8bpplp
@
@
Smashable
regs
:
{
r0
-
r3
},
[
r4
],
{
r5
-
r7
},
(
r8
-
fp
),
[
ip
],
(
sp
),
{
lr
},
(
pc
)
@
orr
r3
,
r3
,
r3
,
lsl
#
4
Lrow4bpplp
:
ldr
r7
,
[
lr
,
r7
,
lsl
#
2
]
mul
r7
,
r2
,
r7
tst
r1
,
#
7
@
avoid
using
r7
directly
after
eor
ip
,
r3
,
r7
str
ip
,
[
r0
,
-
r5
]!
LOADREGS
(
eqfd
,
sp
!,
{
r4
-
r7
,
pc
})
sub
r1
,
r1
,
#
1
ldrb
r7
,
[
r6
,
r1
]
ldr
r7
,
[
lr
,
r7
,
lsl
#
2
]
mul
r7
,
r2
,
r7
tst
r1
,
#
7
@
avoid
using
r7
directly
after
eor
ip
,
r3
,
r7
str
ip
,
[
r0
,
-
r5
]!
subne
r1
,
r1
,
#
1
ldrneb
r7
,
[
r6
,
r1
]
bne
Lrow4bpplp
LOADREGS
(
fd
,
sp
!,
{
r4
-
r7
,
pc
})
Lrow4bpplp
:
ldr
r7
,
[
lr
,
r7
,
lsl
#
2
]
mul
r7
,
r2
,
r7
sub
r1
,
r1
,
#
1
@
avoid
using
r7
directly
after
str
r7
,
[
r0
,
-
r5
]!
ldrb
r7
,
[
r6
,
r1
]
ldr
r7
,
[
lr
,
r7
,
lsl
#
2
]
mul
r7
,
r2
,
r7
tst
r1
,
#
7
@
avoid
using
r7
directly
after
str
r7
,
[
r0
,
-
r5
]!
subne
r1
,
r1
,
#
1
ldrneb
r7
,
[
r6
,
r1
]
bne
Lrow4bpplp
LOADREGS
(
fd
,
sp
!,
{
r4
-
r7
,
pc
})
@
@
Smashable
regs
:
{
r0
-
r3
},
[
r4
],
{
r5
-
r7
},
(
r8
-
fp
),
[
ip
],
(
sp
),
{
lr
},
(
pc
)
@
Lrow8bpplp
:
mov
ip
,
r7
,
lsr
#
4
ldr
ip
,
[
lr
,
ip
,
lsl
#
2
]
mul
r4
,
r2
,
ip
and
ip
,
r7
,
#
15
@
avoid
r4
ldr
ip
,
[
lr
,
ip
,
lsl
#
2
]
@
avoid
r4
mul
ip
,
r2
,
ip
@
avoid
r4
eor
r4
,
r3
,
r4
@
avoid
ip
tst
r1
,
#
7
@
avoid
ip
sub
r0
,
r0
,
r5
@
avoid
ip
eor
ip
,
r3
,
ip
stmia
r0
,
{
r4
,
ip
}
LOADREGS
(
eqfd
,
sp
!,
{
r4
-
r7
,
pc
})
sub
r1
,
r1
,
#
1
ldrb
r7
,
[
r6
,
r1
]
mov
ip
,
r7
,
lsr
#
4
ldr
ip
,
[
lr
,
ip
,
lsl
#
2
]
mul
r4
,
r2
,
ip
and
ip
,
r7
,
#
15
@
avoid
r4
ldr
ip
,
[
lr
,
ip
,
lsl
#
2
]
@
avoid
r4
mul
ip
,
r2
,
ip
@
avoid
r4
eor
r4
,
r3
,
r4
@
avoid
ip
tst
r1
,
#
7
@
avoid
ip
sub
r0
,
r0
,
r5
@
avoid
ip
eor
ip
,
r3
,
ip
stmia
r0
,
{
r4
,
ip
}
subne
r1
,
r1
,
#
1
ldrneb
r7
,
[
r6
,
r1
]
bne
Lrow8bpplp
LOADREGS
(
fd
,
sp
!,
{
r4
-
r7
,
pc
})
Lrow8bpplp
:
mov
ip
,
r7
,
lsr
#
4
ldr
ip
,
[
lr
,
ip
,
lsl
#
2
]
mul
r4
,
r2
,
ip
and
ip
,
r7
,
#
15
@
avoid
r4
ldr
ip
,
[
lr
,
ip
,
lsl
#
2
]
@
avoid
r4
mul
ip
,
r2
,
ip
@
avoid
r4
sub
r1
,
r1
,
#
1
@
avoid
ip
sub
r0
,
r0
,
r5
@
avoid
ip
stmia
r0
,
{
r4
,
ip
}
ldrb
r7
,
[
r6
,
r1
]
mov
ip
,
r7
,
lsr
#
4
ldr
ip
,
[
lr
,
ip
,
lsl
#
2
]
mul
r4
,
r2
,
ip
and
ip
,
r7
,
#
15
@
avoid
r4
ldr
ip
,
[
lr
,
ip
,
lsl
#
2
]
@
avoid
r4
mul
ip
,
r2
,
ip
@
avoid
r4
tst
r1
,
#
7
@
avoid
ip
sub
r0
,
r0
,
r5
@
avoid
ip
stmia
r0
,
{
r4
,
ip
}
subne
r1
,
r1
,
#
1
ldrneb
r7
,
[
r6
,
r1
]
bne
Lrow8bpplp
LOADREGS
(
fd
,
sp
!,
{
r4
-
r7
,
pc
})
@
@
Smashable
regs
:
{
r0
-
r3
},
[
r4
],
{
r5
,
r6
},
[
r7
],
(
r8
-
fp
),
[
ip
],
(
sp
),
[
lr
],
(
pc
)
@
Lrow1bpp
:
add
r6
,
r6
,
r1
ldmia
r6
,
{
r4
,
r7
}
tst
ip
,
#
INVERSE
<<
9
mvnne
r4
,
r4
mvnne
r7
,
r7
strb
r4
,
[
r0
],
r5
mov
r4
,
r4
,
lsr
#
8
strb
r4
,
[
r0
],
r5
mov
r4
,
r4
,
lsr
#
8
strb
r4
,
[
r0
],
r5
mov
r4
,
r4
,
lsr
#
8
strb
r4
,
[
r0
],
r5
strb
r7
,
[
r0
],
r5
mov
r7
,
r7
,
lsr
#
8
strb
r7
,
[
r0
],
r5
mov
r7
,
r7
,
lsr
#
8
strb
r7
,
[
r0
],
r5
mov
r7
,
r7
,
lsr
#
8
tst
ip
,
#
UNDERLINE
<<
9
mvneq
r7
,
r7
strb
r7
,
[
r0
],
r5
LOADREGS
(
fd
,
sp
!,
{
r4
-
r7
,
pc
})
Lrow1bpp
:
add
r6
,
r6
,
r1
ldmia
r6
,
{
r4
,
r7
}
strb
r4
,
[
r0
],
r5
mov
r4
,
r4
,
lsr
#
8
strb
r4
,
[
r0
],
r5
mov
r4
,
r4
,
lsr
#
8
strb
r4
,
[
r0
],
r5
mov
r4
,
r4
,
lsr
#
8
strb
r4
,
[
r0
],
r5
strb
r7
,
[
r0
],
r5
mov
r7
,
r7
,
lsr
#
8
strb
r7
,
[
r0
],
r5
mov
r7
,
r7
,
lsr
#
8
strb
r7
,
[
r0
],
r5
mov
r7
,
r7
,
lsr
#
8
strb
r7
,
[
r0
],
r5
LOADREGS
(
fd
,
sp
!,
{
r4
-
r7
,
pc
})
.
bss
.
bss
ENTRY
(
con_charconvtable
)
.
space
1024
.
space
1024
This diff is collapsed.
Click to expand it.
arch/arm/config.in
View file @
ab34ca8e
...
...
@@ -94,6 +94,8 @@ if [ "$CONFIG_ASSABET_NEPONSET" = "y" -o \
"$CONFIG_SA1100_XP860" = "y" ]; then
define_bool CONFIG_SA1111 y
define_int CONFIG_FORCE_MAX_ZONEORDER 9
else
define_bool CONFIG_SA1111 n
fi
comment 'Processor Type'
...
...
@@ -231,6 +233,8 @@ if [ "$CONFIG_CPU_ARM720T" = "y" -o "$CONFIG_CPU_ARM920T" = "y" -o \
"$CONFIG_CPU_ARM922T" = "y" -o "$CONFIG_CPU_ARM926T" = "y" -o \
"$CONFIG_CPU_ARM1020" = "y" -o "$CONFIG_CPU_XSCALE" = "y" ]; then
dep_bool 'Support Thumb instructions (EXPERIMENTAL)' CONFIG_ARM_THUMB $CONFIG_EXPERIMENTAL
else
define_bool CONFIG_ARM_THUMB n
fi
if [ "$CONFIG_CPU_ARM920T" = "y" -o "$CONFIG_CPU_ARM922T" = "y" -o \
"$CONFIG_CPU_ARM926T" = "y" -o "$CONFIG_CPU_ARM1020" = "y" ]; then
...
...
This diff is collapsed.
Click to expand it.
arch/arm/kernel/arch.c
View file @
ab34ca8e
...
...
@@ -8,6 +8,7 @@
#include <linux/types.h>
#include <asm/elf.h>
#include <asm/page.h>
#include <asm/setup.h>
#include <asm/mach-types.h>
#include <asm/mach/arch.h>
...
...
This diff is collapsed.
Click to expand it.
arch/arm/kernel/bios32.c
View file @
ab34ca8e
...
...
@@ -599,7 +599,7 @@ void pcibios_align_resource(void *data, struct resource *res,
* pcibios_enable_device - Enable I/O and memory.
* @dev: PCI device to be enabled
*/
int
pcibios_enable_device
(
struct
pci_dev
*
dev
)
int
pcibios_enable_device
(
struct
pci_dev
*
dev
,
int
mask
)
{
u16
cmd
,
old_cmd
;
int
idx
;
...
...
@@ -608,6 +608,10 @@ int pcibios_enable_device(struct pci_dev *dev)
pci_read_config_word
(
dev
,
PCI_COMMAND
,
&
cmd
);
old_cmd
=
cmd
;
for
(
idx
=
0
;
idx
<
6
;
idx
++
)
{
/* Only set up the requested stuff */
if
(
!
(
mask
&
(
1
<<
idx
)))
continue
;
r
=
dev
->
resource
+
idx
;
if
(
!
r
->
start
&&
r
->
end
)
{
printk
(
KERN_ERR
"PCI: Device %s not available because"
...
...
@@ -626,3 +630,29 @@ int pcibios_enable_device(struct pci_dev *dev)
}
return
0
;
}
int
pci_mmap_page_range
(
struct
pci_dev
*
dev
,
struct
vm_area_struct
*
vma
,
enum
pci_mmap_state
mmap_state
,
int
write_combine
)
{
struct
pci_sys_data
*
root
=
dev
->
sysdata
;
unsigned
long
prot
,
phys
;
if
(
mmap_state
==
pci_mmap_io
)
{
return
-
EINVAL
;
}
else
{
phys
=
root
->
mem_offset
+
(
vma
->
vm_pgoff
<<
PAGE_SHIFT
);
}
/*
* Mark this as IO
*/
vma
->
vm_flags
|=
VM_SHM
|
VM_LOCKED
|
VM_IO
;
vma
->
vm_page_prot
=
pgprot_noncached
(
vma
->
vm_page_prot
);
if
(
remap_page_range
(
vma
,
vma
->
vm_start
,
phys
,
vma
->
vm_end
-
vma
->
vm_start
,
vma
->
vm_page_prot
))
return
-
EAGAIN
;
return
0
;
}
This diff is collapsed.
Click to expand it.
arch/arm/kernel/ecard.c
View file @
ab34ca8e
...
...
@@ -38,6 +38,7 @@
#include <linux/slab.h>
#include <linux/proc_fs.h>
#include <linux/notifier.h>
#include <linux/device.h>
#include <linux/init.h>
#include <asm/dma.h>
...
...
@@ -48,6 +49,7 @@
#include <asm/pgalloc.h>
#include <asm/mmu_context.h>
#include <asm/mach/irq.h>
#include <asm/tlbflush.h>
#ifndef CONFIG_ARCH_RPC
#define HAVE_EXPMASK
...
...
@@ -92,6 +94,8 @@ ecard_loader_reset(volatile unsigned char *pa, loader_t loader);
asmlinkage
extern
int
ecard_loader_read
(
int
off
,
volatile
unsigned
char
*
pa
,
loader_t
loader
);
static
const
struct
ecard_id
*
ecard_match_device
(
const
struct
ecard_id
*
ids
,
struct
expansion_card
*
ec
);
static
inline
unsigned
short
ecard_getu16
(
unsigned
char
*
v
)
...
...
@@ -969,6 +973,14 @@ ecard_probe(int slot, card_type_t type)
*
ecp
=
ec
;
slot_to_expcard
[
slot
]
=
ec
;
snprintf
(
ec
->
dev
.
bus_id
,
sizeof
(
ec
->
dev
.
bus_id
),
"ecard%d"
,
slot
);
strcpy
(
ec
->
dev
.
name
,
"fixme!"
);
ec
->
dev
.
parent
=
NULL
;
ec
->
dev
.
bus
=
&
ecard_bus_type
;
device_register
(
&
ec
->
dev
);
return
0
;
nodev:
...
...
@@ -995,22 +1007,17 @@ ecard_t *ecard_find(int cid, const card_ids *cids)
if
(
finding_pos
->
claimed
)
continue
;
if
(
finding_pos
->
dev
.
driver
)
continue
;
if
(
!
cids
)
{
if
((
finding_pos
->
cid
.
id
^
cid
)
==
0
)
break
;
}
else
{
unsigned
int
manufacturer
,
product
;
int
i
;
manufacturer
=
finding_pos
->
cid
.
manufacturer
;
product
=
finding_pos
->
cid
.
product
;
for
(
i
=
0
;
cids
[
i
].
manufacturer
!=
65535
;
i
++
)
if
(
manufacturer
==
cids
[
i
].
manufacturer
&&
product
==
cids
[
i
].
product
)
break
;
const
struct
ecard_id
*
id
;
if
(
cids
[
i
].
manufacturer
!=
65535
)
id
=
ecard_match_device
(
cids
,
finding_pos
);
if
(
id
)
break
;
}
}
...
...
@@ -1023,7 +1030,7 @@ ecard_t *ecard_find(int cid, const card_ids *cids)
* Locate all hardware - interrupt management and
* actual cards.
*/
void
__init
ecard_init
(
void
)
static
int
__init
ecard_init
(
void
)
{
int
slot
,
irqhw
;
...
...
@@ -1053,11 +1060,96 @@ void __init ecard_init(void)
irqhw
?
ecard_irqexp_handler
:
ecard_irq_handler
);
ecard_proc_init
();
return
0
;
}
subsys_initcall
(
ecard_init
);
/*
* ECARD "bus"
*/
static
const
struct
ecard_id
*
ecard_match_device
(
const
struct
ecard_id
*
ids
,
struct
expansion_card
*
ec
)
{
int
i
;
for
(
i
=
0
;
ids
[
i
].
manufacturer
!=
65535
;
i
++
)
if
(
ec
->
cid
.
manufacturer
==
ids
[
i
].
manufacturer
&&
ec
->
cid
.
product
==
ids
[
i
].
product
)
return
ids
+
i
;
return
NULL
;
}
static
int
ecard_drv_probe
(
struct
device
*
dev
)
{
struct
expansion_card
*
ec
=
ECARD_DEV
(
dev
);
struct
ecard_driver
*
drv
=
ECARD_DRV
(
dev
->
driver
);
const
struct
ecard_id
*
id
;
id
=
ecard_match_device
(
drv
->
id_table
,
ec
);
return
drv
->
probe
(
ec
,
id
);
}
static
int
ecard_drv_remove
(
struct
device
*
dev
)
{
struct
expansion_card
*
ec
=
ECARD_DEV
(
dev
);
struct
ecard_driver
*
drv
=
ECARD_DRV
(
dev
->
driver
);
drv
->
remove
(
ec
);
return
0
;
}
int
ecard_register_driver
(
struct
ecard_driver
*
drv
)
{
drv
->
drv
.
bus
=
&
ecard_bus_type
;
drv
->
drv
.
probe
=
ecard_drv_probe
;
drv
->
drv
.
remove
=
ecard_drv_remove
;
return
driver_register
(
&
drv
->
drv
);
}
void
ecard_remove_driver
(
struct
ecard_driver
*
drv
)
{
remove_driver
(
&
drv
->
drv
);
}
static
int
ecard_match
(
struct
device
*
_dev
,
struct
device_driver
*
_drv
)
{
struct
expansion_card
*
ec
=
ECARD_DEV
(
_dev
);
struct
ecard_driver
*
drv
=
ECARD_DRV
(
_drv
);
int
ret
;
if
(
drv
->
id_table
)
{
ret
=
ecard_match_device
(
drv
->
id_table
,
ec
)
!=
NULL
;
}
else
{
ret
=
ec
->
cid
.
id
==
drv
->
id
;
}
return
ret
;
}
struct
bus_type
ecard_bus_type
=
{
.
name
=
"ecard"
,
.
match
=
ecard_match
,
};
static
int
ecard_bus_init
(
void
)
{
return
bus_register
(
&
ecard_bus_type
);
}
postcore_initcall
(
ecard_bus_init
);
EXPORT_SYMBOL
(
ecard_startfind
);
EXPORT_SYMBOL
(
ecard_find
);
EXPORT_SYMBOL
(
ecard_readchunk
);
EXPORT_SYMBOL
(
ecard_address
);
EXPORT_SYMBOL
(
ecard_register_driver
);
EXPORT_SYMBOL
(
ecard_remove_driver
);
EXPORT_SYMBOL
(
ecard_bus_type
);
This diff is collapsed.
Click to expand it.
arch/arm/kernel/entry-armv.S
View file @
ab34ca8e
...
...
@@ -189,11 +189,10 @@ irq_prio_ld: .byte 40,40,41,40,42,42,42,42,43,43,43,43,43,43,43,43
.
macro
get_irqnr_and_base
,
irqnr
,
irqstat
,
base
,
tmp
mov
r4
,
#
0xe0000000
orr
r4
,
r4
,
#
0x20
mov
\
irqstat
,
#
0x0C
strb
\
irqstat
,
[
r4
]
@
outb
(
0x0C
,
0x20
)
/*
Poll
command
*/
ldrb
\
irqnr
,
[
r4
]
@
irq
=
inb
(
0x20
)
&
7
strb
\
irqstat
,
[
r4
,
#
0x20
]
@
outb
(
0x0C
,
0x20
)
/*
Poll
command
*/
ldrb
\
irqnr
,
[
r4
,
#
0x10
]
@
irq
=
inb
(
0x20
)
&
7
and
\
irqstat
,
\
irqnr
,
#
0x80
teq
\
irqstat
,
#
0
beq
43
f
...
...
@@ -201,8 +200,8 @@ irq_prio_ld: .byte 40,40,41,40,42,42,42,42,43,43,43,43,43,43,43,43
teq
\
irqnr
,
#
2
bne
44
f
43
:
mov
\
irqstat
,
#
0x0C
strb
\
irqstat
,
[
r4
,
#
0x
8
0
]
@
outb
(
0x0C
,
0xA0
)
/*
Poll
command
*/
ldrb
\
irqnr
,
[
r4
,
#
0x
8
0
]
@
irq
=
(
inb
(
0xA0
)
&
7
)
+
8
strb
\
irqstat
,
[
r4
,
#
0x
a
0
]
@
outb
(
0x0C
,
0xA0
)
/*
Poll
command
*/
ldrb
\
irqnr
,
[
r4
,
#
0x
a
0
]
@
irq
=
(
inb
(
0xA0
)
&
7
)
+
8
and
\
irqstat
,
\
irqnr
,
#
0x80
teq
\
irqstat
,
#
0
beq
44
f
...
...
@@ -655,7 +654,7 @@ __und_invalid: sub sp, sp, #S_FRAME_SIZE
and
r2
,
r6
,
#
31
@
int
mode
b
bad_mode
#if defined CONFIG_FPE_NWFPE || defined CONFIG_FPE_FASTFPE
#if
1 /*
defined CONFIG_FPE_NWFPE || defined CONFIG_FPE_FASTFPE
*/
/
*
The
FPE
is
always
present
*/
.
equ
fpe_not_present
,
fpundefinstr
#else
...
...
@@ -766,6 +765,8 @@ preempt_return:
msr
spsr
,
r0
ldmia
sp
,
{
r0
-
pc
}^
@
load
r0
-
pc
,
cpsr
.
ltorg
#ifdef CONFIG_PREEMPT
svc_preempt
:
teq
r9
,
#
0
@
was
preempt
count
=
0
ldreq
r6
,
.
LCirq_stat
...
...
@@ -902,6 +903,8 @@ __irq_usr: sub sp, sp, #S_FRAME_SIZE
mov
why
,
#
0
b
ret_to_user
.
ltorg
.
align
5
__und_usr
:
sub
sp
,
sp
,
#
S_FRAME_SIZE
@
Allocate
frame
size
in
one
go
stmia
sp
,
{
r0
-
r12
}
@
Save
r0
-
r12
...
...
This diff is collapsed.
Click to expand it.
arch/arm/kernel/process.c
View file @
ab34ca8e
...
...
@@ -367,8 +367,8 @@ void dump_thread(struct pt_regs * regs, struct user * dump)
dump
->
u_debugreg
[
0
]
=
tsk
->
thread
.
debug
.
bp
[
0
].
address
;
dump
->
u_debugreg
[
1
]
=
tsk
->
thread
.
debug
.
bp
[
1
].
address
;
dump
->
u_debugreg
[
2
]
=
tsk
->
thread
.
debug
.
bp
[
0
].
insn
;
dump
->
u_debugreg
[
3
]
=
tsk
->
thread
.
debug
.
bp
[
1
].
insn
;
dump
->
u_debugreg
[
2
]
=
tsk
->
thread
.
debug
.
bp
[
0
].
insn
.
arm
;
dump
->
u_debugreg
[
3
]
=
tsk
->
thread
.
debug
.
bp
[
1
].
insn
.
arm
;
dump
->
u_debugreg
[
4
]
=
tsk
->
thread
.
debug
.
nsaved
;
if
(
dump
->
start_stack
<
0x04000000
)
...
...
This diff is collapsed.
Click to expand it.
arch/arm/kernel/ptrace.c
View file @
ab34ca8e
...
...
@@ -32,10 +32,24 @@
* in exit.c or in signal.c.
*/
#if 1
/*
* Breakpoint SWI instruction: SWI &9F0001
*/
#define BREAKINST_ARM 0xef9f0001
#define BREAKINST_THUMB 0xdf00
/* fill this in later */
#else
/*
* New breakpoints - use an undefined instruction. The ARM architecture
* reference manual guarantees that the following instruction space
* will produce an undefined instruction exception on all CPUs:
*
* ARM: xxxx 0111 1111 xxxx xxxx xxxx 1111 xxxx
* Thumb: 1101 1110 xxxx xxxx
*/
#define BREAKINST_ARM 0xe7f001f0
#define BREAKINST_THUMB 0xde01
#endif
/*
* Get the address of the live pt_regs for the specified task.
...
...
@@ -89,23 +103,32 @@ put_user_reg(struct task_struct *task, int offset, long data)
}
static
inline
int
read_
tsk_long
(
struct
task_struct
*
child
,
unsigned
long
addr
,
u
nsigned
long
*
res
)
read_
u32
(
struct
task_struct
*
task
,
unsigned
long
addr
,
u
32
*
res
)
{
int
copied
;
int
ret
;
copied
=
access_process_vm
(
child
,
addr
,
res
,
sizeof
(
*
res
),
0
);
ret
=
access_process_vm
(
task
,
addr
,
res
,
sizeof
(
*
res
),
0
);
return
copied
!
=
sizeof
(
*
res
)
?
-
EIO
:
0
;
return
ret
=
=
sizeof
(
*
res
)
?
0
:
-
EIO
;
}
static
inline
int
write_tsk_long
(
struct
task_struct
*
child
,
unsigned
long
addr
,
u
nsigned
long
val
)
read_instr
(
struct
task_struct
*
task
,
unsigned
long
addr
,
u
32
*
res
)
{
int
copied
;
copied
=
access_process_vm
(
child
,
addr
,
&
val
,
sizeof
(
val
),
1
);
int
ret
;
return
copied
!=
sizeof
(
val
)
?
-
EIO
:
0
;
if
(
addr
&
1
)
{
u16
val
;
ret
=
access_process_vm
(
task
,
addr
&
~
1
,
&
val
,
sizeof
(
val
),
0
);
ret
=
ret
==
sizeof
(
val
)
?
0
:
-
EIO
;
*
res
=
val
;
}
else
{
u32
val
;
ret
=
access_process_vm
(
task
,
addr
&
~
3
,
&
val
,
sizeof
(
val
),
0
);
ret
=
ret
==
sizeof
(
val
)
?
0
:
-
EIO
;
*
res
=
val
;
}
return
ret
;
}
/*
...
...
@@ -206,7 +229,7 @@ ptrace_getldrop2(struct task_struct *child, unsigned long insn)
static
unsigned
long
get_branch_address
(
struct
task_struct
*
child
,
unsigned
long
pc
,
unsigned
long
insn
)
{
u
nsigned
long
alt
=
0
;
u
32
alt
=
0
;
switch
(
insn
&
0x0e000000
)
{
case
0x00000000
:
...
...
@@ -262,7 +285,7 @@ get_branch_address(struct task_struct *child, unsigned long pc, unsigned long in
else
base
-=
aluop2
;
}
if
(
read_
tsk_long
(
child
,
base
,
&
alt
)
==
0
)
if
(
read_
u32
(
child
,
base
,
&
alt
)
==
0
)
alt
=
pc_pointer
(
alt
);
}
break
;
...
...
@@ -289,7 +312,7 @@ get_branch_address(struct task_struct *child, unsigned long pc, unsigned long in
base
=
ptrace_getrn
(
child
,
insn
);
if
(
read_
tsk_long
(
child
,
base
+
nr_regs
,
&
alt
)
==
0
)
if
(
read_
u32
(
child
,
base
+
nr_regs
,
&
alt
)
==
0
)
alt
=
pc_pointer
(
alt
);
break
;
}
...
...
@@ -319,30 +342,71 @@ get_branch_address(struct task_struct *child, unsigned long pc, unsigned long in
}
static
int
add_breakpoint
(
struct
task_struct
*
child
,
struct
debug_info
*
dbg
,
unsigned
long
addr
)
swap_insn
(
struct
task_struct
*
task
,
unsigned
long
addr
,
void
*
old_insn
,
void
*
new_insn
,
int
size
)
{
int
ret
;
ret
=
access_process_vm
(
task
,
addr
,
old_insn
,
size
,
0
);
if
(
ret
==
size
)
ret
=
access_process_vm
(
task
,
addr
,
new_insn
,
size
,
1
);
return
ret
;
}
static
void
add_breakpoint
(
struct
task_struct
*
task
,
struct
debug_info
*
dbg
,
unsigned
long
addr
)
{
int
nr
=
dbg
->
nsaved
;
int
res
=
-
EINVAL
;
if
(
nr
<
2
)
{
res
=
read_tsk_long
(
child
,
addr
,
&
dbg
->
bp
[
nr
].
insn
);
if
(
res
==
0
)
res
=
write_tsk_long
(
child
,
addr
,
BREAKINST_ARM
);
u32
new_insn
=
BREAKINST_ARM
;
int
res
;
if
(
res
==
0
)
{
res
=
swap_insn
(
task
,
addr
,
&
dbg
->
bp
[
nr
].
insn
,
&
new_insn
,
4
);
if
(
res
==
4
)
{
dbg
->
bp
[
nr
].
address
=
addr
;
dbg
->
nsaved
+=
1
;
}
}
else
printk
(
KERN_ERR
"ptrace: too many breakpoints
\n
"
);
}
/*
* Clear one breakpoint in the user program. We copy what the hardware
* does and use bit 0 of the address to indicate whether this is a Thumb
* breakpoint or an ARM breakpoint.
*/
static
void
clear_breakpoint
(
struct
task_struct
*
task
,
struct
debug_entry
*
bp
)
{
unsigned
long
addr
=
bp
->
address
;
union
debug_insn
old_insn
;
int
ret
;
if
(
addr
&
1
)
{
ret
=
swap_insn
(
task
,
addr
&
~
1
,
&
old_insn
.
thumb
,
&
bp
->
insn
.
thumb
,
2
);
return
res
;
if
(
ret
!=
2
||
old_insn
.
thumb
!=
BREAKINST_THUMB
)
printk
(
KERN_ERR
"%s:%d: corrupted Thumb breakpoint at "
"0x%08lx (0x%04x)
\n
"
,
task
->
comm
,
task
->
pid
,
addr
,
old_insn
.
thumb
);
}
else
{
ret
=
swap_insn
(
task
,
addr
&
~
3
,
&
old_insn
.
arm
,
&
bp
->
insn
.
arm
,
4
);
if
(
ret
!=
4
||
old_insn
.
arm
!=
BREAKINST_ARM
)
printk
(
KERN_ERR
"%s:%d: corrupted ARM breakpoint at "
"0x%08lx (0x%08x)
\n
"
,
task
->
comm
,
task
->
pid
,
addr
,
old_insn
.
arm
);
}
}
void
ptrace_set_bpt
(
struct
task_struct
*
child
)
{
struct
pt_regs
*
regs
;
unsigned
long
pc
,
insn
;
unsigned
long
pc
;
u32
insn
;
int
res
;
regs
=
get_user_regs
(
child
);
...
...
@@ -353,7 +417,7 @@ void ptrace_set_bpt(struct task_struct *child)
return
;
}
res
=
read_
tsk_long
(
child
,
pc
,
&
insn
);
res
=
read_
instr
(
child
,
pc
,
&
insn
);
if
(
!
res
)
{
struct
debug_info
*
dbg
=
&
child
->
thread
.
debug
;
unsigned
long
alt
;
...
...
@@ -362,7 +426,7 @@ void ptrace_set_bpt(struct task_struct *child)
alt
=
get_branch_address
(
child
,
pc
,
insn
);
if
(
alt
)
res
=
add_breakpoint
(
child
,
dbg
,
alt
);
add_breakpoint
(
child
,
dbg
,
alt
);
/*
* Note that we ignore the result of setting the above
...
...
@@ -374,7 +438,7 @@ void ptrace_set_bpt(struct task_struct *child)
* loose control of the thread during single stepping.
*/
if
(
!
alt
||
predicate
(
insn
)
!=
PREDICATE_ALWAYS
)
res
=
add_breakpoint
(
child
,
dbg
,
pc
+
4
);
add_breakpoint
(
child
,
dbg
,
pc
+
4
);
}
}
...
...
@@ -384,24 +448,17 @@ void ptrace_set_bpt(struct task_struct *child)
*/
void
__ptrace_cancel_bpt
(
struct
task_struct
*
child
)
{
struct
debug_info
*
dbg
=
&
child
->
thread
.
debug
;
int
i
,
nsaved
=
dbg
->
nsaved
;
int
i
,
nsaved
=
child
->
thread
.
debug
.
nsaved
;
dbg
->
nsaved
=
0
;
child
->
thread
.
debug
.
nsaved
=
0
;
if
(
nsaved
>
2
)
{
printk
(
"ptrace_cancel_bpt: bogus nsaved: %d!
\n
"
,
nsaved
);
nsaved
=
2
;
}
for
(
i
=
0
;
i
<
nsaved
;
i
++
)
{
unsigned
long
tmp
;
read_tsk_long
(
child
,
dbg
->
bp
[
i
].
address
,
&
tmp
);
write_tsk_long
(
child
,
dbg
->
bp
[
i
].
address
,
dbg
->
bp
[
i
].
insn
);
if
(
tmp
!=
BREAKINST_ARM
)
printk
(
KERN_ERR
"ptrace_cancel_bpt: weirdness
\n
"
);
}
for
(
i
=
0
;
i
<
nsaved
;
i
++
)
clear_breakpoint
(
child
,
&
child
->
thread
.
debug
.
bp
[
i
]);
}
/*
...
...
@@ -537,9 +594,12 @@ static int do_ptrace(int request, struct task_struct *child, long addr, long dat
*/
case
PTRACE_PEEKTEXT
:
case
PTRACE_PEEKDATA
:
ret
=
read_tsk_long
(
child
,
addr
,
&
tmp
);
if
(
!
ret
)
ret
=
access_process_vm
(
child
,
addr
,
&
tmp
,
sizeof
(
unsigned
long
),
0
);
if
(
ret
==
sizeof
(
unsigned
long
))
ret
=
put_user
(
tmp
,
(
unsigned
long
*
)
data
);
else
ret
=
-
EIO
;
break
;
case
PTRACE_PEEKUSR
:
...
...
@@ -551,7 +611,12 @@ static int do_ptrace(int request, struct task_struct *child, long addr, long dat
*/
case
PTRACE_POKETEXT
:
case
PTRACE_POKEDATA
:
ret
=
write_tsk_long
(
child
,
addr
,
data
);
ret
=
access_process_vm
(
child
,
addr
,
&
data
,
sizeof
(
unsigned
long
),
1
);
if
(
ret
==
sizeof
(
unsigned
long
))
ret
=
0
;
else
ret
=
-
EIO
;
break
;
case
PTRACE_POKEUSR
:
...
...
This diff is collapsed.
Click to expand it.
arch/arm/kernel/setup.c
View file @
ab34ca8e
...
...
@@ -193,26 +193,25 @@ static inline void dump_cache(const char *prefix, unsigned int cache)
CACHE_LINE
(
cache
)));
}
static
inline
void
dump_cpu_
cache_id
(
void
)
static
void
__init
dump_cpu_
info
(
void
)
{
unsigned
int
cache_
info
;
unsigned
int
info
;
asm
(
"mrc p15, 0, %0, c0, c0, 1"
:
"=r"
(
cache_
info
));
asm
(
"mrc p15, 0, %0, c0, c0, 1"
:
"=r"
(
info
));
if
(
cache_info
==
processor_id
)
return
;
printk
(
"CPU: D %s cache
\n
"
,
cache_types
[
CACHE_TYPE
(
cache_info
)]);
if
(
CACHE_S
(
cache_info
))
{
dump_cache
(
"CPU: I cache"
,
CACHE_ISIZE
(
cache_info
));
dump_cache
(
"CPU: D cache"
,
CACHE_DSIZE
(
cache_info
));
}
else
{
dump_cache
(
"CPU: cache"
,
CACHE_ISIZE
(
cache_info
));
if
(
info
!=
processor_id
)
{
printk
(
"CPU: D %s cache
\n
"
,
cache_types
[
CACHE_TYPE
(
info
)]);
if
(
CACHE_S
(
info
))
{
dump_cache
(
"CPU: I cache"
,
CACHE_ISIZE
(
info
));
dump_cache
(
"CPU: D cache"
,
CACHE_DSIZE
(
info
));
}
else
{
dump_cache
(
"CPU: cache"
,
CACHE_ISIZE
(
info
));
}
}
}
#else
#define dump_cpu_
cache_id
() do { } while (0)
#define dump_cpu_
info
() do { } while (0)
#endif
static
void
__init
setup_processor
(
void
)
...
...
@@ -255,7 +254,7 @@ static void __init setup_processor(void)
proc_info
.
manufacturer
,
proc_info
.
cpu_name
,
(
int
)
processor_id
&
15
);
dump_cpu_
cache_id
();
dump_cpu_
info
();
sprintf
(
system_utsname
.
machine
,
"%s%c"
,
list
->
arch_name
,
ENDIANNESS
);
sprintf
(
elf_platform
,
"%s%c"
,
list
->
elf_name
,
ENDIANNESS
);
...
...
This diff is collapsed.
Click to expand it.
arch/arm/kernel/signal.c
View file @
ab34ca8e
...
...
@@ -59,11 +59,11 @@ asmlinkage int sys_sigsuspend(int restart, unsigned long oldmask, old_sigset_t m
sigset_t
saveset
;
mask
&=
_BLOCKABLE
;
spin_lock_irq
(
&
current
->
sig
mask_
lock
);
spin_lock_irq
(
&
current
->
sig
->
sig
lock
);
saveset
=
current
->
blocked
;
siginitset
(
&
current
->
blocked
,
mask
);
recalc_sigpending
();
spin_unlock_irq
(
&
current
->
sig
mask_
lock
);
spin_unlock_irq
(
&
current
->
sig
->
sig
lock
);
regs
->
ARM_r0
=
-
EINTR
;
while
(
1
)
{
...
...
@@ -87,11 +87,11 @@ sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize, struct pt_regs *regs)
return
-
EFAULT
;
sigdelsetmask
(
&
newset
,
~
_BLOCKABLE
);
spin_lock_irq
(
&
current
->
sig
mask_
lock
);
spin_lock_irq
(
&
current
->
sig
->
sig
lock
);
saveset
=
current
->
blocked
;
current
->
blocked
=
newset
;
recalc_sigpending
();
spin_unlock_irq
(
&
current
->
sig
mask_
lock
);
spin_unlock_irq
(
&
current
->
sig
->
sig
lock
);
regs
->
ARM_r0
=
-
EINTR
;
while
(
1
)
{
...
...
@@ -207,10 +207,10 @@ asmlinkage int sys_sigreturn(struct pt_regs *regs)
goto
badframe
;
sigdelsetmask
(
&
set
,
~
_BLOCKABLE
);
spin_lock_irq
(
&
current
->
sig
mask_
lock
);
spin_lock_irq
(
&
current
->
sig
->
sig
lock
);
current
->
blocked
=
set
;
recalc_sigpending
();
spin_unlock_irq
(
&
current
->
sig
mask_
lock
);
spin_unlock_irq
(
&
current
->
sig
->
sig
lock
);
if
(
restore_sigcontext
(
regs
,
&
frame
->
sc
))
goto
badframe
;
...
...
@@ -247,10 +247,10 @@ asmlinkage int sys_rt_sigreturn(struct pt_regs *regs)
goto
badframe
;
sigdelsetmask
(
&
set
,
~
_BLOCKABLE
);
spin_lock_irq
(
&
current
->
sig
mask_
lock
);
spin_lock_irq
(
&
current
->
sig
->
sig
lock
);
current
->
blocked
=
set
;
recalc_sigpending
();
spin_unlock_irq
(
&
current
->
sig
mask_
lock
);
spin_unlock_irq
(
&
current
->
sig
->
sig
lock
);
if
(
restore_sigcontext
(
regs
,
&
frame
->
uc
.
uc_mcontext
))
goto
badframe
;
...
...
@@ -477,12 +477,12 @@ handle_signal(unsigned long sig, struct k_sigaction *ka,
ka
->
sa
.
sa_handler
=
SIG_DFL
;
if
(
!
(
ka
->
sa
.
sa_flags
&
SA_NODEFER
))
{
spin_lock_irq
(
&
tsk
->
sig
mask_
lock
);
spin_lock_irq
(
&
tsk
->
sig
->
sig
lock
);
sigorsets
(
&
tsk
->
blocked
,
&
tsk
->
blocked
,
&
ka
->
sa
.
sa_mask
);
sigaddset
(
&
tsk
->
blocked
,
sig
);
recalc_sigpending
();
spin_unlock_irq
(
&
tsk
->
sig
mask_
lock
);
spin_unlock_irq
(
&
tsk
->
sig
->
sig
lock
);
}
return
;
}
...
...
@@ -520,20 +520,10 @@ static int do_signal(sigset_t *oldset, struct pt_regs *regs, int syscall)
for
(;;)
{
unsigned
long
signr
=
0
;
struct
k_sigaction
*
ka
;
sigset_t
*
mask
=
&
current
->
blocked
;
local_irq_disable
();
if
(
current
->
sig
->
shared_pending
.
head
)
{
spin_lock
(
&
current
->
sig
->
siglock
);
signr
=
dequeue_signal
(
&
current
->
sig
->
shared_pending
,
mask
,
&
info
);
spin_unlock
(
&
current
->
sig
->
siglock
);
}
if
(
!
signr
)
{
spin_lock
(
&
current
->
sigmask_lock
);
signr
=
dequeue_signal
(
&
current
->
pending
,
mask
,
&
info
);
spin_unlock
(
&
current
->
sigmask_lock
);
}
local_irq_enable
();
spin_lock_irq
(
&
current
->
sig
->
siglock
);
signr
=
dequeue_signal
(
&
current
->
blocked
,
&
info
);
spin_unlock_irq
(
&
current
->
sig
->
siglock
);
if
(
!
signr
)
break
;
...
...
This diff is collapsed.
Click to expand it.
arch/arm/kernel/time-acorn.c
View file @
ab34ca8e
...
...
@@ -25,44 +25,37 @@ extern unsigned long (*gettimeoffset)(void);
static
unsigned
long
ioctime_gettimeoffset
(
void
)
{
unsigned
int
count1
,
count2
,
status
1
,
status2
;
unsigned
long
offset
=
0
;
unsigned
int
count1
,
count2
,
status
;
long
offset
;
status1
=
ioc_readb
(
IOC_IRQREQA
);
barrier
();
ioc_writeb
(
0
,
IOC_T0LATCH
);
barrier
();
count1
=
ioc_readb
(
IOC_T0CNTL
)
|
(
ioc_readb
(
IOC_T0CNTH
)
<<
8
);
barrier
();
status
2
=
ioc_readb
(
IOC_IRQREQA
);
status
=
ioc_readb
(
IOC_IRQREQA
);
barrier
();
ioc_writeb
(
0
,
IOC_T0LATCH
);
barrier
();
count2
=
ioc_readb
(
IOC_T0CNTL
)
|
(
ioc_readb
(
IOC_T0CNTH
)
<<
8
);
offset
=
count2
;
if
(
count2
<
count1
)
{
/*
*
This means that we haven't just had an interrupt
*
while reading into status
2.
*
We have not had an interrupt between reading count1
*
and count
2.
*/
if
(
status2
&
(
1
<<
5
))
offset
=
tick
;
count1
=
count2
;
if
(
status
&
(
1
<<
5
))
offset
-=
LATCH
;
}
else
if
(
count2
>
count1
)
{
/*
* We have just had another interrupt
while
reading
*
status
2.
* We have just had another interrupt
between
reading
*
count1 and count
2.
*/
offset
+=
tick
;
count1
=
count2
;
offset
-=
LATCH
;
}
count1
=
LATCH
-
count1
;
/*
* count1 = number of clock ticks since last interrupt
*/
offset
+=
count1
*
tick
/
LATCH
;
return
offset
;
offset
=
(
LATCH
-
offset
)
*
(
tick_nsec
/
1000
);
return
(
offset
+
LATCH
/
2
)
/
LATCH
;
}
void
__init
ioctime_init
(
void
)
...
...
This diff is collapsed.
Click to expand it.
Prev
1
2
3
4
5
…
11
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment