mirror of
https://github.com/adulau/aha.git
synced 2024-12-27 03:06:10 +00:00
uninline check_signature()
This is a rather bizarre thing to have inlined in io.h. Stick it in lib/ instead. While we're there, despaghetti it a bit, and fix its off-by-one behaviour when passed a zero length. Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
4e7bd66318
commit
cc2ea416b2
3 changed files with 29 additions and 28 deletions
|
@ -63,32 +63,7 @@ void __iomem * devm_ioremap(struct device *dev, unsigned long offset,
|
||||||
void __iomem * devm_ioremap_nocache(struct device *dev, unsigned long offset,
|
void __iomem * devm_ioremap_nocache(struct device *dev, unsigned long offset,
|
||||||
unsigned long size);
|
unsigned long size);
|
||||||
void devm_iounmap(struct device *dev, void __iomem *addr);
|
void devm_iounmap(struct device *dev, void __iomem *addr);
|
||||||
|
int check_signature(const volatile void __iomem *io_addr,
|
||||||
/**
|
const unsigned char *signature, int length);
|
||||||
* check_signature - find BIOS signatures
|
|
||||||
* @io_addr: mmio address to check
|
|
||||||
* @signature: signature block
|
|
||||||
* @length: length of signature
|
|
||||||
*
|
|
||||||
* Perform a signature comparison with the mmio address io_addr. This
|
|
||||||
* address should have been obtained by ioremap.
|
|
||||||
* Returns 1 on a match.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static inline int check_signature(const volatile void __iomem *io_addr,
|
|
||||||
const unsigned char *signature, int length)
|
|
||||||
{
|
|
||||||
int retval = 0;
|
|
||||||
do {
|
|
||||||
if (readb(io_addr) != *signature)
|
|
||||||
goto out;
|
|
||||||
io_addr++;
|
|
||||||
signature++;
|
|
||||||
length--;
|
|
||||||
} while (length);
|
|
||||||
retval = 1;
|
|
||||||
out:
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* _LINUX_IO_H */
|
#endif /* _LINUX_IO_H */
|
||||||
|
|
|
@ -13,7 +13,7 @@ lib-$(CONFIG_SMP) += cpumask.o
|
||||||
lib-y += kobject.o kref.o kobject_uevent.o klist.o
|
lib-y += kobject.o kref.o kobject_uevent.o klist.o
|
||||||
|
|
||||||
obj-y += div64.o sort.o parser.o halfmd4.o debug_locks.o random32.o \
|
obj-y += div64.o sort.o parser.o halfmd4.o debug_locks.o random32.o \
|
||||||
bust_spinlocks.o hexdump.o
|
bust_spinlocks.o hexdump.o check_signature.o
|
||||||
|
|
||||||
ifeq ($(CONFIG_DEBUG_KOBJECT),y)
|
ifeq ($(CONFIG_DEBUG_KOBJECT),y)
|
||||||
CFLAGS_kobject.o += -DDEBUG
|
CFLAGS_kobject.o += -DDEBUG
|
||||||
|
|
26
lib/check_signature.c
Normal file
26
lib/check_signature.c
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
#include <linux/io.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* check_signature - find BIOS signatures
|
||||||
|
* @io_addr: mmio address to check
|
||||||
|
* @signature: signature block
|
||||||
|
* @length: length of signature
|
||||||
|
*
|
||||||
|
* Perform a signature comparison with the mmio address io_addr. This
|
||||||
|
* address should have been obtained by ioremap.
|
||||||
|
* Returns 1 on a match.
|
||||||
|
*/
|
||||||
|
|
||||||
|
int check_signature(const volatile void __iomem *io_addr,
|
||||||
|
const unsigned char *signature, int length)
|
||||||
|
{
|
||||||
|
while (length--) {
|
||||||
|
if (readb(io_addr) != *signature)
|
||||||
|
return 0;
|
||||||
|
io_addr++;
|
||||||
|
signature++;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(check_signature);
|
Loading…
Reference in a new issue