提交 440fdb53 编写于 作者: D David Woodhouse

要显示的变更太多。

To preserve performance only 1000 of 1000+ files are displayed.
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
# #
.* .*
*.o *.o
*.o.*
*.a *.a
*.s *.s
*.ko *.ko
......
...@@ -966,6 +966,7 @@ N: Pekka Enberg ...@@ -966,6 +966,7 @@ N: Pekka Enberg
E: penberg@cs.helsinki.fi E: penberg@cs.helsinki.fi
W: http://www.cs.helsinki.fi/u/penberg/ W: http://www.cs.helsinki.fi/u/penberg/
D: Various kernel hacks, fixes, and cleanups. D: Various kernel hacks, fixes, and cleanups.
D: Slab allocators
S: Finland S: Finland
N: David Engebretsen N: David Engebretsen
...@@ -1939,8 +1940,8 @@ D: for Menuconfig's lxdialog. ...@@ -1939,8 +1940,8 @@ D: for Menuconfig's lxdialog.
N: Christoph Lameter N: Christoph Lameter
E: christoph@lameter.com E: christoph@lameter.com
D: Digiboard PC/Xe and PC/Xi, Digiboard EPCA D: Digiboard PC/Xe and PC/Xi, Digiboard EPCA
D: Early protocol filter for bridging code D: NUMA support, Slab allocators, Page migration
D: Bug fixes D: Scalability, Time subsystem
N: Paul Laufer N: Paul Laufer
E: paul@laufernet.com E: paul@laufernet.com
......
...@@ -26,7 +26,7 @@ Part Ia - Using large dma-coherent buffers ...@@ -26,7 +26,7 @@ Part Ia - Using large dma-coherent buffers
void * void *
dma_alloc_coherent(struct device *dev, size_t size, dma_alloc_coherent(struct device *dev, size_t size,
dma_addr_t *dma_handle, int flag) dma_addr_t *dma_handle, gfp_t flag)
void * void *
pci_alloc_consistent(struct pci_dev *dev, size_t size, pci_alloc_consistent(struct pci_dev *dev, size_t size,
dma_addr_t *dma_handle) dma_addr_t *dma_handle)
...@@ -38,7 +38,7 @@ to make sure to flush the processor's write buffers before telling ...@@ -38,7 +38,7 @@ to make sure to flush the processor's write buffers before telling
devices to read that memory.) devices to read that memory.)
This routine allocates a region of <size> bytes of consistent memory. This routine allocates a region of <size> bytes of consistent memory.
it also returns a <dma_handle> which may be cast to an unsigned It also returns a <dma_handle> which may be cast to an unsigned
integer the same width as the bus and used as the physical address integer the same width as the bus and used as the physical address
base of the region. base of the region.
...@@ -52,21 +52,21 @@ The simplest way to do that is to use the dma_pool calls (see below). ...@@ -52,21 +52,21 @@ The simplest way to do that is to use the dma_pool calls (see below).
The flag parameter (dma_alloc_coherent only) allows the caller to The flag parameter (dma_alloc_coherent only) allows the caller to
specify the GFP_ flags (see kmalloc) for the allocation (the specify the GFP_ flags (see kmalloc) for the allocation (the
implementation may chose to ignore flags that affect the location of implementation may choose to ignore flags that affect the location of
the returned memory, like GFP_DMA). For pci_alloc_consistent, you the returned memory, like GFP_DMA). For pci_alloc_consistent, you
must assume GFP_ATOMIC behaviour. must assume GFP_ATOMIC behaviour.
void void
dma_free_coherent(struct device *dev, size_t size, void *cpu_addr dma_free_coherent(struct device *dev, size_t size, void *cpu_addr,
dma_addr_t dma_handle) dma_addr_t dma_handle)
void void
pci_free_consistent(struct pci_dev *dev, size_t size, void *cpu_addr pci_free_consistent(struct pci_dev *dev, size_t size, void *cpu_addr,
dma_addr_t dma_handle) dma_addr_t dma_handle)
Free the region of consistent memory you previously allocated. dev, Free the region of consistent memory you previously allocated. dev,
size and dma_handle must all be the same as those passed into the size and dma_handle must all be the same as those passed into the
consistent allocate. cpu_addr must be the virtual address returned by consistent allocate. cpu_addr must be the virtual address returned by
the consistent allocate the consistent allocate.
Part Ib - Using small dma-coherent buffers Part Ib - Using small dma-coherent buffers
...@@ -77,9 +77,9 @@ To get this part of the dma_ API, you must #include <linux/dmapool.h> ...@@ -77,9 +77,9 @@ To get this part of the dma_ API, you must #include <linux/dmapool.h>
Many drivers need lots of small dma-coherent memory regions for DMA Many drivers need lots of small dma-coherent memory regions for DMA
descriptors or I/O buffers. Rather than allocating in units of a page descriptors or I/O buffers. Rather than allocating in units of a page
or more using dma_alloc_coherent(), you can use DMA pools. These work or more using dma_alloc_coherent(), you can use DMA pools. These work
much like a struct kmem_cache, except that they use the dma-coherent allocator much like a struct kmem_cache, except that they use the dma-coherent allocator,
not __get_free_pages(). Also, they understand common hardware constraints not __get_free_pages(). Also, they understand common hardware constraints
for alignment, like queue heads needing to be aligned on N byte boundaries. for alignment, like queue heads needing to be aligned on N-byte boundaries.
struct dma_pool * struct dma_pool *
...@@ -102,15 +102,15 @@ crossing restrictions, pass 0 for alloc; passing 4096 says memory allocated ...@@ -102,15 +102,15 @@ crossing restrictions, pass 0 for alloc; passing 4096 says memory allocated
from this pool must not cross 4KByte boundaries. from this pool must not cross 4KByte boundaries.
void *dma_pool_alloc(struct dma_pool *pool, int gfp_flags, void *dma_pool_alloc(struct dma_pool *pool, gfp_t gfp_flags,
dma_addr_t *dma_handle); dma_addr_t *dma_handle);
void *pci_pool_alloc(struct pci_pool *pool, int gfp_flags, void *pci_pool_alloc(struct pci_pool *pool, gfp_t gfp_flags,
dma_addr_t *dma_handle); dma_addr_t *dma_handle);
This allocates memory from the pool; the returned memory will meet the size This allocates memory from the pool; the returned memory will meet the size
and alignment requirements specified at creation time. Pass GFP_ATOMIC to and alignment requirements specified at creation time. Pass GFP_ATOMIC to
prevent blocking, or if it's permitted (not in_interrupt, not holding SMP locks) prevent blocking, or if it's permitted (not in_interrupt, not holding SMP locks),
pass GFP_KERNEL to allow blocking. Like dma_alloc_coherent(), this returns pass GFP_KERNEL to allow blocking. Like dma_alloc_coherent(), this returns
two values: an address usable by the cpu, and the dma address usable by the two values: an address usable by the cpu, and the dma address usable by the
pool's device. pool's device.
...@@ -123,7 +123,7 @@ pool's device. ...@@ -123,7 +123,7 @@ pool's device.
dma_addr_t addr); dma_addr_t addr);
This puts memory back into the pool. The pool is what was passed to This puts memory back into the pool. The pool is what was passed to
the pool allocation routine; the cpu and dma addresses are what the pool allocation routine; the cpu (vaddr) and dma addresses are what
were returned when that routine allocated the memory being freed. were returned when that routine allocated the memory being freed.
...@@ -209,18 +209,18 @@ Notes: Not all memory regions in a machine can be mapped by this ...@@ -209,18 +209,18 @@ Notes: Not all memory regions in a machine can be mapped by this
API. Further, regions that appear to be physically contiguous in API. Further, regions that appear to be physically contiguous in
kernel virtual space may not be contiguous as physical memory. Since kernel virtual space may not be contiguous as physical memory. Since
this API does not provide any scatter/gather capability, it will fail this API does not provide any scatter/gather capability, it will fail
if the user tries to map a non physically contiguous piece of memory. if the user tries to map a non-physically contiguous piece of memory.
For this reason, it is recommended that memory mapped by this API be For this reason, it is recommended that memory mapped by this API be
obtained only from sources which guarantee to be physically contiguous obtained only from sources which guarantee it to be physically contiguous
(like kmalloc). (like kmalloc).
Further, the physical address of the memory must be within the Further, the physical address of the memory must be within the
dma_mask of the device (the dma_mask represents a bit mask of the dma_mask of the device (the dma_mask represents a bit mask of the
addressable region for the device. i.e. if the physical address of addressable region for the device. I.e., if the physical address of
the memory anded with the dma_mask is still equal to the physical the memory anded with the dma_mask is still equal to the physical
address, then the device can perform DMA to the memory). In order to address, then the device can perform DMA to the memory). In order to
ensure that the memory allocated by kmalloc is within the dma_mask, ensure that the memory allocated by kmalloc is within the dma_mask,
the driver may specify various platform dependent flags to restrict the driver may specify various platform-dependent flags to restrict
the physical memory range of the allocation (e.g. on x86, GFP_DMA the physical memory range of the allocation (e.g. on x86, GFP_DMA
guarantees to be within the first 16Mb of available physical memory, guarantees to be within the first 16Mb of available physical memory,
as required by ISA devices). as required by ISA devices).
...@@ -244,14 +244,14 @@ are guaranteed also to be cache line boundaries). ...@@ -244,14 +244,14 @@ are guaranteed also to be cache line boundaries).
DMA_TO_DEVICE synchronisation must be done after the last modification DMA_TO_DEVICE synchronisation must be done after the last modification
of the memory region by the software and before it is handed off to of the memory region by the software and before it is handed off to
the driver. Once this primitive is used. Memory covered by this the driver. Once this primitive is used, memory covered by this
primitive should be treated as read only by the device. If the device primitive should be treated as read-only by the device. If the device
may write to it at any point, it should be DMA_BIDIRECTIONAL (see may write to it at any point, it should be DMA_BIDIRECTIONAL (see
below). below).
DMA_FROM_DEVICE synchronisation must be done before the driver DMA_FROM_DEVICE synchronisation must be done before the driver
accesses data that may be changed by the device. This memory should accesses data that may be changed by the device. This memory should
be treated as read only by the driver. If the driver needs to write be treated as read-only by the driver. If the driver needs to write
to it at any point, it should be DMA_BIDIRECTIONAL (see below). to it at any point, it should be DMA_BIDIRECTIONAL (see below).
DMA_BIDIRECTIONAL requires special handling: it means that the driver DMA_BIDIRECTIONAL requires special handling: it means that the driver
...@@ -261,7 +261,7 @@ you must always sync bidirectional memory twice: once before the ...@@ -261,7 +261,7 @@ you must always sync bidirectional memory twice: once before the
memory is handed off to the device (to make sure all memory changes memory is handed off to the device (to make sure all memory changes
are flushed from the processor) and once before the data may be are flushed from the processor) and once before the data may be
accessed after being used by the device (to make sure any processor accessed after being used by the device (to make sure any processor
cache lines are updated with data that the device may have changed. cache lines are updated with data that the device may have changed).
void void
dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size, dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
...@@ -302,8 +302,8 @@ pci_dma_mapping_error(dma_addr_t dma_addr) ...@@ -302,8 +302,8 @@ pci_dma_mapping_error(dma_addr_t dma_addr)
In some circumstances dma_map_single and dma_map_page will fail to create In some circumstances dma_map_single and dma_map_page will fail to create
a mapping. A driver can check for these errors by testing the returned a mapping. A driver can check for these errors by testing the returned
dma address with dma_mapping_error(). A non zero return value means the mapping dma address with dma_mapping_error(). A non-zero return value means the mapping
could not be created and the driver should take appropriate action (eg could not be created and the driver should take appropriate action (e.g.
reduce current DMA mapping usage or delay and try again later). reduce current DMA mapping usage or delay and try again later).
int int
...@@ -315,7 +315,7 @@ reduce current DMA mapping usage or delay and try again later). ...@@ -315,7 +315,7 @@ reduce current DMA mapping usage or delay and try again later).
Maps a scatter gather list from the block layer. Maps a scatter gather list from the block layer.
Returns: the number of physical segments mapped (this may be shorted Returns: the number of physical segments mapped (this may be shorter
than <nents> passed in if the block layer determines that some than <nents> passed in if the block layer determines that some
elements of the scatter/gather list are physically adjacent and thus elements of the scatter/gather list are physically adjacent and thus
may be mapped with a single entry). may be mapped with a single entry).
...@@ -357,7 +357,7 @@ accessed sg->address and sg->length as shown above. ...@@ -357,7 +357,7 @@ accessed sg->address and sg->length as shown above.
pci_unmap_sg(struct pci_dev *hwdev, struct scatterlist *sg, pci_unmap_sg(struct pci_dev *hwdev, struct scatterlist *sg,
int nents, int direction) int nents, int direction)
unmap the previously mapped scatter/gather list. All the parameters Unmap the previously mapped scatter/gather list. All the parameters
must be the same as those and passed in to the scatter/gather mapping must be the same as those and passed in to the scatter/gather mapping
API. API.
...@@ -377,7 +377,7 @@ void ...@@ -377,7 +377,7 @@ void
pci_dma_sync_sg(struct pci_dev *hwdev, struct scatterlist *sg, pci_dma_sync_sg(struct pci_dev *hwdev, struct scatterlist *sg,
int nelems, int direction) int nelems, int direction)
synchronise a single contiguous or scatter/gather mapping. All the Synchronise a single contiguous or scatter/gather mapping. All the
parameters must be the same as those passed into the single mapping parameters must be the same as those passed into the single mapping
API. API.
...@@ -406,7 +406,7 @@ API at all. ...@@ -406,7 +406,7 @@ API at all.
void * void *
dma_alloc_noncoherent(struct device *dev, size_t size, dma_alloc_noncoherent(struct device *dev, size_t size,
dma_addr_t *dma_handle, int flag) dma_addr_t *dma_handle, gfp_t flag)
Identical to dma_alloc_coherent() except that the platform will Identical to dma_alloc_coherent() except that the platform will
choose to return either consistent or non-consistent memory as it sees choose to return either consistent or non-consistent memory as it sees
...@@ -426,34 +426,34 @@ void ...@@ -426,34 +426,34 @@ void
dma_free_noncoherent(struct device *dev, size_t size, void *cpu_addr, dma_free_noncoherent(struct device *dev, size_t size, void *cpu_addr,
dma_addr_t dma_handle) dma_addr_t dma_handle)
free memory allocated by the nonconsistent API. All parameters must Free memory allocated by the nonconsistent API. All parameters must
be identical to those passed in (and returned by be identical to those passed in (and returned by
dma_alloc_noncoherent()). dma_alloc_noncoherent()).
int int
dma_is_consistent(struct device *dev, dma_addr_t dma_handle) dma_is_consistent(struct device *dev, dma_addr_t dma_handle)
returns true if the device dev is performing consistent DMA on the memory Returns true if the device dev is performing consistent DMA on the memory
area pointed to by the dma_handle. area pointed to by the dma_handle.
int int
dma_get_cache_alignment(void) dma_get_cache_alignment(void)
returns the processor cache alignment. This is the absolute minimum Returns the processor cache alignment. This is the absolute minimum
alignment *and* width that you must observe when either mapping alignment *and* width that you must observe when either mapping
memory or doing partial flushes. memory or doing partial flushes.
Notes: This API may return a number *larger* than the actual cache Notes: This API may return a number *larger* than the actual cache
line, but it will guarantee that one or more cache lines fit exactly line, but it will guarantee that one or more cache lines fit exactly
into the width returned by this call. It will also always be a power into the width returned by this call. It will also always be a power
of two for easy alignment of two for easy alignment.
void void
dma_sync_single_range(struct device *dev, dma_addr_t dma_handle, dma_sync_single_range(struct device *dev, dma_addr_t dma_handle,
unsigned long offset, size_t size, unsigned long offset, size_t size,
enum dma_data_direction direction) enum dma_data_direction direction)
does a partial sync. starting at offset and continuing for size. You Does a partial sync, starting at offset and continuing for size. You
must be careful to observe the cache alignment and width when doing must be careful to observe the cache alignment and width when doing
anything like this. You must also be extra careful about accessing anything like this. You must also be extra careful about accessing
memory you intend to sync partially. memory you intend to sync partially.
...@@ -472,21 +472,20 @@ dma_declare_coherent_memory(struct device *dev, dma_addr_t bus_addr, ...@@ -472,21 +472,20 @@ dma_declare_coherent_memory(struct device *dev, dma_addr_t bus_addr,
dma_addr_t device_addr, size_t size, int dma_addr_t device_addr, size_t size, int
flags) flags)
Declare region of memory to be handed out by dma_alloc_coherent when Declare region of memory to be handed out by dma_alloc_coherent when
it's asked for coherent memory for this device. it's asked for coherent memory for this device.
bus_addr is the physical address to which the memory is currently bus_addr is the physical address to which the memory is currently
assigned in the bus responding region (this will be used by the assigned in the bus responding region (this will be used by the
platform to perform the mapping) platform to perform the mapping).
device_addr is the physical address the device needs to be programmed device_addr is the physical address the device needs to be programmed
with actually to address this memory (this will be handed out as the with actually to address this memory (this will be handed out as the
dma_addr_t in dma_alloc_coherent()) dma_addr_t in dma_alloc_coherent()).
size is the size of the area (must be multiples of PAGE_SIZE). size is the size of the area (must be multiples of PAGE_SIZE).
flags can be or'd together and are flags can be or'd together and are:
DMA_MEMORY_MAP - request that the memory returned from DMA_MEMORY_MAP - request that the memory returned from
dma_alloc_coherent() be directly writable. dma_alloc_coherent() be directly writable.
...@@ -494,7 +493,7 @@ dma_alloc_coherent() be directly writable. ...@@ -494,7 +493,7 @@ dma_alloc_coherent() be directly writable.
DMA_MEMORY_IO - request that the memory returned from DMA_MEMORY_IO - request that the memory returned from
dma_alloc_coherent() be addressable using read/write/memcpy_toio etc. dma_alloc_coherent() be addressable using read/write/memcpy_toio etc.
One or both of these flags must be present One or both of these flags must be present.
DMA_MEMORY_INCLUDES_CHILDREN - make the declared memory be allocated by DMA_MEMORY_INCLUDES_CHILDREN - make the declared memory be allocated by
dma_alloc_coherent of any child devices of this one (for memory residing dma_alloc_coherent of any child devices of this one (for memory residing
...@@ -528,7 +527,7 @@ dma_release_declared_memory(struct device *dev) ...@@ -528,7 +527,7 @@ dma_release_declared_memory(struct device *dev)
Remove the memory region previously declared from the system. This Remove the memory region previously declared from the system. This
API performs *no* in-use checking for this region and will return API performs *no* in-use checking for this region and will return
unconditionally having removed all the required structures. It is the unconditionally having removed all the required structures. It is the
drivers job to ensure that no parts of this memory region are driver's job to ensure that no parts of this memory region are
currently in use. currently in use.
void * void *
...@@ -538,12 +537,10 @@ dma_mark_declared_memory_occupied(struct device *dev, ...@@ -538,12 +537,10 @@ dma_mark_declared_memory_occupied(struct device *dev,
This is used to occupy specific regions of the declared space This is used to occupy specific regions of the declared space
(dma_alloc_coherent() will hand out the first free region it finds). (dma_alloc_coherent() will hand out the first free region it finds).
device_addr is the *device* address of the region requested device_addr is the *device* address of the region requested.
size is the size (and should be a page sized multiple). size is the size (and should be a page-sized multiple).
The return value will be either a pointer to the processor virtual The return value will be either a pointer to the processor virtual
address of the memory, or an error (via PTR_ERR()) if any part of the address of the memory, or an error (via PTR_ERR()) if any part of the
region is occupied. region is occupied.
...@@ -380,7 +380,6 @@ X!Edrivers/base/interface.c ...@@ -380,7 +380,6 @@ X!Edrivers/base/interface.c
!Edrivers/base/bus.c !Edrivers/base/bus.c
</sect1> </sect1>
<sect1><title>Device Drivers Power Management</title> <sect1><title>Device Drivers Power Management</title>
!Edrivers/base/power/main.c
!Edrivers/base/power/resume.c !Edrivers/base/power/resume.c
!Edrivers/base/power/suspend.c !Edrivers/base/power/suspend.c
</sect1> </sect1>
...@@ -398,12 +397,12 @@ X!Edrivers/acpi/pci_bind.c ...@@ -398,12 +397,12 @@ X!Edrivers/acpi/pci_bind.c
--> -->
</sect1> </sect1>
<sect1><title>Device drivers PnP support</title> <sect1><title>Device drivers PnP support</title>
!Edrivers/pnp/core.c !Idrivers/pnp/core.c
<!-- No correct structured comments <!-- No correct structured comments
X!Edrivers/pnp/system.c X!Edrivers/pnp/system.c
--> -->
!Edrivers/pnp/card.c !Edrivers/pnp/card.c
!Edrivers/pnp/driver.c !Idrivers/pnp/driver.c
!Edrivers/pnp/manager.c !Edrivers/pnp/manager.c
!Edrivers/pnp/support.c !Edrivers/pnp/support.c
</sect1> </sect1>
...@@ -704,14 +703,22 @@ X!Idrivers/video/console/fonts.c ...@@ -704,14 +703,22 @@ X!Idrivers/video/console/fonts.c
<chapter id="splice"> <chapter id="splice">
<title>splice API</title> <title>splice API</title>
<para>) <para>
splice is a method for moving blocks of data around inside the splice is a method for moving blocks of data around inside the
kernel, without continually transferring it between the kernel kernel, without continually transferring them between the kernel
and user space. and user space.
</para> </para>
!Iinclude/linux/splice.h
!Ffs/splice.c !Ffs/splice.c
</chapter> </chapter>
<chapter id="pipes">
<title>pipes API</title>
<para>
Pipe interfaces are all for in-kernel (builtin image) use.
They are not exported for use by modules.
</para>
!Iinclude/linux/pipe_fs_i.h
!Ffs/pipe.c
</chapter>
</book> </book>
...@@ -79,9 +79,9 @@ and how to prepare flush requests. Note that the term 'ordered' is ...@@ -79,9 +79,9 @@ and how to prepare flush requests. Note that the term 'ordered' is
used to indicate the whole sequence of performing barrier requests used to indicate the whole sequence of performing barrier requests
including draining and flushing. including draining and flushing.
typedef void (prepare_flush_fn)(request_queue_t *q, struct request *rq); typedef void (prepare_flush_fn)(struct request_queue *q, struct request *rq);
int blk_queue_ordered(request_queue_t *q, unsigned ordered, int blk_queue_ordered(struct request_queue *q, unsigned ordered,
prepare_flush_fn *prepare_flush_fn); prepare_flush_fn *prepare_flush_fn);
@q : the queue in question @q : the queue in question
...@@ -92,7 +92,7 @@ int blk_queue_ordered(request_queue_t *q, unsigned ordered, ...@@ -92,7 +92,7 @@ int blk_queue_ordered(request_queue_t *q, unsigned ordered,
For example, SCSI disk driver's prepare_flush_fn looks like the For example, SCSI disk driver's prepare_flush_fn looks like the
following. following.
static void sd_prepare_flush(request_queue_t *q, struct request *rq) static void sd_prepare_flush(struct request_queue *q, struct request *rq)
{ {
memset(rq->cmd, 0, sizeof(rq->cmd)); memset(rq->cmd, 0, sizeof(rq->cmd));
rq->cmd_type = REQ_TYPE_BLOCK_PC; rq->cmd_type = REQ_TYPE_BLOCK_PC;
......
...@@ -740,12 +740,12 @@ Block now offers some simple generic functionality to help support command ...@@ -740,12 +740,12 @@ Block now offers some simple generic functionality to help support command
queueing (typically known as tagged command queueing), ie manage more than queueing (typically known as tagged command queueing), ie manage more than
one outstanding command on a queue at any given time. one outstanding command on a queue at any given time.
blk_queue_init_tags(request_queue_t *q, int depth) blk_queue_init_tags(struct request_queue *q, int depth)
Initialize internal command tagging structures for a maximum Initialize internal command tagging structures for a maximum
depth of 'depth'. depth of 'depth'.
blk_queue_free_tags((request_queue_t *q) blk_queue_free_tags((struct request_queue *q)
Teardown tag info associated with the queue. This will be done Teardown tag info associated with the queue. This will be done
automatically by block if blk_queue_cleanup() is called on a queue automatically by block if blk_queue_cleanup() is called on a queue
...@@ -754,7 +754,7 @@ one outstanding command on a queue at any given time. ...@@ -754,7 +754,7 @@ one outstanding command on a queue at any given time.
The above are initialization and exit management, the main helpers during The above are initialization and exit management, the main helpers during
normal operations are: normal operations are:
blk_queue_start_tag(request_queue_t *q, struct request *rq) blk_queue_start_tag(struct request_queue *q, struct request *rq)
Start tagged operation for this request. A free tag number between Start tagged operation for this request. A free tag number between
0 and 'depth' is assigned to the request (rq->tag holds this number), 0 and 'depth' is assigned to the request (rq->tag holds this number),
...@@ -762,7 +762,7 @@ normal operations are: ...@@ -762,7 +762,7 @@ normal operations are:
for this queue is already achieved (or if the tag wasn't started for for this queue is already achieved (or if the tag wasn't started for
some other reason), 1 is returned. Otherwise 0 is returned. some other reason), 1 is returned. Otherwise 0 is returned.
blk_queue_end_tag(request_queue_t *q, struct request *rq) blk_queue_end_tag(struct request_queue *q, struct request *rq)
End tagged operation on this request. 'rq' is removed from the internal End tagged operation on this request. 'rq' is removed from the internal
book keeping structures. book keeping structures.
...@@ -781,7 +781,7 @@ queue. For instance, on IDE any tagged request error needs to clear both ...@@ -781,7 +781,7 @@ queue. For instance, on IDE any tagged request error needs to clear both
the hardware and software block queue and enable the driver to sanely restart the hardware and software block queue and enable the driver to sanely restart
all the outstanding requests. There's a third helper to do that: all the outstanding requests. There's a third helper to do that:
blk_queue_invalidate_tags(request_queue_t *q) blk_queue_invalidate_tags(struct request_queue *q)
Clear the internal block tag queue and re-add all the pending requests Clear the internal block tag queue and re-add all the pending requests
to the request queue. The driver will receive them again on the to the request queue. The driver will receive them again on the
......
...@@ -83,6 +83,6 @@ struct bio *bio DBI First bio in request ...@@ -83,6 +83,6 @@ struct bio *bio DBI First bio in request
struct bio *biotail DBI Last bio in request struct bio *biotail DBI Last bio in request
request_queue_t *q DB Request queue this request belongs to struct request_queue *q DB Request queue this request belongs to
struct request_list *rl B Request list this request came from struct request_list *rl B Request list this request came from
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
*.moc *.moc
*.mod.c *.mod.c
*.o *.o
*.o.*
*.orig *.orig
*.out *.out
*.pdf *.pdf
...@@ -163,6 +164,8 @@ raid6tables.c ...@@ -163,6 +164,8 @@ raid6tables.c
relocs relocs
series series
setup setup
setup.bin
setup.elf
sim710_d.h* sim710_d.h*
sImage sImage
sm_tbl* sm_tbl*
......
...@@ -211,22 +211,6 @@ Who: Richard Purdie <rpurdie@rpsys.net> ...@@ -211,22 +211,6 @@ Who: Richard Purdie <rpurdie@rpsys.net>
--------------------------- ---------------------------
What: read_dev_chars(), read_conf_data{,_lpm}() (s390 common I/O layer)
When: December 2007
Why: These functions are a leftover from 2.4 times. They have several
problems:
- Duplication of checks that are done in the device driver's
interrupt handler
- common I/O layer can't do device specific error recovery
- device driver can't be notified for conditions happening during
execution of the function
Device drivers should issue the read device characteristics and read
configuration data ccws and do the appropriate error handling
themselves.
Who: Cornelia Huck <cornelia.huck@de.ibm.com>
---------------------------
What: i2c-ixp2000, i2c-ixp4xx and scx200_i2c drivers What: i2c-ixp2000, i2c-ixp4xx and scx200_i2c drivers
When: September 2007 When: September 2007
Why: Obsolete. The new i2c-gpio driver replaces all hardware-specific Why: Obsolete. The new i2c-gpio driver replaces all hardware-specific
......
Macintosh HFSPlus Filesystem for Linux
======================================
HFSPlus is a filesystem first introduced in MacOS 8.1.
HFSPlus has several extensions to HFS, including 32-bit allocation
blocks, 255-character unicode filenames, and file sizes of 2^63 bytes.
Mount options
=============
When mounting an HFSPlus filesystem, the following options are accepted:
creator=cccc, type=cccc
Specifies the creator/type values as shown by the MacOS finder
used for creating new files. Default values: '????'.
uid=n, gid=n
Specifies the user/group that owns all files on the filesystem
that have uninitialized permissions structures.
Default: user/group id of the mounting process.
umask=n
Specifies the umask (in octal) used for files and directories
that have uninitialized permissions structures.
Default: umask of the mounting process.
session=n
Select the CDROM session to mount as HFSPlus filesystem. Defaults to
leaving that decision to the CDROM driver. This option will fail
with anything but a CDROM as underlying devices.
part=n
Select partition number n from the devices. This option only makes
sense for CDROMs because they can't be partitioned under Linux.
For disk devices the generic partition parsing code does this
for us. Defaults to not parsing the partition table at all.
decompose
Decompose file name characters.
nodecompose
Do not decompose file name characters.
force
Used to force write access to volumes that are marked as journalled
or locked. Use at your own risk.
nls=cccc
Encoding to use when presenting file names.
References
==========
kernel source: <file:fs/hfsplus>
Apple Technote 1150 http://developer.apple.com/technotes/tn/tn1150.html
...@@ -148,7 +148,7 @@ pin ... that won't always match the specified output value, because of ...@@ -148,7 +148,7 @@ pin ... that won't always match the specified output value, because of
issues including wire-OR and output latencies. issues including wire-OR and output latencies.
The get/set calls have no error returns because "invalid GPIO" should have The get/set calls have no error returns because "invalid GPIO" should have
been reported earlier in gpio_set_direction(). However, note that not all been reported earlier from gpio_direction_*(). However, note that not all
platforms can read the value of output pins; those that can't should always platforms can read the value of output pins; those that can't should always
return zero. Also, using these calls for GPIOs that can't safely be accessed return zero. Also, using these calls for GPIOs that can't safely be accessed
without sleeping (see below) is an error. without sleeping (see below) is an error.
...@@ -239,7 +239,7 @@ map between them using calls like: ...@@ -239,7 +239,7 @@ map between them using calls like:
Those return either the corresponding number in the other namespace, or Those return either the corresponding number in the other namespace, or
else a negative errno code if the mapping can't be done. (For example, else a negative errno code if the mapping can't be done. (For example,
some GPIOs can't used as IRQs.) It is an unchecked error to use a GPIO some GPIOs can't used as IRQs.) It is an unchecked error to use a GPIO
number that hasn't been marked as an input using gpio_set_direction(), or number that wasn't set up as an input using gpio_direction_input(), or
to use an IRQ number that didn't originally come from gpio_to_irq(). to use an IRQ number that didn't originally come from gpio_to_irq().
These two mapping calls are expected to cost on the order of a single These two mapping calls are expected to cost on the order of a single
......
...@@ -5,7 +5,7 @@ for the 8254 and Real Time Clock (RTC) periodic timer functionality. ...@@ -5,7 +5,7 @@ for the 8254 and Real Time Clock (RTC) periodic timer functionality.
Each HPET can have up to 32 timers. It is possible to configure the Each HPET can have up to 32 timers. It is possible to configure the
first two timers as legacy replacements for 8254 and RTC periodic timers. first two timers as legacy replacements for 8254 and RTC periodic timers.
A specification done by Intel and Microsoft can be found at A specification done by Intel and Microsoft can be found at
<http://www.intel.com/hardwaredesign/hpetspec.htm>. <http://www.intel.com/technology/architecture/hpetspec.htm>.
The driver supports detection of HPET driver allocation and initialization The driver supports detection of HPET driver allocation and initialization
of the HPET before the driver module_init routine is called. This enables of the HPET before the driver module_init routine is called. This enables
......
...@@ -6,13 +6,13 @@ Supported chips: ...@@ -6,13 +6,13 @@ Supported chips:
Prefix: 'adm1030' Prefix: 'adm1030'
Addresses scanned: I2C 0x2c to 0x2e Addresses scanned: I2C 0x2c to 0x2e
Datasheet: Publicly available at the Analog Devices website Datasheet: Publicly available at the Analog Devices website
http://products.analog.com/products/info.asp?product=ADM1030 http://www.analog.com/en/prod/0%2C2877%2CADM1030%2C00.html
* Analog Devices ADM1031 * Analog Devices ADM1031
Prefix: 'adm1031' Prefix: 'adm1031'
Addresses scanned: I2C 0x2c to 0x2e Addresses scanned: I2C 0x2c to 0x2e
Datasheet: Publicly available at the Analog Devices website Datasheet: Publicly available at the Analog Devices website
http://products.analog.com/products/info.asp?product=ADM1031 http://www.analog.com/en/prod/0%2C2877%2CADM1031%2C00.html
Authors: Authors:
Alexandre d'Alton <alex@alexdalton.org> Alexandre d'Alton <alex@alexdalton.org>
......
Kernel driver thmc50
=====================
Supported chips:
* Analog Devices ADM1022
Prefix: 'adm1022'
Addresses scanned: I2C 0x2c - 0x2e
Datasheet: http://www.analog.com/en/prod/0,2877,ADM1022,00.html
* Texas Instruments THMC50
Prefix: 'thmc50'
Addresses scanned: I2C 0x2c - 0x2e
Datasheet: http://focus.ti.com/docs/prod/folders/print/thmc50.html
Author: Krzysztof Helt <krzysztof.h1@wp.pl>
This driver was derived from the 2.4 kernel thmc50.c source file.
Credits:
thmc50.c (2.4 kernel):
Frodo Looijaard <frodol@dds.nl>
Philip Edelbrock <phil@netroedge.com>
Module Parameters
-----------------
* adm1022_temp3: short array
List of adapter,address pairs to force chips into ADM1022 mode with
second remote temperature. This does not work for original THMC50 chips.
Description
-----------
The THMC50 implements: an internal temperature sensor, support for an
external diode-type temperature sensor (compatible w/ the diode sensor inside
many processors), and a controllable fan/analog_out DAC. For the temperature
sensors, limits can be set through the appropriate Overtemperature Shutdown
register and Hysteresis register. Each value can be set and read to half-degree
accuracy. An alarm is issued (usually to a connected LM78) when the
temperature gets higher then the Overtemperature Shutdown value; it stays on
until the temperature falls below the Hysteresis value. All temperatures are in
degrees Celsius, and are guaranteed within a range of -55 to +125 degrees.
The THMC50 only updates its values each 1.5 seconds; reading it more often
will do no harm, but will return 'old' values.
The THMC50 is usually used in combination with LM78-like chips, to measure
the temperature of the processor(s).
The ADM1022 works the same as THMC50 but it is faster (5 Hz instead of
1 Hz for THMC50). It can be also put in a new mode to handle additional
remote temperature sensor. The driver use the mode set by BIOS by default.
In case the BIOS is broken and the mode is set incorrectly, you can force
the mode with additional remote temperature with adm1022_temp3 parameter.
A typical symptom of wrong setting is a fan forced to full speed.
Driver Features
---------------
The driver provides up to three temperatures:
temp1 -- internal
temp2 -- remote
temp3 -- 2nd remote only for ADM1022
pwm1 -- fan speed (0 = stop, 255 = full)
pwm1_mode -- always 0 (DC mode)
The value of 0 for pwm1 also forces FAN_OFF signal from the chip,
so it stops fans even if the value 0 into the ANALOG_OUT register does not.
The driver was tested on Compaq AP550 with two ADM1022 chips (one works
in the temp3 mode), five temperature readings and two fans.
...@@ -79,7 +79,7 @@ Field 8 -- # of milliseconds spent writing ...@@ -79,7 +79,7 @@ Field 8 -- # of milliseconds spent writing
measured from __make_request() to end_that_request_last()). measured from __make_request() to end_that_request_last()).
Field 9 -- # of I/Os currently in progress Field 9 -- # of I/Os currently in progress
The only field that should go to zero. Incremented as requests are The only field that should go to zero. Incremented as requests are
given to appropriate request_queue_t and decremented as they finish. given to appropriate struct request_queue and decremented as they finish.
Field 10 -- # of milliseconds spent doing I/Os Field 10 -- # of milliseconds spent doing I/Os
This field is increases so long as field 9 is nonzero. This field is increases so long as field 9 is nonzero.
Field 11 -- weighted # of milliseconds spent doing I/Os Field 11 -- weighted # of milliseconds spent doing I/Os
......
NOTE: NOTE:
This is Japanese translated version of "Documentation/HOWTO". This is a version of Documentation/HOWTO translated into Japanese.
This one is maintained by Tsugikazu Shibata <tshibata@ab.jp.nec.com> This document is maintained by Tsugikazu Shibata <tshibata@ab.jp.nec.com>
and JF Project team <www.linux.or.jp/JF>. and the JF Project team <www.linux.or.jp/JF>.
If you find difference with original file or problem in translation, If you find any difference between this document and the original file
please contact maintainer of this file or JF project. or a problem with the translation,
please contact the maintainer of this file or JF project.
Please also note that purpose of this file is easier to read for non
English natives and not to be intended to fork. So, if you have any Please also note that the purpose of this file is to be easier to read
comments or updates of this file, please try to update Original(English) for non English (read: Japanese) speakers and is not intended as a
file at first. fork. So if you have any comments or updates for this file, please try
to update the original English file first.
Last Updated: 2007/06/04
Last Updated: 2007/07/18
================================== ==================================
これは、 これは、
linux-2.6.21/Documentation/HOWTO linux-2.6.22/Documentation/HOWTO
の和訳です。 の和訳です。
翻訳団体: JF プロジェクト < http://www.linux.or.jp/JF/ > 翻訳団体: JF プロジェクト < http://www.linux.or.jp/JF/ >
翻訳日: 2007/06/04 翻訳日: 2007/07/16
翻訳者: Tsugikazu Shibata <tshibata at ab dot jp dot nec dot com> 翻訳者: Tsugikazu Shibata <tshibata at ab dot jp dot nec dot com>
校正者: 松倉さん <nbh--mats at nifty dot com> 校正者: 松倉さん <nbh--mats at nifty dot com>
小林 雅典さん (Masanori Kobayasi) <zap03216 at nifty dot ne dot jp> 小林 雅典さん (Masanori Kobayasi) <zap03216 at nifty dot ne dot jp>
...@@ -52,6 +53,7 @@ Linux カーネル開発コミュニティと共に活動するやり方を学 ...@@ -52,6 +53,7 @@ Linux カーネル開発コミュニティと共に活動するやり方を学
また、このコミュニティがなぜ今うまくまわっているのかという理由の一部も また、このコミュニティがなぜ今うまくまわっているのかという理由の一部も
説明しようと試みています。 説明しようと試みています。
カーネルは 少量のアーキテクチャ依存部分がアセンブリ言語で書かれている カーネルは 少量のアーキテクチャ依存部分がアセンブリ言語で書かれている
以外は大部分は C 言語で書かれています。C言語をよく理解していることはカー 以外は大部分は C 言語で書かれています。C言語をよく理解していることはカー
ネル開発者には必要です。アーキテクチャ向けの低レベル部分の開発をするの ネル開発者には必要です。アーキテクチャ向けの低レベル部分の開発をするの
...@@ -141,6 +143,7 @@ Linux カーネルソースツリーは幅広い範囲のドキュメントを ...@@ -141,6 +143,7 @@ Linux カーネルソースツリーは幅広い範囲のドキュメントを
これらのルールに従えばうまくいくことを保証することではありません これらのルールに従えばうまくいくことを保証することではありません
が (すべてのパッチは内容とスタイルについて精査を受けるので)、 が (すべてのパッチは内容とスタイルについて精査を受けるので)、
ルールに従わなければ間違いなくうまくいかないでしょう。 ルールに従わなければ間違いなくうまくいかないでしょう。
この他にパッチを作る方法についてのよくできた記述は- この他にパッチを作る方法についてのよくできた記述は-
"The Perfect Patch" "The Perfect Patch"
...@@ -360,44 +363,42 @@ linux-kernel メーリングリストで収集された多数のパッチと同 ...@@ -360,44 +363,42 @@ linux-kernel メーリングリストで収集された多数のパッチと同
git ツリー- git ツリー-
- Kbuild の開発ツリー、Sam Ravnborg <sam@ravnborg.org> - Kbuild の開発ツリー、Sam Ravnborg <sam@ravnborg.org>
kernel.org:/pub/scm/linux/kernel/git/sam/kbuild.git git.kernel.org:/pub/scm/linux/kernel/git/sam/kbuild.git
- ACPI の開発ツリー、 Len Brown <len.brown@intel.com> - ACPI の開発ツリー、 Len Brown <len.brown@intel.com>
kernel.org:/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6.git git.kernel.org:/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6.git
- Block の開発ツリー、Jens Axboe <axboe@suse.de> - Block の開発ツリー、Jens Axboe <axboe@suse.de>
kernel.org:/pub/scm/linux/kernel/git/axboe/linux-2.6-block.git git.kernel.org:/pub/scm/linux/kernel/git/axboe/linux-2.6-block.git
- DRM の開発ツリー、Dave Airlie <airlied@linux.ie> - DRM の開発ツリー、Dave Airlie <airlied@linux.ie>
kernel.org:/pub/scm/linux/kernel/git/airlied/drm-2.6.git git.kernel.org:/pub/scm/linux/kernel/git/airlied/drm-2.6.git
- ia64 の開発ツリー、Tony Luck <tony.luck@intel.com> - ia64 の開発ツリー、Tony Luck <tony.luck@intel.com>
kernel.org:/pub/scm/linux/kernel/git/aegl/linux-2.6.git git.kernel.org:/pub/scm/linux/kernel/git/aegl/linux-2.6.git
- ieee1394 の開発ツリー、Jody McIntyre <scjody@modernduck.com>
kernel.org:/pub/scm/linux/kernel/git/scjody/ieee1394.git
- infiniband, Roland Dreier <rolandd@cisco.com> - infiniband, Roland Dreier <rolandd@cisco.com>
kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git git.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git
- libata, Jeff Garzik <jgarzik@pobox.com> - libata, Jeff Garzik <jgarzik@pobox.com>
kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev.git git.kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev.git
- ネットワークドライバ, Jeff Garzik <jgarzik@pobox.com> - ネットワークドライバ, Jeff Garzik <jgarzik@pobox.com>
kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6.git git.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6.git
- pcmcia, Dominik Brodowski <linux@dominikbrodowski.net> - pcmcia, Dominik Brodowski <linux@dominikbrodowski.net>
kernel.org:/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git git.kernel.org:/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git
- SCSI, James Bottomley <James.Bottomley@SteelEye.com> - SCSI, James Bottomley <James.Bottomley@SteelEye.com>
kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git git.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git
その他の git カーネルツリーは http://kernel.org/git に一覧表がありま
す。
quilt ツリー- quilt ツリー-
- USB, PCI ドライバコアと I2C, Greg Kroah-Hartman <gregkh@suse.de> - USB, PCI ドライバコアと I2C, Greg Kroah-Hartman <gregkh@suse.de>
kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/ kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
- x86-64 と i386 の仲間 Andi Kleen <ak@suse.de>
その他のカーネルツリーは http://git.kernel.org/ と MAINTAINERS ファ
イルに一覧表があります。
バグレポート バグレポート
------------- -------------
...@@ -508,6 +509,7 @@ MAINTAINERS ファイルにリストがありますので参照してくださ ...@@ -508,6 +509,7 @@ MAINTAINERS ファイルにリストがありますので参照してくださ
せん*。単に自分のパッチに対して指摘された問題を全て修正して再送すれば せん*。単に自分のパッチに対して指摘された問題を全て修正して再送すれば
いいのです。 いいのです。
カーネルコミュニティと企業組織のちがい カーネルコミュニティと企業組織のちがい
----------------------------------------------------------------- -----------------------------------------------------------------
...@@ -577,6 +579,7 @@ Linux カーネルコミュニティは、一度に大量のコードの塊を ...@@ -577,6 +579,7 @@ Linux カーネルコミュニティは、一度に大量のコードの塊を
かし、500行のパッチは、正しいことをレビューするのに数時間かかるかも かし、500行のパッチは、正しいことをレビューするのに数時間かかるかも
しれません(時間はパッチのサイズなどにより指数関数に比例してかかりま しれません(時間はパッチのサイズなどにより指数関数に比例してかかりま
す) す)
小さいパッチは何かあったときにデバッグもとても簡単になります。パッ 小さいパッチは何かあったときにデバッグもとても簡単になります。パッ
チを1個1個取り除くのは、とても大きなパッチを当てた後に(かつ、何かお チを1個1個取り除くのは、とても大きなパッチを当てた後に(かつ、何かお
かしくなった後で)解剖するのに比べればとても簡単です。 かしくなった後で)解剖するのに比べればとても簡単です。
...@@ -591,6 +594,7 @@ Linux カーネルコミュニティは、一度に大量のコードの塊を ...@@ -591,6 +594,7 @@ Linux カーネルコミュニティは、一度に大量のコードの塊を
う。先生は簡潔な最高の解をみたいのです。良い生徒はこれを知って う。先生は簡潔な最高の解をみたいのです。良い生徒はこれを知って
おり、そして最終解の前の中間作業を提出することは決してないので おり、そして最終解の前の中間作業を提出することは決してないので
す" す"
カーネル開発でもこれは同じです。メンテナー達とレビューア達は、 カーネル開発でもこれは同じです。メンテナー達とレビューア達は、
問題を解決する解の背後になる思考プロセスをみたいとは思いません。 問題を解決する解の背後になる思考プロセスをみたいとは思いません。
彼らは単純であざやかな解決方法をみたいのです。 彼らは単純であざやかな解決方法をみたいのです。
......
NOTE: NOTE:
This is a Japanese translated version of This is a version of Documentation/stable_api_nonsense.txt into Japanese.
"Documentation/stable_api_nonsense.txt". This document is maintained by IKEDA, Munehiro <m-ikeda@ds.jp.nec.com>
This one is maintained by and the JF Project team <http://www.linux.or.jp/JF/>.
IKEDA, Munehiro <m-ikeda@ds.jp.nec.com> If you find any difference between this document and the original file
and JF Project team <http://www.linux.or.jp/JF/>. or a problem with the translation,
If you find difference with original file or problem in translation,
please contact the maintainer of this file or JF project. please contact the maintainer of this file or JF project.
Please also note that purpose of this file is easier to read for non Please also note that the purpose of this file is to be easier to read
English natives and not to be intended to fork. So, if you have any for non English (read: Japanese) speakers and is not intended as a
comments or updates of this file, please try to update fork. So if you have any comments or updates of this file, please try
Original(English) file at first. to update the original English file first.
Last Updated: 2007/07/18
================================== ==================================
これは、 これは、
linux-2.6.22-rc4/Documentation/stable_api_nonsense.txt の和訳 linux-2.6.22-rc4/Documentation/stable_api_nonsense.txt の和訳
......
...@@ -30,6 +30,7 @@ the beginning of each description states the restrictions within which a ...@@ -30,6 +30,7 @@ the beginning of each description states the restrictions within which a
parameter is applicable: parameter is applicable:
ACPI ACPI support is enabled. ACPI ACPI support is enabled.
AGP AGP (Accelerated Graphics Port) is enabled.
ALSA ALSA sound support is enabled. ALSA ALSA sound support is enabled.
APIC APIC support is enabled. APIC APIC support is enabled.
APM Advanced Power Management support is enabled. APM Advanced Power Management support is enabled.
...@@ -40,7 +41,6 @@ parameter is applicable: ...@@ -40,7 +41,6 @@ parameter is applicable:
EIDE EIDE/ATAPI support is enabled. EIDE EIDE/ATAPI support is enabled.
FB The frame buffer device is enabled. FB The frame buffer device is enabled.
HW Appropriate hardware is enabled. HW Appropriate hardware is enabled.
IA-32 IA-32 aka i386 architecture is enabled.
IA-64 IA-64 architecture is enabled. IA-64 IA-64 architecture is enabled.
IOSCHED More than one I/O scheduler is enabled. IOSCHED More than one I/O scheduler is enabled.
IP_PNP IP DHCP, BOOTP, or RARP is enabled. IP_PNP IP DHCP, BOOTP, or RARP is enabled.
...@@ -57,14 +57,14 @@ parameter is applicable: ...@@ -57,14 +57,14 @@ parameter is applicable:
MDA MDA console support is enabled. MDA MDA console support is enabled.
MOUSE Appropriate mouse support is enabled. MOUSE Appropriate mouse support is enabled.
MSI Message Signaled Interrupts (PCI). MSI Message Signaled Interrupts (PCI).
MTD MTD support is enabled. MTD MTD (Memory Technology Device) support is enabled.
NET Appropriate network support is enabled. NET Appropriate network support is enabled.
NUMA NUMA support is enabled. NUMA NUMA support is enabled.
GENERIC_TIME The generic timeofday code is enabled. GENERIC_TIME The generic timeofday code is enabled.
NFS Appropriate NFS support is enabled. NFS Appropriate NFS support is enabled.
OSS OSS sound support is enabled. OSS OSS sound support is enabled.
PV_OPS A paravirtualized kernel PV_OPS A paravirtualized kernel is enabled.
PARIDE The ParIDE subsystem is enabled. PARIDE The ParIDE (parallel port IDE) subsystem is enabled.
PARISC The PA-RISC architecture is enabled. PARISC The PA-RISC architecture is enabled.
PCI PCI bus support is enabled. PCI PCI bus support is enabled.
PCMCIA The PCMCIA subsystem is enabled. PCMCIA The PCMCIA subsystem is enabled.
...@@ -91,6 +91,7 @@ parameter is applicable: ...@@ -91,6 +91,7 @@ parameter is applicable:
VT Virtual terminal support is enabled. VT Virtual terminal support is enabled.
WDT Watchdog support is enabled. WDT Watchdog support is enabled.
XT IBM PC/XT MFM hard disk support is enabled. XT IBM PC/XT MFM hard disk support is enabled.
X86-32 X86-32, aka i386 architecture is enabled.
X86-64 X86-64 architecture is enabled. X86-64 X86-64 architecture is enabled.
More X86-64 boot options can be found in More X86-64 boot options can be found in
Documentation/x86_64/boot-options.txt . Documentation/x86_64/boot-options.txt .
...@@ -122,10 +123,6 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -122,10 +123,6 @@ and is between 256 and 4096 characters. It is defined in the file
./include/asm/setup.h as COMMAND_LINE_SIZE. ./include/asm/setup.h as COMMAND_LINE_SIZE.
53c7xx= [HW,SCSI] Amiga SCSI controllers
See header of drivers/scsi/53c7xx.c.
See also Documentation/scsi/ncr53c7xx.txt.
acpi= [HW,ACPI,X86-64,i386] acpi= [HW,ACPI,X86-64,i386]
Advanced Configuration and Power Interface Advanced Configuration and Power Interface
Format: { force | off | ht | strict | noirq } Format: { force | off | ht | strict | noirq }
...@@ -222,11 +219,17 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -222,11 +219,17 @@ and is between 256 and 4096 characters. It is defined in the file
acpi_fake_ecdt [HW,ACPI] Workaround failure due to BIOS lacking ECDT acpi_fake_ecdt [HW,ACPI] Workaround failure due to BIOS lacking ECDT
acpi_pm_good [IA-32,X86-64] acpi_pm_good [X86-32,X86-64]
Override the pmtimer bug detection: force the kernel Override the pmtimer bug detection: force the kernel
to assume that this machine's pmtimer latches its value to assume that this machine's pmtimer latches its value
and always returns good values. and always returns good values.
agp= [AGP]
{ off | try_unsupported }
off: disable AGP support
try_unsupported: try to drive unsupported chipsets
(may crash computer or cause data corruption)
enable_timer_pin_1 [i386,x86-64] enable_timer_pin_1 [i386,x86-64]
Enable PIN 1 of APIC timer Enable PIN 1 of APIC timer
Can be useful to work around chipset bugs Can be useful to work around chipset bugs
...@@ -279,7 +282,8 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -279,7 +282,8 @@ and is between 256 and 4096 characters. It is defined in the file
not play well with APC CPU idle - disable it if you have not play well with APC CPU idle - disable it if you have
APC and your system crashes randomly. APC and your system crashes randomly.
apic= [APIC,i386] Change the output verbosity whilst booting apic= [APIC,i386] Advanced Programmable Interrupt Controller
Change the output verbosity whilst booting
Format: { quiet (default) | verbose | debug } Format: { quiet (default) | verbose | debug }
Change the amount of debugging information output Change the amount of debugging information output
when initialising the APIC and IO-APIC components. when initialising the APIC and IO-APIC components.
...@@ -353,7 +357,7 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -353,7 +357,7 @@ and is between 256 and 4096 characters. It is defined in the file
c101= [NET] Moxa C101 synchronous serial card c101= [NET] Moxa C101 synchronous serial card
cachesize= [BUGS=IA-32] Override level 2 CPU cache size detection. cachesize= [BUGS=X86-32] Override level 2 CPU cache size detection.
Sometimes CPU hardware bugs make them report the cache Sometimes CPU hardware bugs make them report the cache
size incorrectly. The kernel will attempt work arounds size incorrectly. The kernel will attempt work arounds
to fix known problems, but for some CPUs it is not to fix known problems, but for some CPUs it is not
...@@ -372,7 +376,7 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -372,7 +376,7 @@ and is between 256 and 4096 characters. It is defined in the file
Value can be changed at runtime via Value can be changed at runtime via
/selinux/checkreqprot. /selinux/checkreqprot.
clock= [BUGS=IA-32, HW] gettimeofday clocksource override. clock= [BUGS=X86-32, HW] gettimeofday clocksource override.
[Deprecated] [Deprecated]
Forces specified clocksource (if available) to be used Forces specified clocksource (if available) to be used
when calculating gettimeofday(). If specified when calculating gettimeofday(). If specified
...@@ -390,7 +394,7 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -390,7 +394,7 @@ and is between 256 and 4096 characters. It is defined in the file
[ARM] imx_timer1,OSTS,netx_timer,mpu_timer2, [ARM] imx_timer1,OSTS,netx_timer,mpu_timer2,
pxa_timer,timer3,32k_counter,timer0_1 pxa_timer,timer3,32k_counter,timer0_1
[AVR32] avr32 [AVR32] avr32
[IA-32] pit,hpet,tsc,vmi-timer; [X86-32] pit,hpet,tsc,vmi-timer;
scx200_hrt on Geode; cyclone on IBM x440 scx200_hrt on Geode; cyclone on IBM x440
[MIPS] MIPS [MIPS] MIPS
[PARISC] cr16 [PARISC] cr16
...@@ -410,7 +414,7 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -410,7 +414,7 @@ and is between 256 and 4096 characters. It is defined in the file
over the 8254 in addition to over the IO-APIC. The over the 8254 in addition to over the IO-APIC. The
kernel tries to set a sensible default. kernel tries to set a sensible default.
hpet= [IA-32,HPET] option to disable HPET and use PIT. hpet= [X86-32,HPET] option to disable HPET and use PIT.
Format: disable Format: disable
com20020= [HW,NET] ARCnet - COM20020 chipset com20020= [HW,NET] ARCnet - COM20020 chipset
...@@ -547,7 +551,7 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -547,7 +551,7 @@ and is between 256 and 4096 characters. It is defined in the file
dtc3181e= [HW,SCSI] dtc3181e= [HW,SCSI]
earlyprintk= [IA-32,X86-64,SH] earlyprintk= [X86-32,X86-64,SH]
earlyprintk=vga earlyprintk=vga
earlyprintk=serial[,ttySn[,baudrate]] earlyprintk=serial[,ttySn[,baudrate]]
...@@ -585,7 +589,7 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -585,7 +589,7 @@ and is between 256 and 4096 characters. It is defined in the file
eisa_irq_edge= [PARISC,HW] eisa_irq_edge= [PARISC,HW]
See header of drivers/parisc/eisa.c. See header of drivers/parisc/eisa.c.
elanfreq= [IA-32] elanfreq= [X86-32]
See comment before function elanfreq_setup() in See comment before function elanfreq_setup() in
arch/i386/kernel/cpu/cpufreq/elanfreq.c. arch/i386/kernel/cpu/cpufreq/elanfreq.c.
...@@ -594,7 +598,7 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -594,7 +598,7 @@ and is between 256 and 4096 characters. It is defined in the file
See Documentation/block/as-iosched.txt and See Documentation/block/as-iosched.txt and
Documentation/block/deadline-iosched.txt for details. Documentation/block/deadline-iosched.txt for details.
elfcorehdr= [IA-32, X86_64] elfcorehdr= [X86-32, X86_64]
Specifies physical address of start of kernel core Specifies physical address of start of kernel core
image elf header. Generally kexec loader will image elf header. Generally kexec loader will
pass this option to capture kernel. pass this option to capture kernel.
...@@ -676,7 +680,7 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -676,7 +680,7 @@ and is between 256 and 4096 characters. It is defined in the file
hisax= [HW,ISDN] hisax= [HW,ISDN]
See Documentation/isdn/README.HiSax. See Documentation/isdn/README.HiSax.
hugepages= [HW,IA-32,IA-64] Maximal number of HugeTLB pages. hugepages= [HW,X86-32,IA-64] Maximal number of HugeTLB pages.
i8042.direct [HW] Put keyboard port into non-translated mode i8042.direct [HW] Put keyboard port into non-translated mode
i8042.dumbkbd [HW] Pretend that controller can only read data from i8042.dumbkbd [HW] Pretend that controller can only read data from
...@@ -768,7 +772,8 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -768,7 +772,8 @@ and is between 256 and 4096 characters. It is defined in the file
See Documentation/nfsroot.txt. See Documentation/nfsroot.txt.
ip2= [HW] Set IO/IRQ pairs for up to 4 IntelliPort boards ip2= [HW] Set IO/IRQ pairs for up to 4 IntelliPort boards
See comment before ip2_setup() in drivers/char/ip2.c. See comment before ip2_setup() in
drivers/char/ip2/ip2base.c.
ips= [HW,SCSI] Adaptec / IBM ServeRAID controller ips= [HW,SCSI] Adaptec / IBM ServeRAID controller
See header of drivers/scsi/ips.c. See header of drivers/scsi/ips.c.
...@@ -817,7 +822,7 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -817,7 +822,7 @@ and is between 256 and 4096 characters. It is defined in the file
js= [HW,JOY] Analog joystick js= [HW,JOY] Analog joystick
See Documentation/input/joystick.txt. See Documentation/input/joystick.txt.
kernelcore=nn[KMG] [KNL,IA-32,IA-64,PPC,X86-64] This parameter kernelcore=nn[KMG] [KNL,X86-32,IA-64,PPC,X86-64] This parameter
specifies the amount of memory usable by the kernel specifies the amount of memory usable by the kernel
for non-movable allocations. The requested amount is for non-movable allocations. The requested amount is
spread evenly throughout all nodes in the system. The spread evenly throughout all nodes in the system. The
...@@ -833,7 +838,7 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -833,7 +838,7 @@ and is between 256 and 4096 characters. It is defined in the file
use the HighMem zone if it exists, and the Normal use the HighMem zone if it exists, and the Normal
zone if it does not. zone if it does not.
movablecore=nn[KMG] [KNL,IA-32,IA-64,PPC,X86-64] This parameter movablecore=nn[KMG] [KNL,X86-32,IA-64,PPC,X86-64] This parameter
is similar to kernelcore except it specifies the is similar to kernelcore except it specifies the
amount of memory used for migratable allocations. amount of memory used for migratable allocations.
If both kernelcore and movablecore is specified, If both kernelcore and movablecore is specified,
...@@ -845,28 +850,20 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -845,28 +850,20 @@ and is between 256 and 4096 characters. It is defined in the file
keepinitrd [HW,ARM] keepinitrd [HW,ARM]
kstack=N [IA-32,X86-64] Print N words from the kernel stack kstack=N [X86-32,X86-64] Print N words from the kernel stack
in oops dumps. in oops dumps.
l2cr= [PPC] l2cr= [PPC]
lapic [IA-32,APIC] Enable the local APIC even if BIOS lapic [X86-32,APIC] Enable the local APIC even if BIOS
disabled it. disabled it.
lapic_timer_c2_ok [IA-32,x86-64,APIC] trust the local apic timer in lapic_timer_c2_ok [X86-32,x86-64,APIC] trust the local apic timer in
C2 power state. C2 power state.
lasi= [HW,SCSI] PARISC LASI driver for the 53c700 chip lasi= [HW,SCSI] PARISC LASI driver for the 53c700 chip
Format: addr:<io>,irq:<irq> Format: addr:<io>,irq:<irq>
legacy_serial.force [HW,IA-32,X86-64]
Probe for COM ports at legacy addresses even
if PNPBIOS or ACPI should describe them. This
is for working around firmware defects.
llsc*= [IA64] See function print_params() in
arch/ia64/sn/kernel/llsc4.c.
load_ramdisk= [RAM] List of ramdisks to load from floppy load_ramdisk= [RAM] List of ramdisks to load from floppy
See Documentation/ramdisk.txt. See Documentation/ramdisk.txt.
...@@ -972,11 +969,11 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -972,11 +969,11 @@ and is between 256 and 4096 characters. It is defined in the file
[SCSI] Maximum number of LUNs received. [SCSI] Maximum number of LUNs received.
Should be between 1 and 16384. Should be between 1 and 16384.
mca-pentium [BUGS=IA-32] mca-pentium [BUGS=X86-32]
mcatest= [IA-64] mcatest= [IA-64]
mce [IA-32] Machine Check Exception mce [X86-32] Machine Check Exception
md= [HW] RAID subsystems devices and level md= [HW] RAID subsystems devices and level
See Documentation/md.txt. See Documentation/md.txt.
...@@ -988,14 +985,14 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -988,14 +985,14 @@ and is between 256 and 4096 characters. It is defined in the file
mem=nn[KMG] [KNL,BOOT] Force usage of a specific amount of memory mem=nn[KMG] [KNL,BOOT] Force usage of a specific amount of memory
Amount of memory to be used when the kernel is not able Amount of memory to be used when the kernel is not able
to see the whole system memory or for test. to see the whole system memory or for test.
[IA-32] Use together with memmap= to avoid physical [X86-32] Use together with memmap= to avoid physical
address space collisions. Without memmap= PCI devices address space collisions. Without memmap= PCI devices
could be placed at addresses belonging to unused RAM. could be placed at addresses belonging to unused RAM.
mem=nopentium [BUGS=IA-32] Disable usage of 4MB pages for kernel mem=nopentium [BUGS=X86-32] Disable usage of 4MB pages for kernel
memory. memory.
memmap=exactmap [KNL,IA-32,X86_64] Enable setting of an exact memmap=exactmap [KNL,X86-32,X86_64] Enable setting of an exact
E820 memory map, as specified by the user. E820 memory map, as specified by the user.
Such memmap=exactmap lines can be constructed based on Such memmap=exactmap lines can be constructed based on
BIOS output or other requirements. See the memmap=nn@ss BIOS output or other requirements. See the memmap=nn@ss
...@@ -1039,7 +1036,7 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -1039,7 +1036,7 @@ and is between 256 and 4096 characters. It is defined in the file
<name>,<region-number>[,<base>,<size>,<buswidth>,<altbuswidth>] <name>,<region-number>[,<base>,<size>,<buswidth>,<altbuswidth>]
mtdparts= [MTD] mtdparts= [MTD]
See drivers/mtd/cmdline.c. See drivers/mtd/cmdlinepart.c.
mtouchusb.raw_coordinates= mtouchusb.raw_coordinates=
[HW] Make the MicroTouch USB driver use raw coordinates [HW] Make the MicroTouch USB driver use raw coordinates
...@@ -1081,9 +1078,9 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -1081,9 +1078,9 @@ and is between 256 and 4096 characters. It is defined in the file
[NFS] set the maximum lifetime for idmapper cache [NFS] set the maximum lifetime for idmapper cache
entries. entries.
nmi_watchdog= [KNL,BUGS=IA-32] Debugging features for SMP kernels nmi_watchdog= [KNL,BUGS=X86-32] Debugging features for SMP kernels
no387 [BUGS=IA-32] Tells the kernel to use the 387 maths no387 [BUGS=X86-32] Tells the kernel to use the 387 maths
emulation library even if a 387 maths coprocessor emulation library even if a 387 maths coprocessor
is present. is present.
...@@ -1114,17 +1111,17 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -1114,17 +1111,17 @@ and is between 256 and 4096 characters. It is defined in the file
noexec [IA-64] noexec [IA-64]
noexec [IA-32,X86-64] noexec [X86-32,X86-64]
noexec=on: enable non-executable mappings (default) noexec=on: enable non-executable mappings (default)
noexec=off: disable nn-executable mappings noexec=off: disable nn-executable mappings
nofxsr [BUGS=IA-32] Disables x86 floating point extended nofxsr [BUGS=X86-32] Disables x86 floating point extended
register save and restore. The kernel will only save register save and restore. The kernel will only save
legacy floating-point registers on task switch. legacy floating-point registers on task switch.
nohlt [BUGS=ARM] nohlt [BUGS=ARM]
no-hlt [BUGS=IA-32] Tells the kernel that the hlt no-hlt [BUGS=X86-32] Tells the kernel that the hlt
instruction doesn't work correctly and not to instruction doesn't work correctly and not to
use it. use it.
...@@ -1139,12 +1136,12 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -1139,12 +1136,12 @@ and is between 256 and 4096 characters. It is defined in the file
Valid arguments: on, off Valid arguments: on, off
Default: on Default: on
noirqbalance [IA-32,SMP,KNL] Disable kernel irq balancing noirqbalance [X86-32,SMP,KNL] Disable kernel irq balancing
noirqdebug [IA-32] Disables the code which attempts to detect and noirqdebug [X86-32] Disables the code which attempts to detect and
disable unhandled interrupt sources. disable unhandled interrupt sources.
no_timer_check [IA-32,X86_64,APIC] Disables the code which tests for no_timer_check [X86-32,X86_64,APIC] Disables the code which tests for
broken timer IRQ sources. broken timer IRQ sources.
noisapnp [ISAPNP] Disables ISA PnP code. noisapnp [ISAPNP] Disables ISA PnP code.
...@@ -1156,20 +1153,20 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -1156,20 +1153,20 @@ and is between 256 and 4096 characters. It is defined in the file
nojitter [IA64] Disables jitter checking for ITC timers. nojitter [IA64] Disables jitter checking for ITC timers.
nolapic [IA-32,APIC] Do not enable or use the local APIC. nolapic [X86-32,APIC] Do not enable or use the local APIC.
nolapic_timer [IA-32,APIC] Do not use the local APIC timer. nolapic_timer [X86-32,APIC] Do not use the local APIC timer.
noltlbs [PPC] Do not use large page/tlb entries for kernel noltlbs [PPC] Do not use large page/tlb entries for kernel
lowmem mapping on PPC40x. lowmem mapping on PPC40x.
nomca [IA-64] Disable machine check abort handling nomca [IA-64] Disable machine check abort handling
nomce [IA-32] Machine Check Exception nomce [X86-32] Machine Check Exception
noreplace-paravirt [IA-32,PV_OPS] Don't patch paravirt_ops noreplace-paravirt [X86-32,PV_OPS] Don't patch paravirt_ops
noreplace-smp [IA-32,SMP] Don't replace SMP instructions noreplace-smp [X86-32,SMP] Don't replace SMP instructions
with UP alternatives with UP alternatives
noresidual [PPC] Don't use residual data on PReP machines. noresidual [PPC] Don't use residual data on PReP machines.
...@@ -1183,7 +1180,7 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -1183,7 +1180,7 @@ and is between 256 and 4096 characters. It is defined in the file
nosbagart [IA-64] nosbagart [IA-64]
nosep [BUGS=IA-32] Disables x86 SYSENTER/SYSEXIT support. nosep [BUGS=X86-32] Disables x86 SYSENTER/SYSEXIT support.
nosmp [SMP] Tells an SMP kernel to act as a UP kernel. nosmp [SMP] Tells an SMP kernel to act as a UP kernel.
...@@ -1191,7 +1188,7 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -1191,7 +1188,7 @@ and is between 256 and 4096 characters. It is defined in the file
nosync [HW,M68K] Disables sync negotiation for all devices. nosync [HW,M68K] Disables sync negotiation for all devices.
notsc [BUGS=IA-32] Disable Time Stamp Counter notsc [BUGS=X86-32] Disable Time Stamp Counter
nousb [USB] Disable the USB subsystem nousb [USB] Disable the USB subsystem
...@@ -1264,28 +1261,28 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -1264,28 +1261,28 @@ and is between 256 and 4096 characters. It is defined in the file
See also Documentation/paride.txt. See also Documentation/paride.txt.
pci=option[,option...] [PCI] various PCI subsystem options: pci=option[,option...] [PCI] various PCI subsystem options:
off [IA-32] don't probe for the PCI bus off [X86-32] don't probe for the PCI bus
bios [IA-32] force use of PCI BIOS, don't access bios [X86-32] force use of PCI BIOS, don't access
the hardware directly. Use this if your machine the hardware directly. Use this if your machine
has a non-standard PCI host bridge. has a non-standard PCI host bridge.
nobios [IA-32] disallow use of PCI BIOS, only direct nobios [X86-32] disallow use of PCI BIOS, only direct
hardware access methods are allowed. Use this hardware access methods are allowed. Use this
if you experience crashes upon bootup and you if you experience crashes upon bootup and you
suspect they are caused by the BIOS. suspect they are caused by the BIOS.
conf1 [IA-32] Force use of PCI Configuration conf1 [X86-32] Force use of PCI Configuration
Mechanism 1. Mechanism 1.
conf2 [IA-32] Force use of PCI Configuration conf2 [X86-32] Force use of PCI Configuration
Mechanism 2. Mechanism 2.
nommconf [IA-32,X86_64] Disable use of MMCONFIG for PCI nommconf [X86-32,X86_64] Disable use of MMCONFIG for PCI
Configuration Configuration
nomsi [MSI] If the PCI_MSI kernel config parameter is nomsi [MSI] If the PCI_MSI kernel config parameter is
enabled, this kernel boot option can be used to enabled, this kernel boot option can be used to
disable the use of MSI interrupts system-wide. disable the use of MSI interrupts system-wide.
nosort [IA-32] Don't sort PCI devices according to nosort [X86-32] Don't sort PCI devices according to
order given by the PCI BIOS. This sorting is order given by the PCI BIOS. This sorting is
done to get a device order compatible with done to get a device order compatible with
older kernels. older kernels.
biosirq [IA-32] Use PCI BIOS calls to get the interrupt biosirq [X86-32] Use PCI BIOS calls to get the interrupt
routing table. These calls are known to be buggy routing table. These calls are known to be buggy
on several machines and they hang the machine on several machines and they hang the machine
when used, but on other computers it's the only when used, but on other computers it's the only
...@@ -1293,32 +1290,32 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -1293,32 +1290,32 @@ and is between 256 and 4096 characters. It is defined in the file
this option if the kernel is unable to allocate this option if the kernel is unable to allocate
IRQs or discover secondary PCI buses on your IRQs or discover secondary PCI buses on your
motherboard. motherboard.
rom [IA-32] Assign address space to expansion ROMs. rom [X86-32] Assign address space to expansion ROMs.
Use with caution as certain devices share Use with caution as certain devices share
address decoders between ROMs and other address decoders between ROMs and other
resources. resources.
irqmask=0xMMMM [IA-32] Set a bit mask of IRQs allowed to be irqmask=0xMMMM [X86-32] Set a bit mask of IRQs allowed to be
assigned automatically to PCI devices. You can assigned automatically to PCI devices. You can
make the kernel exclude IRQs of your ISA cards make the kernel exclude IRQs of your ISA cards
this way. this way.
pirqaddr=0xAAAAA [IA-32] Specify the physical address pirqaddr=0xAAAAA [X86-32] Specify the physical address
of the PIRQ table (normally generated of the PIRQ table (normally generated
by the BIOS) if it is outside the by the BIOS) if it is outside the
F0000h-100000h range. F0000h-100000h range.
lastbus=N [IA-32] Scan all buses thru bus #N. Can be lastbus=N [X86-32] Scan all buses thru bus #N. Can be
useful if the kernel is unable to find your useful if the kernel is unable to find your
secondary buses and you want to tell it secondary buses and you want to tell it
explicitly which ones they are. explicitly which ones they are.
assign-busses [IA-32] Always assign all PCI bus assign-busses [X86-32] Always assign all PCI bus
numbers ourselves, overriding numbers ourselves, overriding
whatever the firmware may have done. whatever the firmware may have done.
usepirqmask [IA-32] Honor the possible IRQ mask stored usepirqmask [X86-32] Honor the possible IRQ mask stored
in the BIOS $PIR table. This is needed on in the BIOS $PIR table. This is needed on
some systems with broken BIOSes, notably some systems with broken BIOSes, notably
some HP Pavilion N5400 and Omnibook XE3 some HP Pavilion N5400 and Omnibook XE3
notebooks. This will have no effect if ACPI notebooks. This will have no effect if ACPI
IRQ routing is enabled. IRQ routing is enabled.
noacpi [IA-32] Do not use ACPI for IRQ routing noacpi [X86-32] Do not use ACPI for IRQ routing
or for PCI scanning. or for PCI scanning.
routeirq Do IRQ routing for all PCI devices. routeirq Do IRQ routing for all PCI devices.
This is normally done in pci_enable_device(), This is normally done in pci_enable_device(),
...@@ -1467,13 +1464,13 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -1467,13 +1464,13 @@ and is between 256 and 4096 characters. It is defined in the file
Run specified binary instead of /init from the ramdisk, Run specified binary instead of /init from the ramdisk,
used for early userspace startup. See initrd. used for early userspace startup. See initrd.
reboot= [BUGS=IA-32,BUGS=ARM,BUGS=IA-64] Rebooting mode reboot= [BUGS=X86-32,BUGS=ARM,BUGS=IA-64] Rebooting mode
Format: <reboot_mode>[,<reboot_mode2>[,...]] Format: <reboot_mode>[,<reboot_mode2>[,...]]
See arch/*/kernel/reboot.c or arch/*/kernel/process.c See arch/*/kernel/reboot.c or arch/*/kernel/process.c
reserve= [KNL,BUGS] Force the kernel to ignore some iomem area reserve= [KNL,BUGS] Force the kernel to ignore some iomem area
reservetop= [IA-32] reservetop= [X86-32]
Format: nn[KMG] Format: nn[KMG]
Reserves a hole at the top of the kernel virtual Reserves a hole at the top of the kernel virtual
address space. address space.
...@@ -1564,7 +1561,7 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -1564,7 +1561,7 @@ and is between 256 and 4096 characters. It is defined in the file
Value can be changed at runtime via Value can be changed at runtime via
/selinux/compat_net. /selinux/compat_net.
serialnumber [BUGS=IA-32] serialnumber [BUGS=X86-32]
sg_def_reserved_size= [SCSI] sg_def_reserved_size= [SCSI]
...@@ -1617,7 +1614,7 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -1617,7 +1614,7 @@ and is between 256 and 4096 characters. It is defined in the file
smart2= [HW] smart2= [HW]
Format: <io1>[,<io2>[,...,<io8>]] Format: <io1>[,<io2>[,...,<io8>]]
smp-alt-once [IA-32,SMP] On a hotplug CPU system, only smp-alt-once [X86-32,SMP] On a hotplug CPU system, only
attempt to substitute SMP alternatives once at boot. attempt to substitute SMP alternatives once at boot.
smsc-ircc2.nopnp [HW] Don't use PNP to discover SMC devices smsc-ircc2.nopnp [HW] Don't use PNP to discover SMC devices
...@@ -1882,7 +1879,7 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -1882,7 +1879,7 @@ and is between 256 and 4096 characters. It is defined in the file
usbhid.mousepoll= usbhid.mousepoll=
[USBHID] The interval which mice are to be polled at. [USBHID] The interval which mice are to be polled at.
vdso= [IA-32,SH,x86-64] vdso= [X86-32,SH,x86-64]
vdso=2: enable compat VDSO (default with COMPAT_VDSO) vdso=2: enable compat VDSO (default with COMPAT_VDSO)
vdso=1: enable VDSO (default) vdso=1: enable VDSO (default)
vdso=0: disable VDSO mapping vdso=0: disable VDSO mapping
...@@ -1893,7 +1890,7 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -1893,7 +1890,7 @@ and is between 256 and 4096 characters. It is defined in the file
video= [FB] Frame buffer configuration video= [FB] Frame buffer configuration
See Documentation/fb/modedb.txt. See Documentation/fb/modedb.txt.
vga= [BOOT,IA-32] Select a particular video mode vga= [BOOT,X86-32] Select a particular video mode
See Documentation/i386/boot.txt and See Documentation/i386/boot.txt and
Documentation/svga.txt. Documentation/svga.txt.
Use vga=ask for menu. Use vga=ask for menu.
......
...@@ -859,9 +859,8 @@ payload contents" for more information. ...@@ -859,9 +859,8 @@ payload contents" for more information.
void unregister_key_type(struct key_type *type); void unregister_key_type(struct key_type *type);
Under some circumstances, it may be desirable to desirable to deal with a Under some circumstances, it may be desirable to deal with a bundle of keys.
bundle of keys. The facility provides access to the keyring type for managing The facility provides access to the keyring type for managing such a bundle:
such a bundle:
struct key_type key_type_keyring; struct key_type key_type_keyring;
......
...@@ -27,7 +27,6 @@ in detail, and briefly here: ...@@ -27,7 +27,6 @@ in detail, and briefly here:
- kobjects a simple object. - kobjects a simple object.
- kset a set of objects of a certain type. - kset a set of objects of a certain type.
- ktype a set of helpers for objects of a common type. - ktype a set of helpers for objects of a common type.
- subsystem a controlling object for a number of ksets.
The kobject infrastructure maintains a close relationship with the The kobject infrastructure maintains a close relationship with the
...@@ -54,13 +53,15 @@ embedded in larger data structures and replace fields they duplicate. ...@@ -54,13 +53,15 @@ embedded in larger data structures and replace fields they duplicate.
1.2 Definition 1.2 Definition
struct kobject { struct kobject {
const char * k_name;
char name[KOBJ_NAME_LEN]; char name[KOBJ_NAME_LEN];
atomic_t refcount; struct kref kref;
struct list_head entry; struct list_head entry;
struct kobject * parent; struct kobject * parent;
struct kset * kset; struct kset * kset;
struct kobj_type * ktype; struct kobj_type * ktype;
struct dentry * dentry; struct sysfs_dirent * sd;
wait_queue_head_t poll;
}; };
void kobject_init(struct kobject *); void kobject_init(struct kobject *);
...@@ -137,8 +138,7 @@ If a kobject does not have a parent when it is registered, its parent ...@@ -137,8 +138,7 @@ If a kobject does not have a parent when it is registered, its parent
becomes its dominant kset. becomes its dominant kset.
If a kobject does not have a parent nor a dominant kset, its directory If a kobject does not have a parent nor a dominant kset, its directory
is created at the top-level of the sysfs partition. This should only is created at the top-level of the sysfs partition.
happen for kobjects that are embedded in a struct subsystem.
...@@ -150,10 +150,10 @@ A kset is a set of kobjects that are embedded in the same type. ...@@ -150,10 +150,10 @@ A kset is a set of kobjects that are embedded in the same type.
struct kset { struct kset {
struct subsystem * subsys;
struct kobj_type * ktype; struct kobj_type * ktype;
struct list_head list; struct list_head list;
struct kobject kobj; struct kobject kobj;
struct kset_uevent_ops * uevent_ops;
}; };
...@@ -169,8 +169,7 @@ struct kobject * kset_find_obj(struct kset *, char *); ...@@ -169,8 +169,7 @@ struct kobject * kset_find_obj(struct kset *, char *);
The type that the kobjects are embedded in is described by the ktype The type that the kobjects are embedded in is described by the ktype
pointer. The subsystem that the kobject belongs to is pointed to by the pointer.
subsys pointer.
A kset contains a kobject itself, meaning that it may be registered in A kset contains a kobject itself, meaning that it may be registered in
the kobject hierarchy and exported via sysfs. More importantly, the the kobject hierarchy and exported via sysfs. More importantly, the
...@@ -209,6 +208,58 @@ the hierarchy. ...@@ -209,6 +208,58 @@ the hierarchy.
kset_find_obj() may be used to locate a kobject with a particular kset_find_obj() may be used to locate a kobject with a particular
name. The kobject, if found, is returned. name. The kobject, if found, is returned.
There are also some helper functions which names point to the formerly
existing "struct subsystem", whose functions have been taken over by
ksets.
decl_subsys(name,type,uevent_ops)
Declares a kset named '<name>_subsys' of type <type> with
uevent_ops <uevent_ops>. For example,
decl_subsys(devices, &ktype_device, &device_uevent_ops);
is equivalent to doing:
struct kset devices_subsys = {
.kobj = {
.name = "devices",
},
.ktype = &ktype_devices,
.uevent_ops = &device_uevent_ops,
};
The objects that are registered with a subsystem that use the
subsystem's default list must have their kset ptr set properly. These
objects may have embedded kobjects or ksets. The
following helpers make setting the kset easier:
kobj_set_kset_s(obj,subsys)
- Assumes that obj->kobj exists, and is a struct kobject.
- Sets the kset of that kobject to the kset <subsys>.
kset_set_kset_s(obj,subsys)
- Assumes that obj->kset exists, and is a struct kset.
- Sets the kset of the embedded kobject to the kset <subsys>.
subsys_set_kset(obj,subsys)
- Assumes obj->subsys exists, and is a struct subsystem.
- Sets obj->subsys.kset.kobj.kset to the subsystem's embedded kset.
void subsystem_init(struct kset *s);
int subsystem_register(struct kset *s);
void subsystem_unregister(struct kset *s);
struct kset *subsys_get(struct kset *s);
void kset_put(struct kset *s);
These are just wrappers around the respective kset_* functions.
2.3 sysfs 2.3 sysfs
...@@ -254,114 +305,3 @@ Instances of struct kobj_type are not registered; only referenced by ...@@ -254,114 +305,3 @@ Instances of struct kobj_type are not registered; only referenced by
the kset. A kobj_type may be referenced by an arbitrary number of the kset. A kobj_type may be referenced by an arbitrary number of
ksets, as there may be disparate sets of identical objects. ksets, as there may be disparate sets of identical objects.
4. subsystems
4.1 Description
A subsystem represents a significant entity of code that maintains an
arbitrary number of sets of objects of various types. Since the number
of ksets and the type of objects they contain are variable, a
generic representation of a subsystem is minimal.
struct subsystem {
struct kset kset;
struct rw_semaphore rwsem;
};
int subsystem_register(struct subsystem *);
void subsystem_unregister(struct subsystem *);
struct subsystem * subsys_get(struct subsystem * s);
void subsys_put(struct subsystem * s);
A subsystem contains an embedded kset so:
- It can be represented in the object hierarchy via the kset's
embedded kobject.
- It can maintain a default list of objects of one type.
Additional ksets may attach to the subsystem simply by referencing the
subsystem before they are registered. (This one-way reference means
that there is no way to determine the ksets that are attached to the
subsystem.)
All ksets that are attached to a subsystem share the subsystem's R/W
semaphore.
4.2 subsystem Programming Interface.
The subsystem programming interface is simple and does not offer the
flexibility that the kset and kobject programming interfaces do. They
may be registered and unregistered, as well as reference counted. Each
call forwards the calls to their embedded ksets (which forward the
calls to their embedded kobjects).
4.3 Helpers
A number of macros are available to make dealing with subsystems and
their embedded objects easier.
decl_subsys(name,type)
Declares a subsystem named '<name>_subsys', with an embedded kset of
type <type>. For example,
decl_subsys(devices,&ktype_devices);
is equivalent to doing:
struct subsystem device_subsys = {
.kset = {
.kobj = {
.name = "devices",
},
.ktype = &ktype_devices,
}
};
The objects that are registered with a subsystem that use the
subsystem's default list must have their kset ptr set properly. These
objects may have embedded kobjects, ksets, or other subsystems. The
following helpers make setting the kset easier:
kobj_set_kset_s(obj,subsys)
- Assumes that obj->kobj exists, and is a struct kobject.
- Sets the kset of that kobject to the subsystem's embedded kset.
kset_set_kset_s(obj,subsys)
- Assumes that obj->kset exists, and is a struct kset.
- Sets the kset of the embedded kobject to the subsystem's
embedded kset.
subsys_set_kset(obj,subsys)
- Assumes obj->subsys exists, and is a struct subsystem.
- Sets obj->subsys.kset.kobj.kset to the subsystem's embedded kset.
4.4 sysfs
subsystems are represented in sysfs via their embedded kobjects. They
follow the same rules as previously mentioned with no exceptions. They
typically receive a top-level directory in sysfs, except when their
embedded kobject is part of another kset, or the parent of the
embedded kobject is explicitly set.
Note that the subsystem's embedded kset must be 'attached' to the
subsystem itself in order to use its rwsem. This is done after
kset_add() has been called. (Not before, because kset_add() uses its
subsystem for a default parent if it doesn't already have one).
...@@ -11,8 +11,7 @@ endif ...@@ -11,8 +11,7 @@ endif
include $(KBUILD_OUTPUT)/.config include $(KBUILD_OUTPUT)/.config
LGUEST_GUEST_TOP := ($(CONFIG_PAGE_OFFSET) - 0x08000000) LGUEST_GUEST_TOP := ($(CONFIG_PAGE_OFFSET) - 0x08000000)
CFLAGS:=-Wall -Wmissing-declarations -Wmissing-prototypes -O3 \ CFLAGS:=-Wall -Wmissing-declarations -Wmissing-prototypes -O3 -Wl,-T,lguest.lds
-static -DLGUEST_GUEST_TOP="$(LGUEST_GUEST_TOP)" -Wl,-T,lguest.lds
LDLIBS:=-lz LDLIBS:=-lz
all: lguest.lds lguest all: lguest.lds lguest
......
#! /bin/sh
set -e
PREFIX=$1
shift
trap 'rm -r $TMPDIR' 0
TMPDIR=`mktemp -d`
exec 3>/dev/null
for f; do
while IFS="
" read -r LINE; do
case "$LINE" in
*$PREFIX:[0-9]*:\**)
NUM=`echo "$LINE" | sed "s/.*$PREFIX:\([0-9]*\).*/\1/"`
if [ -f $TMPDIR/$NUM ]; then
echo "$TMPDIR/$NUM already exits prior to $f"
exit 1
fi
exec 3>>$TMPDIR/$NUM
echo $f | sed 's,\.\./,,g' > $TMPDIR/.$NUM
/bin/echo "$LINE" | sed -e "s/$PREFIX:[0-9]*//" -e "s/:\*/*/" >&3
;;
*$PREFIX:[0-9]*)
NUM=`echo "$LINE" | sed "s/.*$PREFIX:\([0-9]*\).*/\1/"`
if [ -f $TMPDIR/$NUM ]; then
echo "$TMPDIR/$NUM already exits prior to $f"
exit 1
fi
exec 3>>$TMPDIR/$NUM
echo $f | sed 's,\.\./,,g' > $TMPDIR/.$NUM
/bin/echo "$LINE" | sed "s/$PREFIX:[0-9]*//" >&3
;;
*:\**)
/bin/echo "$LINE" | sed -e "s/:\*/*/" -e "s,/\*\*/,," >&3
echo >&3
exec 3>/dev/null
;;
*)
/bin/echo "$LINE" >&3
;;
esac
done < $f
echo >&3
exec 3>/dev/null
done
LASTFILE=""
for f in $TMPDIR/*; do
if [ "$LASTFILE" != $(cat $TMPDIR/.$(basename $f) ) ]; then
LASTFILE=$(cat $TMPDIR/.$(basename $f) )
echo "[ $LASTFILE ]"
fi
cat $f
done
此差异已折叠。
Version 10 of schedstats includes support for sched_domains, which Version 14 of schedstats includes support for sched_domains, which hit the
hit the mainline kernel in 2.6.7. Some counters make more sense to be mainline kernel in 2.6.20 although it is identical to the stats from version
per-runqueue; other to be per-domain. Note that domains (and their associated 12 which was in the kernel from 2.6.13-2.6.19 (version 13 never saw a kernel
information) will only be pertinent and available on machines utilizing release). Some counters make more sense to be per-runqueue; other to be
CONFIG_SMP. per-domain. Note that domains (and their associated information) will only
be pertinent and available on machines utilizing CONFIG_SMP.
In version 10 of schedstat, there is at least one level of domain
In version 14 of schedstat, there is at least one level of domain
statistics for each cpu listed, and there may well be more than one statistics for each cpu listed, and there may well be more than one
domain. Domains have no particular names in this implementation, but domain. Domains have no particular names in this implementation, but
the highest numbered one typically arbitrates balancing across all the the highest numbered one typically arbitrates balancing across all the
...@@ -27,7 +28,7 @@ to write their own scripts, the fields are described here. ...@@ -27,7 +28,7 @@ to write their own scripts, the fields are described here.
CPU statistics CPU statistics
-------------- --------------
cpu<N> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 cpu<N> 1 2 3 4 5 6 7 8 9 10 11 12
NOTE: In the sched_yield() statistics, the active queue is considered empty NOTE: In the sched_yield() statistics, the active queue is considered empty
if it has only one process in it, since obviously the process calling if it has only one process in it, since obviously the process calling
...@@ -39,48 +40,20 @@ First four fields are sched_yield() statistics: ...@@ -39,48 +40,20 @@ First four fields are sched_yield() statistics:
3) # of times just the expired queue was empty 3) # of times just the expired queue was empty
4) # of times sched_yield() was called 4) # of times sched_yield() was called
Next four are schedule() statistics: Next three are schedule() statistics:
5) # of times the active queue had at least one other process on it 5) # of times we switched to the expired queue and reused it
6) # of times we switched to the expired queue and reused it 6) # of times schedule() was called
7) # of times schedule() was called 7) # of times schedule() left the processor idle
8) # of times schedule() left the processor idle
Next four are active_load_balance() statistics:
9) # of times active_load_balance() was called
10) # of times active_load_balance() caused this cpu to gain a task
11) # of times active_load_balance() caused this cpu to lose a task
12) # of times active_load_balance() tried to move a task and failed
Next three are try_to_wake_up() statistics:
13) # of times try_to_wake_up() was called
14) # of times try_to_wake_up() successfully moved the awakening task
15) # of times try_to_wake_up() attempted to move the awakening task
Next two are wake_up_new_task() statistics:
16) # of times wake_up_new_task() was called
17) # of times wake_up_new_task() successfully moved the new task
Next one is a sched_migrate_task() statistic:
18) # of times sched_migrate_task() was called
Next one is a sched_balance_exec() statistic: Next two are try_to_wake_up() statistics:
19) # of times sched_balance_exec() was called 8) # of times try_to_wake_up() was called
9) # of times try_to_wake_up() was called to wake up the local cpu
Next three are statistics describing scheduling latency: Next three are statistics describing scheduling latency:
20) sum of all time spent running by tasks on this processor (in ms) 10) sum of all time spent running by tasks on this processor (in jiffies)
21) sum of all time spent waiting to run by tasks on this processor (in ms) 11) sum of all time spent waiting to run by tasks on this processor (in
22) # of tasks (not necessarily unique) given to the processor jiffies)
12) # of timeslices run on this cpu
The last six are statistics dealing with pull_task():
23) # of times pull_task() moved a task to this cpu when newly idle
24) # of times pull_task() stole a task from this cpu when another cpu
was newly idle
25) # of times pull_task() moved a task to this cpu when idle
26) # of times pull_task() stole a task from this cpu when another cpu
was idle
27) # of times pull_task() moved a task to this cpu when busy
28) # of times pull_task() stole a task from this cpu when another cpu
was busy
Domain statistics Domain statistics
...@@ -89,65 +62,95 @@ One of these is produced per domain for each cpu described. (Note that if ...@@ -89,65 +62,95 @@ One of these is produced per domain for each cpu described. (Note that if
CONFIG_SMP is not defined, *no* domains are utilized and these lines CONFIG_SMP is not defined, *no* domains are utilized and these lines
will not appear in the output.) will not appear in the output.)
domain<N> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 domain<N> <cpumask> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
The first field is a bit mask indicating what cpus this domain operates over. The first field is a bit mask indicating what cpus this domain operates over.
The next fifteen are a variety of load_balance() statistics: The next 24 are a variety of load_balance() statistics in grouped into types
of idleness (idle, busy, and newly idle):
1) # of times in this domain load_balance() was called when the cpu
was idle 1) # of times in this domain load_balance() was called when the
2) # of times in this domain load_balance() was called when the cpu cpu was idle
was busy 2) # of times in this domain load_balance() checked but found
3) # of times in this domain load_balance() was called when the cpu the load did not require balancing when the cpu was idle
was just becoming idle 3) # of times in this domain load_balance() tried to move one or
4) # of times in this domain load_balance() tried to move one or more more tasks and failed, when the cpu was idle
tasks and failed, when the cpu was idle 4) sum of imbalances discovered (if any) with each call to
5) # of times in this domain load_balance() tried to move one or more load_balance() in this domain when the cpu was idle
tasks and failed, when the cpu was busy 5) # of times in this domain pull_task() was called when the cpu
6) # of times in this domain load_balance() tried to move one or more was idle
tasks and failed, when the cpu was just becoming idle 6) # of times in this domain pull_task() was called even though
7) sum of imbalances discovered (if any) with each call to the target task was cache-hot when idle
load_balance() in this domain when the cpu was idle 7) # of times in this domain load_balance() was called but did
8) sum of imbalances discovered (if any) with each call to not find a busier queue while the cpu was idle
load_balance() in this domain when the cpu was busy 8) # of times in this domain a busier queue was found while the
9) sum of imbalances discovered (if any) with each call to cpu was idle but no busier group was found
load_balance() in this domain when the cpu was just becoming idle
10) # of times in this domain load_balance() was called but did not find 9) # of times in this domain load_balance() was called when the
a busier queue while the cpu was idle cpu was busy
11) # of times in this domain load_balance() was called but did not find 10) # of times in this domain load_balance() checked but found the
a busier queue while the cpu was busy load did not require balancing when busy
12) # of times in this domain load_balance() was called but did not find 11) # of times in this domain load_balance() tried to move one or
a busier queue while the cpu was just becoming idle more tasks and failed, when the cpu was busy
13) # of times in this domain a busier queue was found while the cpu was 12) sum of imbalances discovered (if any) with each call to
idle but no busier group was found load_balance() in this domain when the cpu was busy
14) # of times in this domain a busier queue was found while the cpu was 13) # of times in this domain pull_task() was called when busy
busy but no busier group was found 14) # of times in this domain pull_task() was called even though the
15) # of times in this domain a busier queue was found while the cpu was target task was cache-hot when busy
just becoming idle but no busier group was found 15) # of times in this domain load_balance() was called but did not
find a busier queue while the cpu was busy
Next two are sched_balance_exec() statistics: 16) # of times in this domain a busier queue was found while the cpu
17) # of times in this domain sched_balance_exec() successfully pushed was busy but no busier group was found
a task to a new cpu
18) # of times in this domain sched_balance_exec() tried but failed to 17) # of times in this domain load_balance() was called when the
push a task to a new cpu cpu was just becoming idle
18) # of times in this domain load_balance() checked but found the
Next two are try_to_wake_up() statistics: load did not require balancing when the cpu was just becoming idle
19) # of times in this domain try_to_wake_up() tried to move a task based 19) # of times in this domain load_balance() tried to move one or more
on affinity and cache warmth tasks and failed, when the cpu was just becoming idle
20) # of times in this domain try_to_wake_up() tried to move a task based 20) sum of imbalances discovered (if any) with each call to
on load balancing load_balance() in this domain when the cpu was just becoming idle
21) # of times in this domain pull_task() was called when newly idle
22) # of times in this domain pull_task() was called even though the
target task was cache-hot when just becoming idle
23) # of times in this domain load_balance() was called but did not
find a busier queue while the cpu was just becoming idle
24) # of times in this domain a busier queue was found while the cpu
was just becoming idle but no busier group was found
Next three are active_load_balance() statistics:
25) # of times active_load_balance() was called
26) # of times active_load_balance() tried to move a task and failed
27) # of times active_load_balance() successfully moved a task
Next three are sched_balance_exec() statistics:
28) sbe_cnt is not used
29) sbe_balanced is not used
30) sbe_pushed is not used
Next three are sched_balance_fork() statistics:
31) sbf_cnt is not used
32) sbf_balanced is not used
33) sbf_pushed is not used
Next three are try_to_wake_up() statistics:
34) # of times in this domain try_to_wake_up() awoke a task that
last ran on a different cpu in this domain
35) # of times in this domain try_to_wake_up() moved a task to the
waking cpu because it was cache-cold on its own cpu anyway
36) # of times in this domain try_to_wake_up() started passive balancing
/proc/<pid>/schedstat /proc/<pid>/schedstat
---------------- ----------------
schedstats also adds a new /proc/<pid/schedstat file to include some of schedstats also adds a new /proc/<pid/schedstat file to include some of
the same information on a per-process level. There are three fields in the same information on a per-process level. There are three fields in
this file correlating to fields 20, 21, and 22 in the CPU fields, but this file correlating for that process to:
they only apply for that process. 1) time spent on the cpu
2) time spent waiting on a runqueue
3) # of timeslices run on this cpu
A program could be easily written to make use of these extra fields to A program could be easily written to make use of these extra fields to
report on how well a particular process or set of processes is faring report on how well a particular process or set of processes is faring
under the scheduler's policies. A simple version of such a program is under the scheduler's policies. A simple version of such a program is
available at available at
http://eaglet.rain.com/rick/linux/schedstat/v10/latency.c http://eaglet.rain.com/rick/linux/schedstat/v12/latency.c
/*
* SPI testing utility (using spidev driver)
*
* Copyright (c) 2007 MontaVista Software, Inc.
* Copyright (c) 2007 Anton Vorontsov <avorontsov@ru.mvista.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License.
*
* Cross-compile with cross-gcc -I/path/to/cross-kernel/include
*/
#include <stdint.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/types.h>
#include <linux/spi/spidev.h>
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
static void pabort(const char *s)
{
perror(s);
abort();
}
static char *device = "/dev/spidev1.1";
static uint8_t mode;
static uint8_t bits = 8;
static uint32_t speed = 500000;
static uint16_t delay;
static void transfer(int fd)
{
int ret;
uint8_t tx[] = {
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x40, 0x00, 0x00, 0x00, 0x00, 0x95,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xDE, 0xAD, 0xBE, 0xEF, 0xBA, 0xAD,
0xF0, 0x0D,
};
uint8_t rx[ARRAY_SIZE(tx)] = {0, };
struct spi_ioc_transfer tr = {
.tx_buf = (unsigned long)tx,
.rx_buf = (unsigned long)rx,
.len = ARRAY_SIZE(tx),
.delay_usecs = delay,
.speed_hz = speed,
.bits_per_word = bits,
};
ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
if (ret == 1)
pabort("can't send spi message");
for (ret = 0; ret < ARRAY_SIZE(tx); ret++) {
if (!(ret % 6))
puts("");
printf("%.2X ", rx[ret]);
}
puts("");
}
void print_usage(char *prog)
{
printf("Usage: %s [-DsbdlHOLC3]\n", prog);
puts(" -D --device device to use (default /dev/spidev1.1)\n"
" -s --speed max speed (Hz)\n"
" -d --delay delay (usec)\n"
" -b --bpw bits per word \n"
" -l --loop loopback\n"
" -H --cpha clock phase\n"
" -O --cpol clock polarity\n"
" -L --lsb least significant bit first\n"
" -C --cs-high chip select active high\n"
" -3 --3wire SI/SO signals shared\n");
exit(1);
}
void parse_opts(int argc, char *argv[])
{
while (1) {
static struct option lopts[] = {
{ "device", 1, 0, 'D' },
{ "speed", 1, 0, 's' },
{ "delay", 1, 0, 'd' },
{ "bpw", 1, 0, 'b' },
{ "loop", 0, 0, 'l' },
{ "cpha", 0, 0, 'H' },
{ "cpol", 0, 0, 'O' },
{ "lsb", 0, 0, 'L' },
{ "cs-high", 0, 0, 'C' },
{ "3wire", 0, 0, '3' },
{ NULL, 0, 0, 0 },
};
int c;
c = getopt_long(argc, argv, "D:s:d:b:lHOLC3", lopts, NULL);
if (c == -1)
break;
switch (c) {
case 'D':
device = optarg;
break;
case 's':
speed = atoi(optarg);
break;
case 'd':
delay = atoi(optarg);
break;
case 'b':
bits = atoi(optarg);
break;
case 'l':
mode |= SPI_LOOP;
break;
case 'H':
mode |= SPI_CPHA;
break;
case 'O':
mode |= SPI_CPOL;
break;
case 'L':
mode |= SPI_LSB_FIRST;
break;
case 'C':
mode |= SPI_CS_HIGH;
break;
case '3':
mode |= SPI_3WIRE;
break;
default:
print_usage(argv[0]);
break;
}
}
}
int main(int argc, char *argv[])
{
int ret = 0;
int fd;
parse_opts(argc, argv);
fd = open(device, O_RDWR);
if (fd < 0)
pabort("can't open device");
/*
* spi mode
*/
ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);
if (ret == -1)
pabort("can't set spi mode");
ret = ioctl(fd, SPI_IOC_RD_MODE, &mode);
if (ret == -1)
pabort("can't get spi mode");
/*
* bits per word
*/
ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
if (ret == -1)
pabort("can't set bits per word");
ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);
if (ret == -1)
pabort("can't get bits per word");
/*
* max speed hz
*/
ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
if (ret == -1)
pabort("can't set max speed hz");
ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
if (ret == -1)
pabort("can't get max speed hz");
printf("spi mode: %d\n", mode);
printf("bits per word: %d\n", bits);
printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000);
transfer(fd);
close(fd);
return ret;
}
...@@ -10,7 +10,7 @@ kernel to userspace interfaces. The kernel to userspace interface is ...@@ -10,7 +10,7 @@ kernel to userspace interfaces. The kernel to userspace interface is
the one that application programs use, the syscall interface. That the one that application programs use, the syscall interface. That
interface is _very_ stable over time, and will not break. I have old interface is _very_ stable over time, and will not break. I have old
programs that were built on a pre 0.9something kernel that still work programs that were built on a pre 0.9something kernel that still work
just fine on the latest 2.6 kernel release. This interface is the one just fine on the latest 2.6 kernel release. That interface is the one
that users and application programmers can count on being stable. that users and application programmers can count on being stable.
......
Rules on how to access information in the Linux kernel sysfs Rules on how to access information in the Linux kernel sysfs
The kernel exported sysfs exports internal kernel implementation-details The kernel-exported sysfs exports internal kernel implementation details
and depends on internal kernel structures and layout. It is agreed upon and depends on internal kernel structures and layout. It is agreed upon
by the kernel developers that the Linux kernel does not provide a stable by the kernel developers that the Linux kernel does not provide a stable
internal API. As sysfs is a direct export of kernel internal internal API. As sysfs is a direct export of kernel internal
structures, the sysfs interface can not provide a stable interface eighter, structures, the sysfs interface cannot provide a stable interface either;
it may always change along with internal kernel changes. it may always change along with internal kernel changes.
To minimize the risk of breaking users of sysfs, which are in most cases To minimize the risk of breaking users of sysfs, which are in most cases
low-level userspace applications, with a new kernel release, the users low-level userspace applications, with a new kernel release, the users
of sysfs must follow some rules to use an as abstract-as-possible way to of sysfs must follow some rules to use an as-abstract-as-possible way to
access this filesystem. The current udev and HAL programs already access this filesystem. The current udev and HAL programs already
implement this and users are encouraged to plug, if possible, into the implement this and users are encouraged to plug, if possible, into the
abstractions these programs provide instead of accessing sysfs abstractions these programs provide instead of accessing sysfs directly.
directly.
But if you really do want or need to access sysfs directly, please follow But if you really do want or need to access sysfs directly, please follow
the following rules and then your programs should work with future the following rules and then your programs should work with future
...@@ -25,22 +24,22 @@ versions of the sysfs interface. ...@@ -25,22 +24,22 @@ versions of the sysfs interface.
implementation details in its own API. Therefore it is not better than implementation details in its own API. Therefore it is not better than
reading directories and opening the files yourself. reading directories and opening the files yourself.
Also, it is not actively maintained, in the sense of reflecting the Also, it is not actively maintained, in the sense of reflecting the
current kernel-development. The goal of providing a stable interface current kernel development. The goal of providing a stable interface
to sysfs has failed, it causes more problems, than it solves. It to sysfs has failed; it causes more problems than it solves. It
violates many of the rules in this document. violates many of the rules in this document.
- sysfs is always at /sys - sysfs is always at /sys
Parsing /proc/mounts is a waste of time. Other mount points are a Parsing /proc/mounts is a waste of time. Other mount points are a
system configuration bug you should not try to solve. For test cases, system configuration bug you should not try to solve. For test cases,
possibly support a SYSFS_PATH environment variable to overwrite the possibly support a SYSFS_PATH environment variable to overwrite the
applications behavior, but never try to search for sysfs. Never try application's behavior, but never try to search for sysfs. Never try
to mount it, if you are not an early boot script. to mount it, if you are not an early boot script.
- devices are only "devices" - devices are only "devices"
There is no such thing like class-, bus-, physical devices, There is no such thing like class-, bus-, physical devices,
interfaces, and such that you can rely on in userspace. Everything is interfaces, and such that you can rely on in userspace. Everything is
just simply a "device". Class-, bus-, physical, ... types are just just simply a "device". Class-, bus-, physical, ... types are just
kernel implementation details, which should not be expected by kernel implementation details which should not be expected by
applications that look for devices in sysfs. applications that look for devices in sysfs.
The properties of a device are: The properties of a device are:
...@@ -48,11 +47,11 @@ versions of the sysfs interface. ...@@ -48,11 +47,11 @@ versions of the sysfs interface.
- identical to the DEVPATH value in the event sent from the kernel - identical to the DEVPATH value in the event sent from the kernel
at device creation and removal at device creation and removal
- the unique key to the device at that point in time - the unique key to the device at that point in time
- the kernels path to the device-directory without the leading - the kernel's path to the device directory without the leading
/sys, and always starting with with a slash /sys, and always starting with with a slash
- all elements of a devpath must be real directories. Symlinks - all elements of a devpath must be real directories. Symlinks
pointing to /sys/devices must always be resolved to their real pointing to /sys/devices must always be resolved to their real
target, and the target path must be used to access the device. target and the target path must be used to access the device.
That way the devpath to the device matches the devpath of the That way the devpath to the device matches the devpath of the
kernel used at event time. kernel used at event time.
- using or exposing symlink values as elements in a devpath string - using or exposing symlink values as elements in a devpath string
...@@ -73,17 +72,17 @@ versions of the sysfs interface. ...@@ -73,17 +72,17 @@ versions of the sysfs interface.
link link
- it is retrieved by reading the "driver"-link and using only the - it is retrieved by reading the "driver"-link and using only the
last element of the target path last element of the target path
- devices which do not have "driver"-link, just do not have a - devices which do not have "driver"-link just do not have a
driver; copying the driver value in a child device context, is a driver; copying the driver value in a child device context is a
bug in the application bug in the application
o attributes o attributes
- the files in the device directory or files below a subdirectories - the files in the device directory or files below subdirectories
of the same device directory of the same device directory
- accessing attributes reached by a symlink pointing to another device, - accessing attributes reached by a symlink pointing to another device,
like the "device"-link, is a bug in the application like the "device"-link, is a bug in the application
Everything else is just a kernel driver-core implementation detail, Everything else is just a kernel driver-core implementation detail
that should not be assumed to be stable across kernel releases. that should not be assumed to be stable across kernel releases.
- Properties of parent devices never belong into a child device. - Properties of parent devices never belong into a child device.
...@@ -91,25 +90,25 @@ versions of the sysfs interface. ...@@ -91,25 +90,25 @@ versions of the sysfs interface.
context properties. If the device 'eth0' or 'sda' does not have a context properties. If the device 'eth0' or 'sda' does not have a
"driver"-link, then this device does not have a driver. Its value is empty. "driver"-link, then this device does not have a driver. Its value is empty.
Never copy any property of the parent-device into a child-device. Parent Never copy any property of the parent-device into a child-device. Parent
device-properties may change dynamically without any notice to the device properties may change dynamically without any notice to the
child device. child device.
- Hierarchy in a single device-tree - Hierarchy in a single device tree
There is only one valid place in sysfs where hierarchy can be examined There is only one valid place in sysfs where hierarchy can be examined
and this is below: /sys/devices. and this is below: /sys/devices.
It is planned, that all device directories will end up in the tree It is planned that all device directories will end up in the tree
below this directory. below this directory.
- Classification by subsystem - Classification by subsystem
There are currently three places for classification of devices: There are currently three places for classification of devices:
/sys/block, /sys/class and /sys/bus. It is planned that these will /sys/block, /sys/class and /sys/bus. It is planned that these will
not contain any device-directories themselves, but only flat lists of not contain any device directories themselves, but only flat lists of
symlinks pointing to the unified /sys/devices tree. symlinks pointing to the unified /sys/devices tree.
All three places have completely different rules on how to access All three places have completely different rules on how to access
device information. It is planned to merge all three device information. It is planned to merge all three
classification-directories into one place at /sys/subsystem, classification directories into one place at /sys/subsystem,
following the layout of the bus-directories. All buses and following the layout of the bus directories. All buses and
classes, including the converted block-subsystem, will show up classes, including the converted block subsystem, will show up
there. there.
The devices belonging to a subsystem will create a symlink in the The devices belonging to a subsystem will create a symlink in the
"devices" directory at /sys/subsystem/<name>/devices. "devices" directory at /sys/subsystem/<name>/devices.
...@@ -121,38 +120,38 @@ versions of the sysfs interface. ...@@ -121,38 +120,38 @@ versions of the sysfs interface.
subsystem name. subsystem name.
Assuming /sys/class/<subsystem> and /sys/bus/<subsystem>, or Assuming /sys/class/<subsystem> and /sys/bus/<subsystem>, or
/sys/block and /sys/class/block are not interchangeable, is a bug in /sys/block and /sys/class/block are not interchangeable is a bug in
the application. the application.
- Block - Block
The converted block-subsystem at /sys/class/block, or The converted block subsystem at /sys/class/block or
/sys/subsystem/block will contain the links for disks and partitions /sys/subsystem/block will contain the links for disks and partitions
at the same level, never in a hierarchy. Assuming the block-subsytem to at the same level, never in a hierarchy. Assuming the block subsytem to
contain only disks and not partition-devices in the same flat list is contain only disks and not partition devices in the same flat list is
a bug in the application. a bug in the application.
- "device"-link and <subsystem>:<kernel name>-links - "device"-link and <subsystem>:<kernel name>-links
Never depend on the "device"-link. The "device"-link is a workaround Never depend on the "device"-link. The "device"-link is a workaround
for the old layout, where class-devices are not created in for the old layout, where class devices are not created in
/sys/devices/ like the bus-devices. If the link-resolving of a /sys/devices/ like the bus devices. If the link-resolving of a
device-directory does not end in /sys/devices/, you can use the device directory does not end in /sys/devices/, you can use the
"device"-link to find the parent devices in /sys/devices/. That is the "device"-link to find the parent devices in /sys/devices/. That is the
single valid use of the "device"-link, it must never appear in any single valid use of the "device"-link; it must never appear in any
path as an element. Assuming the existence of the "device"-link for path as an element. Assuming the existence of the "device"-link for
a device in /sys/devices/ is a bug in the application. a device in /sys/devices/ is a bug in the application.
Accessing /sys/class/net/eth0/device is a bug in the application. Accessing /sys/class/net/eth0/device is a bug in the application.
Never depend on the class-specific links back to the /sys/class Never depend on the class-specific links back to the /sys/class
directory. These links are also a workaround for the design mistake directory. These links are also a workaround for the design mistake
that class-devices are not created in /sys/devices. If a device that class devices are not created in /sys/devices. If a device
directory does not contain directories for child devices, these links directory does not contain directories for child devices, these links
may be used to find the child devices in /sys/class. That is the single may be used to find the child devices in /sys/class. That is the single
valid use of these links, they must never appear in any path as an valid use of these links; they must never appear in any path as an
element. Assuming the existence of these links for devices which are element. Assuming the existence of these links for devices which are
real child device directories in the /sys/devices tree, is a bug in real child device directories in the /sys/devices tree is a bug in
the application. the application.
It is planned to remove all these links when when all class-device It is planned to remove all these links when all class device
directories live in /sys/devices. directories live in /sys/devices.
- Position of devices along device chain can change. - Position of devices along device chain can change.
...@@ -161,6 +160,5 @@ versions of the sysfs interface. ...@@ -161,6 +160,5 @@ versions of the sysfs interface.
the chain. You must always request the parent device you are looking for the chain. You must always request the parent device you are looking for
by its subsystem value. You need to walk up the chain until you find by its subsystem value. You need to walk up the chain until you find
the device that matches the expected subsystem. Depending on a specific the device that matches the expected subsystem. Depending on a specific
position of a parent device, or exposing relative paths, using "../" to position of a parent device or exposing relative paths using "../" to
access the chain of parents, is a bug in the application. access the chain of parents is a bug in the application.
...@@ -387,21 +387,6 @@ P: Jaya Kumar ...@@ -387,21 +387,6 @@ P: Jaya Kumar
M: jayalk@intworks.biz M: jayalk@intworks.biz
S: Maintained S: Maintained
ARM26 ARCHITECTURE
P: Ian Molton
M: spyro@f2s.com
S: Maintained
ARM26/ARCHIMEDES
P: Ian Molton
M: spyro@f2s.com
S: Maintained
ARM26/A5000
P: John Appleby
M: john@dnsworld.co.uk
S: Maintained
ARM MFM AND FLOPPY DRIVERS ARM MFM AND FLOPPY DRIVERS
P: Ian Molton P: Ian Molton
M: spyro@f2s.com M: spyro@f2s.com
...@@ -771,6 +756,14 @@ L: uclinux-dist-devel@blackfin.uclinux.org (subscribers-only) ...@@ -771,6 +756,14 @@ L: uclinux-dist-devel@blackfin.uclinux.org (subscribers-only)
W: http://blackfin.uclinux.org W: http://blackfin.uclinux.org
S: Supported S: Supported
BLACKFIN WATCHDOG DRIVER
P: Mike Frysinger
M: michael.frysinger@analog.com
M: vapier.adi@gmail.com
L: uclinux-dist-devel@blackfin.uclinux.org (subscribers-only)
W: http://blackfin.uclinux.org
S: Supported
BAYCOM/HDLCDRV DRIVERS FOR AX.25 BAYCOM/HDLCDRV DRIVERS FOR AX.25
P: Thomas Sailer P: Thomas Sailer
M: t.sailer@alumni.ethz.ch M: t.sailer@alumni.ethz.ch
...@@ -2171,6 +2164,8 @@ W: http://www.kerneljanitors.org/ ...@@ -2171,6 +2164,8 @@ W: http://www.kerneljanitors.org/
S: Maintained S: Maintained
KERNEL NFSD KERNEL NFSD
P: J. Bruce Fields
M: bfields@fieldses.org
P: Neil Brown P: Neil Brown
M: neilb@suse.de M: neilb@suse.de
L: nfs@lists.sourceforge.net L: nfs@lists.sourceforge.net
...@@ -3339,6 +3334,14 @@ M: thomas@winischhofer.net ...@@ -3339,6 +3334,14 @@ M: thomas@winischhofer.net
W: http://www.winischhofer.at/linuxsisusbvga.shtml W: http://www.winischhofer.at/linuxsisusbvga.shtml
S: Maintained S: Maintained
SLAB ALLOCATOR
P: Christoph Lameter
M: clameter@sgi.com
P: Pekka Enberg
M: penberg@cs.helsinki.fi
L: linux-mm@kvack.org
S: Maintained
SMC91x ETHERNET DRIVER SMC91x ETHERNET DRIVER
P: Nicolas Pitre P: Nicolas Pitre
M: nico@cam.org M: nico@cam.org
...@@ -3666,11 +3669,9 @@ W: http://www.auk.cx/tms380tr/ ...@@ -3666,11 +3669,9 @@ W: http://www.auk.cx/tms380tr/
S: Maintained S: Maintained
TULIP NETWORK DRIVER TULIP NETWORK DRIVER
P: Valerie Henson
M: val@nmt.edu
L: tulip-users@lists.sourceforge.net L: tulip-users@lists.sourceforge.net
W: http://sourceforge.net/projects/tulip/ W: http://sourceforge.net/projects/tulip/
S: Maintained S: Orphan
TUN/TAP driver TUN/TAP driver
P: Maxim Krasnyansky P: Maxim Krasnyansky
......
...@@ -299,7 +299,7 @@ CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ -Wbitwise $(C ...@@ -299,7 +299,7 @@ CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ -Wbitwise $(C
MODFLAGS = -DMODULE MODFLAGS = -DMODULE
CFLAGS_MODULE = $(MODFLAGS) CFLAGS_MODULE = $(MODFLAGS)
AFLAGS_MODULE = $(MODFLAGS) AFLAGS_MODULE = $(MODFLAGS)
LDFLAGS_MODULE = -r LDFLAGS_MODULE =
CFLAGS_KERNEL = CFLAGS_KERNEL =
AFLAGS_KERNEL = AFLAGS_KERNEL =
......
...@@ -104,7 +104,7 @@ OBJ_bootlx := $(obj)/head.o $(obj)/main.o ...@@ -104,7 +104,7 @@ OBJ_bootlx := $(obj)/head.o $(obj)/main.o
OBJ_bootph := $(obj)/head.o $(obj)/bootp.o OBJ_bootph := $(obj)/head.o $(obj)/bootp.o
OBJ_bootpzh := $(obj)/head.o $(obj)/bootpz.o $(obj)/misc.o OBJ_bootpzh := $(obj)/head.o $(obj)/bootpz.o $(obj)/misc.o
$(obj)/bootloader: $(obj)/bootloader.lds $(OBJ_bootlx) FORCE $(obj)/bootloader: $(obj)/bootloader.lds $(OBJ_bootlx) $(LIBS_Y) FORCE
$(call if_changed,ld) $(call if_changed,ld)
$(obj)/bootpheader: $(obj)/bootloader.lds $(OBJ_bootph) $(LIBS_Y) FORCE $(obj)/bootpheader: $(obj)/bootloader.lds $(OBJ_bootph) $(LIBS_Y) FORCE
......
...@@ -132,7 +132,7 @@ static inline long load(long dev, unsigned long addr, unsigned long count) ...@@ -132,7 +132,7 @@ static inline long load(long dev, unsigned long addr, unsigned long count)
if (result) if (result)
srm_printk("Boot file specification (%s) not implemented\n", srm_printk("Boot file specification (%s) not implemented\n",
bootfile); bootfile);
return callback_read(dev, count, addr, boot_size/512 + 1); return callback_read(dev, count, (void *)addr, boot_size/512 + 1);
} }
/* /*
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <fcntl.h> #include <fcntl.h>
#include <unistd.h> #include <unistd.h>
#include <stdlib.h>
#include <stdio.h> #include <stdio.h>
/* Minimal definition of disklabel, so we don't have to include /* Minimal definition of disklabel, so we don't have to include
...@@ -114,7 +115,7 @@ int main(int argc, char ** argv) ...@@ -114,7 +115,7 @@ int main(int argc, char ** argv)
nread = read(fd, &bootloader_image, sizeof(bootblock)); nread = read(fd, &bootloader_image, sizeof(bootblock));
if(nread != sizeof(bootblock)) { if(nread != sizeof(bootblock)) {
perror("lxboot read"); perror("lxboot read");
fprintf(stderr, "expected %d, got %d\n", sizeof(bootblock), nread); fprintf(stderr, "expected %zd, got %d\n", sizeof(bootblock), nread);
exit(0); exit(0);
} }
...@@ -122,7 +123,7 @@ int main(int argc, char ** argv) ...@@ -122,7 +123,7 @@ int main(int argc, char ** argv)
nread = read(dev, &bootblock_from_disk, sizeof(bootblock)); nread = read(dev, &bootblock_from_disk, sizeof(bootblock));
if(nread != sizeof(bootblock)) { if(nread != sizeof(bootblock)) {
perror("bootblock read"); perror("bootblock read");
fprintf(stderr, "expected %d, got %d\n", sizeof(bootblock), nread); fprintf(stderr, "expected %zd, got %d\n", sizeof(bootblock), nread);
exit(0); exit(0);
} }
......
...@@ -144,7 +144,7 @@ main (int argc, char *argv[]) ...@@ -144,7 +144,7 @@ main (int argc, char *argv[])
#ifdef __ELF__ #ifdef __ELF__
elf = (struct elfhdr *) buf; elf = (struct elfhdr *) buf;
if (elf->e_ident[0] == 0x7f && strncmp(elf->e_ident + 1, "ELF", 3) == 0) { if (elf->e_ident[0] == 0x7f && strncmp((char *)elf->e_ident + 1, "ELF", 3) == 0) {
if (elf->e_type != ET_EXEC) { if (elf->e_type != ET_EXEC) {
fprintf(stderr, "%s: %s is not an ELF executable\n", fprintf(stderr, "%s: %s is not an ELF executable\n",
prog_name, inname); prog_name, inname);
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include <asm/system.h> #include <asm/system.h>
#include <asm/asm-offsets.h> #include <asm/asm-offsets.h>
.section .text.head, "ax"
.globl swapper_pg_dir .globl swapper_pg_dir
.globl _stext .globl _stext
swapper_pg_dir=SWAPPER_PGD swapper_pg_dir=SWAPPER_PGD
......
...@@ -195,7 +195,7 @@ pcibios_init(void) ...@@ -195,7 +195,7 @@ pcibios_init(void)
subsys_initcall(pcibios_init); subsys_initcall(pcibios_init);
char * __init char * __devinit
pcibios_setup(char *str) pcibios_setup(char *str)
{ {
return str; return str;
...@@ -204,7 +204,7 @@ pcibios_setup(char *str) ...@@ -204,7 +204,7 @@ pcibios_setup(char *str)
#ifdef ALPHA_RESTORE_SRM_SETUP #ifdef ALPHA_RESTORE_SRM_SETUP
static struct pdev_srm_saved_conf *srm_saved_configs; static struct pdev_srm_saved_conf *srm_saved_configs;
void __init void __devinit
pdev_save_srm_config(struct pci_dev *dev) pdev_save_srm_config(struct pci_dev *dev)
{ {
struct pdev_srm_saved_conf *tmp; struct pdev_srm_saved_conf *tmp;
...@@ -247,14 +247,14 @@ pci_restore_srm_config(void) ...@@ -247,14 +247,14 @@ pci_restore_srm_config(void)
} }
#endif #endif
void __init void __devinit
pcibios_fixup_resource(struct resource *res, struct resource *root) pcibios_fixup_resource(struct resource *res, struct resource *root)
{ {
res->start += root->start; res->start += root->start;
res->end += root->start; res->end += root->start;
} }
void __init void __devinit
pcibios_fixup_device_resources(struct pci_dev *dev, struct pci_bus *bus) pcibios_fixup_device_resources(struct pci_dev *dev, struct pci_bus *bus)
{ {
/* Update device resources. */ /* Update device resources. */
...@@ -273,7 +273,7 @@ pcibios_fixup_device_resources(struct pci_dev *dev, struct pci_bus *bus) ...@@ -273,7 +273,7 @@ pcibios_fixup_device_resources(struct pci_dev *dev, struct pci_bus *bus)
} }
} }
void __init void __devinit
pcibios_fixup_bus(struct pci_bus *bus) pcibios_fixup_bus(struct pci_bus *bus)
{ {
/* Propagate hose info into the subordinate devices. */ /* Propagate hose info into the subordinate devices. */
......
...@@ -58,7 +58,7 @@ size_for_memory(unsigned long max) ...@@ -58,7 +58,7 @@ size_for_memory(unsigned long max)
return max; return max;
} }
struct pci_iommu_arena * struct pci_iommu_arena * __init
iommu_arena_new_node(int nid, struct pci_controller *hose, dma_addr_t base, iommu_arena_new_node(int nid, struct pci_controller *hose, dma_addr_t base,
unsigned long window_size, unsigned long align) unsigned long window_size, unsigned long align)
{ {
...@@ -117,7 +117,7 @@ iommu_arena_new_node(int nid, struct pci_controller *hose, dma_addr_t base, ...@@ -117,7 +117,7 @@ iommu_arena_new_node(int nid, struct pci_controller *hose, dma_addr_t base,
return arena; return arena;
} }
struct pci_iommu_arena * struct pci_iommu_arena * __init
iommu_arena_new(struct pci_controller *hose, dma_addr_t base, iommu_arena_new(struct pci_controller *hose, dma_addr_t base,
unsigned long window_size, unsigned long align) unsigned long window_size, unsigned long align)
{ {
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/err.h>
#include <linux/threads.h> #include <linux/threads.h>
#include <linux/smp.h> #include <linux/smp.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
...@@ -358,7 +359,7 @@ secondary_cpu_start(int cpuid, struct task_struct *idle) ...@@ -358,7 +359,7 @@ secondary_cpu_start(int cpuid, struct task_struct *idle)
/* /*
* Bring one cpu online. * Bring one cpu online.
*/ */
static int __devinit static int __cpuinit
smp_boot_one_cpu(int cpuid) smp_boot_one_cpu(int cpuid)
{ {
struct task_struct *idle; struct task_struct *idle;
...@@ -487,7 +488,7 @@ smp_prepare_boot_cpu(void) ...@@ -487,7 +488,7 @@ smp_prepare_boot_cpu(void)
{ {
} }
int __devinit int __cpuinit
__cpu_up(unsigned int cpu) __cpu_up(unsigned int cpu)
{ {
smp_boot_one_cpu(cpu); smp_boot_one_cpu(cpu);
...@@ -541,7 +542,7 @@ smp_percpu_timer_interrupt(struct pt_regs *regs) ...@@ -541,7 +542,7 @@ smp_percpu_timer_interrupt(struct pt_regs *regs)
set_irq_regs(old_regs); set_irq_regs(old_regs);
} }
int __init int
setup_profiling_timer(unsigned int multiplier) setup_profiling_timer(unsigned int multiplier)
{ {
return -EINVAL; return -EINVAL;
......
...@@ -15,6 +15,7 @@ SECTIONS ...@@ -15,6 +15,7 @@ SECTIONS
_text = .; /* Text and read-only data */ _text = .; /* Text and read-only data */
.text : { .text : {
*(.text.head)
TEXT_TEXT TEXT_TEXT
SCHED_TEXT SCHED_TEXT
LOCK_TEXT LOCK_TEXT
......
...@@ -267,8 +267,7 @@ callback_init(void * kernel_end) ...@@ -267,8 +267,7 @@ callback_init(void * kernel_end)
/* /*
* paging_init() sets up the memory map. * paging_init() sets up the memory map.
*/ */
void void __init paging_init(void)
paging_init(void)
{ {
unsigned long zones_size[MAX_NR_ZONES] = {0, }; unsigned long zones_size[MAX_NR_ZONES] = {0, };
unsigned long dma_pfn, high_pfn; unsigned long dma_pfn, high_pfn;
......
...@@ -341,6 +341,7 @@ config ARCH_PXA ...@@ -341,6 +341,7 @@ config ARCH_PXA
select ARCH_MTD_XIP select ARCH_MTD_XIP
select GENERIC_GPIO select GENERIC_GPIO
select GENERIC_TIME select GENERIC_TIME
select GENERIC_CLOCKEVENTS
help help
Support for Intel's PXA2XX processor line. Support for Intel's PXA2XX processor line.
...@@ -990,8 +991,6 @@ source "drivers/pnp/Kconfig" ...@@ -990,8 +991,6 @@ source "drivers/pnp/Kconfig"
source "drivers/block/Kconfig" source "drivers/block/Kconfig"
source "drivers/acorn/block/Kconfig"
if PCMCIA || ARCH_CLPS7500 || ARCH_IOP32X || ARCH_IOP33X || ARCH_IXP4XX \ if PCMCIA || ARCH_CLPS7500 || ARCH_IOP32X || ARCH_IOP33X || ARCH_IXP4XX \
|| ARCH_L7200 || ARCH_LH7A40X || ARCH_PXA || ARCH_RPC \ || ARCH_L7200 || ARCH_LH7A40X || ARCH_PXA || ARCH_RPC \
|| ARCH_S3C2410 || ARCH_SA1100 || ARCH_SHARK || FOOTBRIDGE \ || ARCH_S3C2410 || ARCH_SA1100 || ARCH_SHARK || FOOTBRIDGE \
......
...@@ -46,7 +46,7 @@ fast_work_pending: ...@@ -46,7 +46,7 @@ fast_work_pending:
work_pending: work_pending:
tst r1, #_TIF_NEED_RESCHED tst r1, #_TIF_NEED_RESCHED
bne work_resched bne work_resched
tst r1, #_TIF_NOTIFY_RESUME | _TIF_SIGPENDING tst r1, #_TIF_SIGPENDING
beq no_work_pending beq no_work_pending
mov r0, sp @ 'regs' mov r0, sp @ 'regs'
mov r2, why @ 'syscall' mov r2, why @ 'syscall'
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include <linux/cpu.h> #include <linux/cpu.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/smp.h> #include <linux/smp.h>
#include <linux/fs.h>
#include <asm/cpu.h> #include <asm/cpu.h>
#include <asm/elf.h> #include <asm/elf.h>
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include <linux/profile.h> #include <linux/profile.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/err.h>
#include <linux/cpu.h> #include <linux/cpu.h>
#include <linux/smp.h> #include <linux/smp.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
...@@ -630,7 +631,7 @@ void smp_send_stop(void) ...@@ -630,7 +631,7 @@ void smp_send_stop(void)
/* /*
* not supported here * not supported here
*/ */
int __init setup_profiling_timer(unsigned int multiplier) int setup_profiling_timer(unsigned int multiplier)
{ {
return -EINVAL; return -EINVAL;
} }
......
...@@ -352,10 +352,8 @@ asmlinkage void __exception do_undefinstr(struct pt_regs *regs) ...@@ -352,10 +352,8 @@ asmlinkage void __exception do_undefinstr(struct pt_regs *regs)
asmlinkage void do_unexp_fiq (struct pt_regs *regs) asmlinkage void do_unexp_fiq (struct pt_regs *regs)
{ {
#ifndef CONFIG_IGNORE_FIQ
printk("Hmm. Unexpected FIQ received, but trying to continue\n"); printk("Hmm. Unexpected FIQ received, but trying to continue\n");
printk("You may have a hardware problem...\n"); printk("You may have a hardware problem...\n");
#endif
} }
/* /*
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
* *
* HP Jornada720 init code * HP Jornada720 init code
* *
* Copyright (C) 2007 Kristoffer Ericson <Kristoffer.Ericson@gmail.com>
* Copyright (C) 2006 Filip Zyzniewski <filip.zyzniewski@tefnet.pl> * Copyright (C) 2006 Filip Zyzniewski <filip.zyzniewski@tefnet.pl>
* Copyright (C) 2005 Michael Gernoth <michael@gernoth.net> * Copyright (C) 2005 Michael Gernoth <michael@gernoth.net>
* *
...@@ -220,14 +221,16 @@ static struct platform_device sa1111_device = { ...@@ -220,14 +221,16 @@ static struct platform_device sa1111_device = {
.resource = sa1111_resources, .resource = sa1111_resources,
}; };
static struct platform_device jornada720_mcu_device = { static struct platform_device jornada_ssp_device = {
.name = "jornada720_mcu", .name = "jornada_ssp",
.id = -1, .id = -1,
}; };
static struct platform_device *devices[] __initdata = { static struct platform_device *devices[] __initdata = {
&sa1111_device, &sa1111_device,
&jornada720_mcu_device, #ifdef CONFIG_SA1100_JORNADA720_SSP
&jornada_ssp_device,
#endif
&s1d13xxxfb_device, &s1d13xxxfb_device,
}; };
...@@ -236,19 +239,19 @@ static int __init jornada720_init(void) ...@@ -236,19 +239,19 @@ static int __init jornada720_init(void)
int ret = -ENODEV; int ret = -ENODEV;
if (machine_is_jornada720()) { if (machine_is_jornada720()) {
GPDR |= GPIO_GPIO20; /* we want to use gpio20 as input to drive the clock of our uart 3 */
/* oscillator setup (line 116 of HP's doc) */ GPDR |= GPIO_GPIO20; /* Clear gpio20 pin as input */
TUCR = TUCR_VAL; TUCR = TUCR_VAL;
/* resetting SA1111 (line 118 of HP's doc) */ GPSR = GPIO_GPIO20; /* start gpio20 pin */
GPSR = GPIO_GPIO20;
udelay(1); udelay(1);
GPCR = GPIO_GPIO20; GPCR = GPIO_GPIO20; /* stop gpio20 */
udelay(1); udelay(1);
GPSR = GPIO_GPIO20; GPSR = GPIO_GPIO20; /* restart gpio20 */
udelay(20); udelay(20); /* give it some time to restart */
ret = platform_add_devices(devices, ARRAY_SIZE(devices)); ret = platform_add_devices(devices, ARRAY_SIZE(devices));
} }
return ret; return ret;
} }
...@@ -345,7 +348,7 @@ static void __init jornada720_mach_init(void) ...@@ -345,7 +348,7 @@ static void __init jornada720_mach_init(void)
} }
MACHINE_START(JORNADA720, "HP Jornada 720") MACHINE_START(JORNADA720, "HP Jornada 720")
/* Maintainer: Michael Gernoth <michael@gernoth.net> */ /* Maintainer: Kristoffer Ericson <Kristoffer.Ericson@gmail.com> */
.phys_io = 0x80000000, .phys_io = 0x80000000,
.io_pg_offst = ((0xf8000000) >> 18) & 0xfffc, .io_pg_offst = ((0xf8000000) >> 18) & 0xfffc,
.boot_params = 0xc0000100, .boot_params = 0xc0000100,
......
...@@ -161,7 +161,7 @@ static int __init jornada_ssp_probe(struct platform_device *dev) ...@@ -161,7 +161,7 @@ static int __init jornada_ssp_probe(struct platform_device *dev)
ret = jornada_ssp_inout(GETBRIGHTNESS); ret = jornada_ssp_inout(GETBRIGHTNESS);
/* seems like it worked, just feed it with TxDummy to get rid of data */ /* seems like it worked, just feed it with TxDummy to get rid of data */
if (ret == TxDummy) if (ret == TXDUMMY)
jornada_ssp_inout(TXDUMMY); jornada_ssp_inout(TXDUMMY);
jornada_ssp_end(); jornada_ssp_end();
......
...@@ -9,5 +9,4 @@ nwfpe-y += fpa11.o fpa11_cpdo.o fpa11_cpdt.o \ ...@@ -9,5 +9,4 @@ nwfpe-y += fpa11.o fpa11_cpdo.o fpa11_cpdt.o \
softfloat.o single_cpdo.o double_cpdo.o softfloat.o single_cpdo.o double_cpdo.o
nwfpe-$(CONFIG_FPE_NWFPE_XP) += extended_cpdo.o nwfpe-$(CONFIG_FPE_NWFPE_XP) += extended_cpdo.o
nwfpe-$(CONFIG_CPU_26) += entry26.o
nwfpe-$(CONFIG_CPU_32) += entry.o nwfpe-$(CONFIG_CPU_32) += entry.o
/*
NetWinder Floating Point Emulator
(c) Rebel.COM, 1998
(c) Philip Blundell 1998-1999
Direct questions, comments to Scott Bambrough <scottb@netwinder.org>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <asm/asm-offsets.h>
/* This is the kernel's entry point into the floating point emulator.
It is called from the kernel with code similar to this:
mov fp, #0
teqp pc, #PSR_I_BIT | SVC_MODE
ldr r4, .LC2
ldr pc, [r4] @ Call FP module USR entry point
The kernel expects the emulator to return via one of two possible
points of return it passes to the emulator. The emulator, if
successful in its emulation, jumps to ret_from_exception and the
kernel takes care of returning control from the trap to the user code.
If the emulator is unable to emulate the instruction, it returns to
fpundefinstr and the kernel halts the user program with a core dump.
This routine does four things:
1) It saves SP into a variable called userRegisters. The kernel has
created a struct pt_regs on the stack and saved the user registers
into it. See /usr/include/asm/proc/ptrace.h for details. The
emulator code uses userRegisters as the base of an array of words from
which the contents of the registers can be extracted.
2) It locates the FP emulator work area within the TSS structure and
points `fpa11' to it.
3) It calls EmulateAll to emulate a floating point instruction.
EmulateAll returns 1 if the emulation was successful, or 0 if not.
4) If an instruction has been emulated successfully, it looks ahead at
the next instruction. If it is a floating point instruction, it
executes the instruction, without returning to user space. In this
way it repeatedly looks ahead and executes floating point instructions
until it encounters a non floating point instruction, at which time it
returns via _fpreturn.
This is done to reduce the effect of the trap overhead on each
floating point instructions. GCC attempts to group floating point
instructions to allow the emulator to spread the cost of the trap over
several floating point instructions. */
.globl nwfpe_enter
nwfpe_enter:
mov sl, sp
ldr r5, [sp, #60] @ get contents of PC
bic r5, r5, #0xfc000003
ldr r0, [r5, #-4] @ get actual instruction into r0
bl EmulateAll @ emulate the instruction
1: cmp r0, #0 @ was emulation successful
beq fpundefinstr @ no, return failure
next:
.Lx1: ldrt r6, [r5], #4 @ get the next instruction and
@ increment PC
and r2, r6, #0x0F000000 @ test for FP insns
teq r2, #0x0C000000
teqne r2, #0x0D000000
teqne r2, #0x0E000000
bne ret_from_exception @ return ok if not a fp insn
ldr r9, [sp, #60] @ get new condition codes
and r9, r9, #0xfc000003
orr r7, r5, r9
str r7, [sp, #60] @ update PC copy in regs
mov r0, r6 @ save a copy
mov r1, r9 @ fetch the condition codes
bl checkCondition @ check the condition
cmp r0, #0 @ r0 = 0 ==> condition failed
@ if condition code failed to match, next insn
beq next @ get the next instruction;
mov r0, r6 @ prepare for EmulateAll()
adr lr, 1b
orr lr, lr, #3
b EmulateAll @ if r0 != 0, goto EmulateAll
.Lret: b ret_from_exception @ let the user eat segfaults
@ We need to be prepared for the instruction at .Lx1 to fault.
@ Emit the appropriate exception gunk to fix things up.
.section __ex_table,"a"
.align 3
.long .Lx1
ldr lr, [lr, $(.Lret - .Lx1)/4]
.previous
...@@ -161,11 +161,11 @@ static void mbox_rx_work(struct work_struct *work) ...@@ -161,11 +161,11 @@ static void mbox_rx_work(struct work_struct *work)
/* /*
* Mailbox interrupt handler * Mailbox interrupt handler
*/ */
static void mbox_txq_fn(request_queue_t * q) static void mbox_txq_fn(struct request_queue * q)
{ {
} }
static void mbox_rxq_fn(request_queue_t * q) static void mbox_rxq_fn(struct request_queue * q)
{ {
} }
...@@ -180,7 +180,7 @@ static void __mbox_rx_interrupt(struct omap_mbox *mbox) ...@@ -180,7 +180,7 @@ static void __mbox_rx_interrupt(struct omap_mbox *mbox)
{ {
struct request *rq; struct request *rq;
mbox_msg_t msg; mbox_msg_t msg;
request_queue_t *q = mbox->rxq->queue; struct request_queue *q = mbox->rxq->queue;
disable_mbox_irq(mbox, IRQ_RX); disable_mbox_irq(mbox, IRQ_RX);
...@@ -297,7 +297,7 @@ static struct omap_mbox_queue *mbox_queue_alloc(struct omap_mbox *mbox, ...@@ -297,7 +297,7 @@ static struct omap_mbox_queue *mbox_queue_alloc(struct omap_mbox *mbox,
request_fn_proc * proc, request_fn_proc * proc,
void (*work) (struct work_struct *)) void (*work) (struct work_struct *))
{ {
request_queue_t *q; struct request_queue *q;
struct omap_mbox_queue *mq; struct omap_mbox_queue *mq;
mq = kzalloc(sizeof(struct omap_mbox_queue), GFP_KERNEL); mq = kzalloc(sizeof(struct omap_mbox_queue), GFP_KERNEL);
......
The work in this architecture (ARM26) is that of a great many people.
This is what has happened:
I [Ian Molton] have been trying to repair the ARM26 architecture support, but it has become an impossible task whilst it is still merged with the ARM32 (arch/arm) code. The ARM26 code is too different to be sensible to keep with the ARM32 code now, and Russell King really doesnt have the time to maintain the ARM26 code. Add to that that most ARM32 developers dont know about or care about ARM26 when writing patches, and you have a reall mess.
As a result, I've split it off into a new architecture of its own. I've named it arm26 since these CPUs have only a 26 bit address space, unlike the other ARMs.
The upheaval in moving around so many source files and chopping out vasty ammounts of cruft was enormous, and the copyright of many files is sometimes unclear. Because of this, I am writing this, in order that no-one is left out / misaccredited / blamed for any of the code.
People I KNOW have made major contributions to the code:
David Alan Gilbert (former maintainer of ARM26 bits)
Philip Blundell
Russell King
Keith Owens
also thanks to Nicholas Pitre for hints, and for the basis or our XIP support.
Currently maintaing the code are
Ian Molton (Maintainer / Archimedes)
John Appleby (kernel / A5K)
If anyone has a problem with attributions in header files / source files, please do contact me to straighten things out.
Ian Molton (aka spyro) - ARM26 maintainer
spyro@f2s.com
#
# For a description of the syntax of this configuration file,
# see Documentation/kbuild/kconfig-language.txt.
#
mainmenu "Linux Kernel Configuration"
config ARM
bool
default y
config ARM26
bool
default y
config MMU
bool
default y
config NO_DMA
def_bool y
config ARCH_ACORN
bool
default y
config CPU_26
bool
default y
config FIQ
bool
default y
# 9 = 512 pages 8 = 256 pages 7 = 128 pages
config FORCE_MAX_ZONEORDER
int
default 9
config RWSEM_GENERIC_SPINLOCK
bool
default y
config RWSEM_XCHGADD_ALGORITHM
bool
config ARCH_HAS_ILOG2_U32
bool
default n
config ARCH_HAS_ILOG2_U64
bool
default n
config GENERIC_HWEIGHT
bool
default y
config GENERIC_CALIBRATE_DELAY
bool
default y
config ZONE_DMA
bool
default y
config GENERIC_ISA_DMA
bool
config ARCH_MAY_HAVE_PC_FDC
bool
source "init/Kconfig"
menu "System Type"
choice
prompt "Archimedes/A5000 Implementations"
config ARCH_ARC
bool "Archimedes"
help
Say Y to support the Acorn Archimedes.
The Acorn Archimedes was an personal computer based on an 8MHz ARM2
processor, released in 1987. It supported up to 16MB of RAM in
later models and floppy, harddisc, ethernet etc.
config ARCH_A5K
bool "A5000"
select ARCH_MAY_HAVE_PC_FDC
help
Say Y here to support the Acorn A5000.
Linux can support the
internal IDE disk and CD-ROM interface, serial and parallel port,
and the floppy drive. Note that on some A5000s the floppy is
plugged into the wrong socket on the motherboard.
config PAGESIZE_16
bool "2MB physical memory (broken)"
help
Say Y here if your Archimedes or A5000 system has only 2MB of
memory, otherwise say N. The resulting kernel will not run on a
machine with 4MB of memory.
endchoice
endmenu
config ISA_DMA_API
bool
default y
menu "General setup"
# Compressed boot loader in ROM. Yes, we really want to ask about
# TEXT and BSS so we preserve their values in the config files.
config ZBOOT_ROM
bool "Compressed boot loader in ROM/flash"
help
Say Y here if you intend to execute your compressed kernel image (zImage)
directly from ROM or flash. If unsure, say N.
config ZBOOT_ROM_TEXT
depends on ZBOOT_ROM
hex "Compressed ROM boot loader base address"
default "0"
help
The base address for zImage. Unless you have special requirements, you
should not change this value.
config ZBOOT_ROM_BSS
depends on ZBOOT_ROM
hex "Compressed ROM boot loader BSS address"
default "0"
help
The base address of 64KiB of read/write memory, which must be available
while the decompressor is running. Unless you have special requirements,
you should not change this value.
config XIP_KERNEL
bool "Execute In Place (XIP) kernel image"
help
Select this option to create a kernel that can be programmed into
the OS ROMs.
comment "At least one math emulation must be selected"
config FPE_NWFPE
tristate "NWFPE math emulation"
---help---
Say Y to include the NWFPE floating point emulator in the kernel.
This is necessary to run most binaries. Linux does not currently
support floating point hardware so you need to say Y here even if
your machine has an FPA or floating point co-processor module.
It is also possible to say M to build the emulator as a module
(nwfpe) or indeed to leave it out altogether. However, unless you
know what you are doing this can easily render your machine
unbootable. Saying Y is the safe option.
You may say N here if you are going to load the Acorn FPEmulator
early in the bootup.
source "fs/Kconfig.binfmt"
config PREEMPT
bool "Preemptible Kernel (EXPERIMENTAL)"
depends on CPU_32 && EXPERIMENTAL
help
This option reduces the latency of the kernel when reacting to
real-time or interactive events by allowing a low priority process to
be preempted even if it is in kernel mode executing a system call.
This allows applications to run more reliably even when the system is
under load.
Say Y here if you are building a kernel for a desktop, embedded
or real-time system. Say N if you are unsure.
config ARTHUR
tristate "RISC OS personality"
depends on CPU_32
help
Say Y here to include the kernel code necessary if you want to run
Acorn RISC OS/Arthur binaries under Linux. This code is still very
experimental; if this sounds frightening, say N and sleep in peace.
You can also say M here to compile this support as a module (which
will be called arthur).
config CMDLINE
string "Default kernel command string"
default ""
help
On some architectures (EBSA110 and CATS), there is currently no way
for the boot loader to pass arguments to the kernel. For these
architectures, you should supply some command-line options at build
time by entering them here. As a minimum, you should specify the
memory size and the root device (e.g., mem=64M root=/dev/nfs).
source "mm/Kconfig"
endmenu
source "net/Kconfig"
source "drivers/base/Kconfig"
source "drivers/parport/Kconfig"
source "drivers/pnp/Kconfig"
source "drivers/block/Kconfig"
source "drivers/md/Kconfig"
source "drivers/net/Kconfig"
source "drivers/ide/Kconfig"
source "drivers/scsi/Kconfig"
source "drivers/isdn/Kconfig"
#
# input before char - char/joystick depends on it. As does USB.
#
source "drivers/input/Kconfig"
source "drivers/char/Kconfig"
source "drivers/media/Kconfig"
source "fs/Kconfig"
source "drivers/video/Kconfig"
if ARCH_ACORN
source "sound/Kconfig"
endif
source "drivers/misc/Kconfig"
source "drivers/usb/Kconfig"
source "arch/arm26/Kconfig.debug"
source "security/Kconfig"
source "crypto/Kconfig"
source "lib/Kconfig"
menu "Kernel hacking"
source "lib/Kconfig.debug"
# RMK wants arm kernels compiled with frame pointers so hardwire this to y.
# If you know what you are doing and are willing to live without stack
# traces, you can get a slightly smaller kernel by setting this option to
# n, but then RMK will have to kill you ;).
config FRAME_POINTER
bool
default y
help
If you say N here, the resulting kernel will be slightly smaller and
faster. However, when a problem occurs with the kernel, the
information that is reported is severely limited. Most people
should say Y here.
config DEBUG_USER
bool "Verbose user fault messages"
help
When a user program crashes due to an exception, the kernel can
print a brief message explaining what the problem was. This is
sometimes helpful for debugging but serves no purpose on a
production system. Most people should say N here.
config DEBUG_WAITQ
bool "Wait queue debugging"
depends on DEBUG_KERNEL
config DEBUG_ERRORS
bool "Verbose kernel error messages"
depends on DEBUG_KERNEL
help
This option controls verbose debugging information which can be
printed when the kernel detects an internal error. This debugging
information is useful to kernel hackers when tracking down problems,
but mostly meaningless to other people. It's safe to say Y unless
you are concerned with the code size or don't want to see these
messages.
# These options are only for real kernel hackers who want to get their hands dirty.
config DEBUG_LL
bool "Kernel low-level debugging functions"
depends on DEBUG_KERNEL
help
Say Y here to include definitions of printascii, printchar, printhex
in the kernel. This is helpful if you are debugging code that
executes before the console is initialized.
endmenu
#
# arch/arm26/Makefile
#
# This file is included by the global makefile so that you can add your own
# architecture-specific flags and dependencies.
#
# This file is subject to the terms and conditions of the GNU General Public
# License. See the file "COPYING" in the main directory of this archive
# for more details.
#
# Copyright (C) 1995-2001 by Russell King
# Copyright (c) 2004 Ian Molton
LDFLAGS_vmlinux :=-p -X
CPPFLAGS_vmlinux.lds = -DTEXTADDR=$(TEXTADDR) -DDATAADDR=$(DATAADDR)
OBJCOPYFLAGS :=-O binary -R .note -R .comment -S
GZFLAGS :=-9
ifeq ($(CONFIG_FRAME_POINTER),y)
CFLAGS +=-fno-omit-frame-pointer -mno-sched-prolog
endif
CFLAGS_BOOT :=-mapcs-26 -mcpu=arm3 -msoft-float -Uarm
CFLAGS +=-mapcs-26 -mcpu=arm3 -msoft-float -Uarm
AFLAGS +=-mapcs-26 -mcpu=arm3 -msoft-float
ifeq ($(CONFIG_XIP_KERNEL),y)
TEXTADDR := 0x03880000
DATAADDR := 0x02080000
else
TEXTADDR := 0x02080000
DATAADDR := .
endif
head-y := arch/arm26/kernel/head.o arch/arm26/kernel/init_task.o
ifeq ($(incdir-y),)
incdir-y :=
endif
INCDIR :=
export MACHINE TEXTADDR GZFLAGS CFLAGS_BOOT
# If we have a machine-specific directory, then include it in the build.
core-y += arch/arm26/kernel/ arch/arm26/mm/ arch/arm26/machine/
core-$(CONFIG_FPE_NWFPE) += arch/arm26/nwfpe/
libs-y += arch/arm26/lib/
# Default target when executing plain make
all: zImage
boot := arch/arm26/boot
PHONY += maketools FORCE
maketools: FORCE
# Convert bzImage to zImage
bzImage: vmlinux
$(Q)$(MAKE) $(build)=$(boot) $(boot)/zImage
zImage Image bootpImage xipImage: vmlinux
$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
zinstall install: vmlinux
$(Q)$(MAKE) $(build)=$(boot) $@
# We use MRPROPER_FILES and CLEAN_FILES now
archclean:
$(Q)$(MAKE) $(clean)=$(boot)
# My testing targets (that short circuit a few dependencies)
zImg:; $(Q)$(MAKE) $(build)=$(boot) $(boot)/zImage
Img:; $(Q)$(MAKE) $(build)=$(boot) $(boot)/Image
bp:; $(Q)$(MAKE) $(build)=$(boot) $(boot)/bootpImage
i:; $(Q)$(MAKE) $(build)=$(boot) install
zi:; $(Q)$(MAKE) $(build)=$(boot) zinstall
#
# Configuration targets. Use these to select a
# configuration for your architecture
%_config:
@( \
CFG=$(@:_config=); \
if [ -f arch/arm26/def-configs/$$CFG ]; then \
[ -f .config ] && mv -f .config .config.old; \
cp arch/arm26/def-configs/$$CFG .config; \
echo "*** Default configuration for $$CFG installed"; \
echo "*** Next, you may run 'make oldconfig'"; \
else \
echo "$$CFG does not exist"; \
fi; \
)
define archhelp
echo '* zImage - Compressed kernel image (arch/$(ARCH)/boot/zImage)'
echo ' Image - Uncompressed kernel image (arch/$(ARCH)/boot/Image)'
echo ' bootpImage - Combined zImage and initial RAM disk'
echo ' xipImage - eXecute In Place capable image for ROM use (arch/$(ARCH)/boot/xipImage)'
echo ' initrd - Create an initial image'
echo ' install - Install uncompressed kernel'
echo ' zinstall - Install compressed kernel'
echo ' Install using (your) ~/bin/installkernel or'
echo ' (distribution) /sbin/installkernel or'
echo ' install to $$(INSTALL_PATH) and run lilo'
endef
#
# arch/arm26/boot/Makefile
#
# This file is included by the global makefile so that you can add your own
# architecture-specific flags and dependencies.
#
# This file is subject to the terms and conditions of the GNU General Public
# License. See the file "COPYING" in the main directory of this archive
# for more details.
#
# Copyright (C) 1995-2002 Russell King
#
# Note: the following conditions must always be true:
# ZRELADDR == virt_to_phys(TEXTADDR)
# PARAMS_PHYS must be with 4MB of ZRELADDR
# INITRD_PHYS must be in RAM
zreladdr-y := 0x02080000
params_phys-y := 0x0207c000
initrd_phys-y := 0x02180000
ZRELADDR := 0x02080000
ZTEXTADDR := 0x0207c000
PARAMS_PHYS := $(params_phys-y)
INITRD_PHYS := 0x02180000
# We now have a PIC decompressor implementation. Decompressors running
# from RAM should not define ZTEXTADDR. Decompressors running directly
# from ROM or Flash must define ZTEXTADDR (preferably via the config)
# FIXME: Previous assignment to ztextaddr-y is lost here. See SHARK
ifeq ($(CONFIG_ZBOOT_ROM),y)
ZTEXTADDR := $(CONFIG_ZBOOT_ROM_TEXT)
ZBSSADDR := $(CONFIG_ZBOOT_ROM_BSS)
else
ZTEXTADDR := 0
ZBSSADDR := ALIGN(4)
endif
export ZTEXTADDR ZBSSADDR ZRELADDR INITRD_PHYS PARAMS_PHYS
targets := Image zImage bootpImage xipImage
$(obj)/Image: vmlinux FORCE
$(call if_changed,objcopy)
@echo ' Kernel: $@ is ready'
$(obj)/zImage: $(obj)/compressed/vmlinux FORCE
$(call if_changed,objcopy)
@echo ' Kernel: $@ is ready'
$(obj)/compressed/vmlinux: vmlinux FORCE
$(Q)$(MAKE) $(build)=$(obj)/compressed $@
ifeq ($(CONFIG_XIP_KERNEL),y)
$(obj)/xipImage: vmlinux FORCE
# $(OBJCOPY) -S -O binary -R .data -R .comment vmlinux vmlinux-text.bin
# FIXME - where has .pci_fixup crept in from?
$(OBJCOPY) -S -O binary -R .data -R .pci_fixup -R .comment vmlinux vmlinux-text.bin
$(OBJCOPY) -S -O binary -R .init -R .text -R __ex_table -R .pci_fixup -R __ksymtab -R __ksymtab_gpl -R __kcrctab -R __kcrctab_gpl -R __param -R .comment vmlinux vmlinux-data.bin
cat vmlinux-text.bin vmlinux-data.bin > $@
$(RM) -f vmlinux-text.bin vmlinux-data.bin
@echo ' Kernel: $@ is ready'
endif
PHONY += initrd
initrd:
@test "$(INITRD_PHYS)" != "" || \
(echo This machine does not support INITRD; exit -1)
@test "$(INITRD)" != "" || \
(echo You must specify INITRD; exit -1)
install: $(obj)/Image
$(CONFIG_SHELL) $(obj)/install.sh \
$(KERNELRELEASE) \
$(obj)/Image System.map "$(INSTALL_PATH)"
zinstall: $(obj)/zImage
$(CONFIG_SHELL) $(obj)/install.sh \
$(KERNELRELEASE) \
$(obj)/zImage System.map "$(INSTALL_PATH)"
subdir- := compressed
#
# linux/arch/arm26/boot/compressed/Makefile
#
# create a compressed vmlinuz image from the original vmlinux
#
# Note! ZTEXTADDR, ZBSSADDR and ZRELADDR are now exported
# from arch/arm26/boot/Makefile
#
HEAD = head.o
OBJS = misc.o
FONTC = drivers/video/console/font_acorn_8x8.c
OBJS += ll_char_wr.o font.o
CFLAGS_misc.o := -DPARAMS_PHYS=$(PARAMS_PHYS)
targets := vmlinux vmlinux.lds piggy piggy.gz piggy.o font.o head.o $(OBJS)
SEDFLAGS = s/TEXT_START/$(ZTEXTADDR)/;s/LOAD_ADDR/$(ZRELADDR)/;s/BSS_START/$(ZBSSADDR)/
EXTRA_CFLAGS := $(CFLAGS_BOOT) -fpic
EXTRA_AFLAGS := -traditional
LDFLAGS_vmlinux := -p -X \
$(shell $(CC) $(CFLAGS)) -T
$(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD) $(obj)/piggy.o \
$(addprefix $(obj)/, $(OBJS)) FORCE
$(call if_changed,ld)
@:
$(obj)/piggy: vmlinux FORCE
$(call if_changed,objcopy)
$(obj)/piggy.gz: $(obj)/piggy FORCE
$(call if_changed,gzip)
LDFLAGS_piggy.o := -r -b binary
$(obj)/piggy.o: $(obj)/piggy.gz FORCE
$(call if_changed,ld)
$(obj)/font.o: $(FONTC)
$(CC) $(CFLAGS) -Dstatic= -c $(FONTC) -o $(obj)/font.o
$(obj)/vmlinux.lds: $(obj)/vmlinux.lds.in Makefile arch/arm26/boot/Makefile .config
@sed "$(SEDFLAGS)" < $< > $@
$(obj)/misc.o: $(obj)/misc.c $(obj)/uncompress.h lib/inflate.c
此差异已折叠。
/*
* linux/arch/arm26/lib/ll_char_wr.S
*
* Copyright (C) 1995, 1996 Russell King.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* Speedups & 1bpp code (C) 1996 Philip Blundell & Russell King.
*
* 10-04-96 RMK Various cleanups & reduced register usage.
* 08-04-98 RMK Shifts re-ordered
*/
@ Regs: [] = corruptible
@ {} = used
@ () = do not use
#include <linux/linkage.h>
#include <asm/assembler.h>
.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
ENTRY(ll_write_char)
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
@
@ 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})
@
@ 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})
@
@ 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})
.bss
ENTRY(con_charconvtable)
.space 1024
此差异已折叠。
/*
*
* Copyright (C) 1996 Russell King
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#define VIDMEM ((char *)0x02000000)
int video_num_columns, video_num_lines, video_size_row;
int white, bytes_per_char_h;
extern unsigned long con_charconvtable[256];
struct param_struct {
unsigned long page_size;
unsigned long nr_pages;
unsigned long ramdisk_size;
unsigned long mountrootrdonly;
unsigned long rootdev;
unsigned long video_num_cols;
unsigned long video_num_rows;
unsigned long video_x;
unsigned long video_y;
unsigned long memc_control_reg;
unsigned char sounddefault;
unsigned char adfsdrives;
unsigned char bytes_per_char_h;
unsigned char bytes_per_char_v;
unsigned long unused[256/4-11];
};
static struct param_struct *params = (struct param_struct *)0x0207c000;
/*
* This does not append a newline
*/
static void puts(const char *s)
{
extern void ll_write_char(char *, unsigned long);
int x,y;
unsigned char c;
char *ptr;
x = params->video_x;
y = params->video_y;
while ( ( c = *(unsigned char *)s++ ) != '\0' ) {
if ( c == '\n' ) {
x = 0;
if ( ++y >= video_num_lines ) {
y--;
}
} else {
ptr = VIDMEM + ((y*video_num_columns*params->bytes_per_char_v+x)*bytes_per_char_h);
ll_write_char(ptr, c|(white<<16));
if ( ++x >= video_num_columns ) {
x = 0;
if ( ++y >= video_num_lines ) {
y--;
}
}
}
}
params->video_x = x;
params->video_y = y;
}
static void error(char *x);
/*
* Setup for decompression
*/
static void arch_decomp_setup(void)
{
int i;
video_num_lines = params->video_num_rows;
video_num_columns = params->video_num_cols;
bytes_per_char_h = params->bytes_per_char_h;
video_size_row = video_num_columns * bytes_per_char_h;
if (bytes_per_char_h == 4)
for (i = 0; i < 256; i++)
con_charconvtable[i] =
(i & 128 ? 1 << 0 : 0) |
(i & 64 ? 1 << 4 : 0) |
(i & 32 ? 1 << 8 : 0) |
(i & 16 ? 1 << 12 : 0) |
(i & 8 ? 1 << 16 : 0) |
(i & 4 ? 1 << 20 : 0) |
(i & 2 ? 1 << 24 : 0) |
(i & 1 ? 1 << 28 : 0);
else
for (i = 0; i < 16; i++)
con_charconvtable[i] =
(i & 8 ? 1 << 0 : 0) |
(i & 4 ? 1 << 8 : 0) |
(i & 2 ? 1 << 16 : 0) |
(i & 1 ? 1 << 24 : 0);
white = bytes_per_char_h == 8 ? 0xfc : 7;
if (params->nr_pages * params->page_size < 4096*1024) error("<4M of mem\n");
}
/*
* nothing to do
*/
#define arch_decomp_wdog()
/*
* linux/arch/arm26/boot/compressed/vmlinux.lds.in
*
* Copyright (C) 2000 Russell King
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = LOAD_ADDR;
_load_addr = .;
. = TEXT_START;
_text = .;
.text : {
_start = .;
*(.start)
*(.text)
*(.fixup)
*(.gnu.warning)
*(.rodata)
*(.rodata.*)
*(.glue_7)
*(.glue_7t)
input_data = .;
arch/arm26/boot/compressed/piggy.o
input_data_end = .;
. = ALIGN(4);
}
_etext = .;
_got_start = .;
.got : { *(.got) }
_got_end = .;
.got.plt : { *(.got.plt) }
.data : { *(.data) }
_edata = .;
. = BSS_START;
__bss_start = .;
.bss : { *(.bss) }
_end = .;
.stack (NOLOAD) : { *(.stack) }
.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) }
}
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册