lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:	Mon, 29 Jun 2009 19:18:45 +0800
From:	liqin.chen@...plusct.com
To:	Arnd Bergmann <arnd@...db.de>
Cc:	linux-kernel@...r.kernel.org
Subject: Re: [PATCH 0/6] score cleanups

Arnd Bergmann <arnd@...db.de> 写于 2009-06-27 22:08:12:

> Hi Liqin,
> 
> I've gone over your code a bit with sparse and some clues,
> cleaning up some areas that stuck out.
> 
> Please check that these make sense.

Hi Arnd,

Code updating had finished and verified.

Best Regards
Liqin
---

From 05e9377257fcb80de597409989ef2cb715e3827c Mon Sep 17 00:00:00 2001
From: Chen Liqin <liqin.chen@...plusct.com>
Date: Mon, 29 Jun 2009 19:01:44 +0800
Subject: [PATCH] score: code cleanups

        score: add missing #includes
        score: add address space annotations
        score: fix function prototypes
        score: cleanups: dead code, 0 as pointer, shadowed variables
        score: make irq.h definitions local
 
        modified:   arch/score/include/asm/irq.h
        modified:   arch/score/include/asm/uaccess.h
        new file:   arch/score/include/asm/ucontext.h
        modified:   arch/score/kernel/irq.c
        modified:   arch/score/kernel/module.c
        modified:   arch/score/kernel/process.c
        modified:   arch/score/kernel/ptrace.c
        modified:   arch/score/kernel/signal.c
        modified:   arch/score/kernel/sys_score.c
        modified:   arch/score/kernel/time.c
        modified:   arch/score/mm/init.c

Signed-off-by: Chen Liqin <liqin.chen@...plusct.com>
Signed-off-by: Arnd Bergmann <arnd@...db.de>
---
 arch/score/include/asm/irq.h      |   19 +++++++++--------
 arch/score/include/asm/uaccess.h  |    8 +++---
 arch/score/include/asm/ucontext.h |    6 +++++
 arch/score/kernel/irq.c           |   20 +++++++++---------
 arch/score/kernel/module.c        |   13 ++++++-----
 arch/score/kernel/process.c       |    3 ++
 arch/score/kernel/ptrace.c        |    7 +++--
 arch/score/kernel/signal.c        |   39 
++++++++++++++++++++----------------
 arch/score/kernel/sys_score.c     |   26 ++++++++----------------
 arch/score/kernel/time.c          |    2 +-
 arch/score/mm/init.c              |   35 ++++++++++----------------------
 11 files changed, 87 insertions(+), 91 deletions(-)
 create mode 100644 arch/score/include/asm/ucontext.h

diff --git a/arch/score/include/asm/irq.h b/arch/score/include/asm/irq.h
index 401f670..806aaf2 100644
--- a/arch/score/include/asm/irq.h
+++ b/arch/score/include/asm/irq.h
@@ -18,15 +18,16 @@
 
 #define irq_canonicalize(irq)  (irq)
 
-#define P_INT_PNDL             0x95F50000
-#define P_INT_PNDH             0x95F50004
-#define P_INT_PRIORITY_M       0x95F50008
-#define P_INT_PRIORITY_SG0     0x95F50010
-#define P_INT_PRIORITY_SG1     0x95F50014
-#define P_INT_PRIORITY_SG2     0x95F50018
-#define P_INT_PRIORITY_SG3     0x95F5001C
-#define P_INT_MASKL            0x95F50020
-#define P_INT_MASKH            0x95F50024
+#define INTC_BASE              ((u32 __iomem __force *)0x95f50000)
+#define INT_PNDL               0               /* 0x9f5c0000 */
+#define INT_PNDH               1               /* 0x9f5c0004 */
+#define INT_PRIORITY_M         2               /* 0x9f5c0008 */
+#define INT_PRIORITY_SG0       4               /* 0x9f5c0010 */
+#define INT_PRIORITY_SG1       5               /* 0x9f5c0014 */
+#define INT_PRIORITY_SG2       6               /* 0x9f5c0018 */
+#define INT_PRIORITY_SG3       7               /* 0x9f5c001C */
+#define INT_MASKL              8               /* 0x9f5c0020 */
+#define INT_MASKH              9               /* 0x9f5c0024 */
 
 #define IRQ_TIMER (7)          /* Timer IRQ number of SPCT6600 */
 
diff --git a/arch/score/include/asm/uaccess.h 
b/arch/score/include/asm/uaccess.h
index 43ce28a..98fdb6f 100644
--- a/arch/score/include/asm/uaccess.h
+++ b/arch/score/include/asm/uaccess.h
@@ -13,12 +13,12 @@ extern int fixup_exception(struct pt_regs *regs);
 #ifndef __ASSEMBLY__
 
 #define __range_ok(addr, size)                                 \
-       ((((unsigned long)(addr) >= 0x80000000)                 \
+       ((((unsigned long __force)(addr) >= 0x80000000)         \
        || ((unsigned long)(size) > 0x80000000)                 \
-       || (((unsigned long)(addr) + (unsigned long)(size)) > 
0x80000000)))
+       || (((unsigned long __force)(addr) + (unsigned long)(size)) \
+               > 0x80000000)))
 
-#define __access_ok(addr, size) \
-       (__range_ok((addr), (size)) == 0)
+#define __access_ok(addr, size)                (__range_ok((addr), 
(size)) == 0)
 
 #include <asm-generic/uaccess.h>
 
diff --git a/arch/score/include/asm/ucontext.h 
b/arch/score/include/asm/ucontext.h
new file mode 100644
index 0000000..9c5fe5b
--- /dev/null
+++ b/arch/score/include/asm/ucontext.h
@@ -0,0 +1,6 @@
+#ifndef _ASM_SCORE_UCONTEXT_H
+#define _ASM_SCORE_UCONTEXT_H
+
+#include <asm-generic/ucontext.h>
+
+#endif /* _ASM_SCORE_UCONTEXT_H */
diff --git a/arch/score/kernel/irq.c b/arch/score/kernel/irq.c
index 55474e8..3a7f155 100644
--- a/arch/score/kernel/irq.c
+++ b/arch/score/kernel/irq.c
@@ -44,11 +44,11 @@ static void score_mask(unsigned int irq_nr)
        unsigned int irq_source = 63 - irq_nr;
 
        if (irq_source < 32)
-               __raw_writel((__raw_readl((void *)P_INT_MASKL) | \
-                       (1 << irq_source)), (void *)P_INT_MASKL);
+               __raw_writel((__raw_readl(INTC_BASE + INT_MASKL) | \
+                       (1 << irq_source)), INTC_BASE + INT_MASKL);
        else
-               __raw_writel((__raw_readl((void *)P_INT_MASKH) | \
-                       (1 << (irq_source - 32))), (void *)P_INT_MASKH);
+               __raw_writel((__raw_readl(INTC_BASE + INT_MASKH) | \
+                       (1 << (irq_source - 32))), INTC_BASE + INT_MASKH);
 }
 
 static void score_unmask(unsigned int irq_nr)
@@ -56,11 +56,11 @@ static void score_unmask(unsigned int irq_nr)
        unsigned int irq_source = 63 - irq_nr;
 
        if (irq_source < 32)
-               __raw_writel((__raw_readl((void *)P_INT_MASKL) & \
-                       ~(1 << irq_source)), (void *)P_INT_MASKL);
+               __raw_writel((__raw_readl(INTC_BASE + INT_MASKL) & \
+                       ~(1 << irq_source)), INTC_BASE + INT_MASKL);
        else
-               __raw_writel((__raw_readl((void *)P_INT_MASKH) & \
-                       ~(1 << (irq_source - 32))), (void *)P_INT_MASKH);
+               __raw_writel((__raw_readl(INTC_BASE + INT_MASKH) & \
+                       ~(1 << (irq_source - 32))), INTC_BASE + 
INT_MASKH);
 }
 
 struct irq_chip score_irq_chip = {
@@ -88,8 +88,8 @@ void __init init_IRQ(void)
                memcpy((void *)target_addr, \
                        interrupt_exception_vector, IRQ_VECTOR_SIZE);
 
-       __raw_writel(0xffffffff, (void *)P_INT_MASKL);
-       __raw_writel(0xffffffff, (void *)P_INT_MASKH);
+       __raw_writel(0xffffffff, INTC_BASE + INT_MASKL);
+       __raw_writel(0xffffffff, INTC_BASE + INT_MASKH);
 
        __asm__ __volatile__(
                "mtcr   %0, cr3\n\t"
diff --git a/arch/score/kernel/module.c b/arch/score/kernel/module.c
index 4ffce7f..4de8d47 100644
--- a/arch/score/kernel/module.c
+++ b/arch/score/kernel/module.c
@@ -23,6 +23,7 @@
  * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
+#include <linux/moduleloader.h>
 #include <linux/module.h>
 #include <linux/vmalloc.h>
 
@@ -56,17 +57,17 @@ int apply_relocate(Elf_Shdr *sechdrs, const char 
*strtab,
        for (i = 0; i < relsec->sh_size / sizeof(Elf32_Rel); i++, rel++) {
                unsigned long loc;
                Elf32_Sym *sym;
-               s32 offset;
+               s32 r_offset;
 
-               offset = ELF32_R_SYM(rel->r_info);
-               if ((offset < 0) ||
-                   (offset > (symsec->sh_size / sizeof(Elf32_Sym)))) {
+               r_offset = ELF32_R_SYM(rel->r_info);
+               if ((r_offset < 0) ||
+                   (r_offset > (symsec->sh_size / sizeof(Elf32_Sym)))) {
                        printk(KERN_ERR "%s: bad relocation, section %d 
reloc %d\n",
                                me->name, relindex, i);
                                return -ENOEXEC;
                }
 
-               sym = ((Elf32_Sym *)symsec->sh_addr) + offset;
+               sym = ((Elf32_Sym *)symsec->sh_addr) + r_offset;
 
                if ((rel->r_offset < 0) ||
                    (rel->r_offset > dstsec->sh_size - sizeof(u32))) {
@@ -151,7 +152,7 @@ int apply_relocate_add(Elf_Shdr *sechdrs, const char 
*strtab,
 /* Given an address, look for it in the module exception tables. */
 const struct exception_table_entry *search_module_dbetables(unsigned long 
addr)
 {
-       return 0;
+       return NULL;
 }
 
 /* Put in dbe list if necessary. */
diff --git a/arch/score/kernel/process.c b/arch/score/kernel/process.c
index d93966f..84575b2 100644
--- a/arch/score/kernel/process.c
+++ b/arch/score/kernel/process.c
@@ -23,7 +23,10 @@
  * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
+#include <linux/elfcore.h>
 #include <linux/module.h>
+#include <linux/pm.h>
+#include <linux/reboot.h>
 
 void (*pm_power_off)(void);
 EXPORT_SYMBOL(pm_power_off);
diff --git a/arch/score/kernel/ptrace.c b/arch/score/kernel/ptrace.c
index 19911e3..897dd7c 100644
--- a/arch/score/kernel/ptrace.c
+++ b/arch/score/kernel/ptrace.c
@@ -267,6 +267,7 @@ long
 arch_ptrace(struct task_struct *child, long request, long addr, long 
data)
 {
        int ret;
+       unsigned long __user *datap = (void __user *)data;
 
        switch (request) {
        /* Read the word at location addr in the USER area.  */
@@ -316,7 +317,7 @@ arch_ptrace(struct task_struct *child, long request, 
long addr, long data)
                        return -EIO;
                }
 
-               ret = put_user(tmp, (unsigned long *) data);
+               ret = put_user(tmp, (unsigned long *) datap);
                return ret;
        }
 
@@ -355,11 +356,11 @@ arch_ptrace(struct task_struct *child, long request, 
long addr, long data)
        }
 
        case PTRACE_GETREGS:
-               ret = ptrace_getregs(child, (void __user *)data);
+               ret = ptrace_getregs(child, (void __user *)datap);
                break;
 
        case PTRACE_SETREGS:
-               ret = ptrace_setregs(child, (void __user *)data);
+               ret = ptrace_setregs(child, (void __user *)datap);
                break;
 
        default:
diff --git a/arch/score/kernel/signal.c b/arch/score/kernel/signal.c
index 5c00408..e351c02 100644
--- a/arch/score/kernel/signal.c
+++ b/arch/score/kernel/signal.c
@@ -27,7 +27,9 @@
 #include <linux/signal.h>
 #include <linux/unistd.h>
 #include <linux/uaccess.h>
-#include <asm-generic/ucontext.h>
+
+#include <asm/syscalls.h>
+#include <asm/ucontext.h>
 
 #include <asm/cacheflush.h>
 
@@ -40,7 +42,8 @@ struct rt_sigframe {
        struct ucontext rs_uc;
 };
 
-int setup_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
+static int
+setup_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
 {
        int err = 0;
        unsigned long reg;
@@ -74,7 +77,8 @@ int setup_sigcontext(struct pt_regs *regs, struct 
sigcontext __user *sc)
        return err;
 }
 
-int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user 
*sc)
+static int
+restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
 {
        int err = 0;
        u32 reg;
@@ -116,8 +120,8 @@ int restore_sigcontext(struct pt_regs *regs, struct 
sigcontext __user *sc)
 /*
  * Determine which stack to use..
  */
-void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,
-                       size_t frame_size)
+static void __user *
+get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t 
frame_size)
 {
        unsigned long sp;
 
@@ -129,19 +133,19 @@ void __user *get_sigframe(struct k_sigaction *ka, 
struct pt_regs *regs,
        if ((ka->sa.sa_flags & SA_ONSTACK) && (!on_sig_stack(sp)))
                sp = current->sas_ss_sp + current->sas_ss_size;
 
-       return (void *)((sp - frame_size) & ~7);
+       return (void __user *)((sp - frame_size) & ~7);
 }
 
-int score_sigaltstack(struct pt_regs *regs)
+asmlinkage long score_sigaltstack(struct pt_regs *regs)
 {
-       const stack_t *uss = (const stack_t *) regs->regs[4];
-       stack_t *uoss = (stack_t *) regs->regs[5];
+       const stack_t __user *uss = (const stack_t __user *) 
regs->regs[4];
+       stack_t __user *uoss = (stack_t __user *) regs->regs[5];
        unsigned long usp = regs->regs[0];
 
        return do_sigaltstack(uss, uoss, usp);
 }
 
-void score_rt_sigreturn(struct pt_regs *regs)
+asmlinkage long score_rt_sigreturn(struct pt_regs *regs)
 {
        struct rt_sigframe __user *frame;
        sigset_t set;
@@ -181,12 +185,13 @@ void score_rt_sigreturn(struct pt_regs *regs)
 
 badframe:
        force_sig(SIGSEGV, current);
+       return 0;
 }
 
-int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
-               int signr, sigset_t *set, siginfo_t *info)
+static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
+                       int signr, sigset_t *set, siginfo_t *info)
 {
-       struct rt_sigframe *frame;
+       struct rt_sigframe __user *frame;
        int err = 0;
 
        frame = get_sigframe(ka, regs, sizeof(*frame));
@@ -206,8 +211,8 @@ int setup_rt_frame(struct k_sigaction *ka, struct 
pt_regs *regs,
 
        err |= copy_siginfo_to_user(&frame->rs_info, info);
        err |= __put_user(0, &frame->rs_uc.uc_flags);
-       err |= __put_user(0, &frame->rs_uc.uc_link);
-       err |= __put_user((void *)current->sas_ss_sp,
+       err |= __put_user(NULL, &frame->rs_uc.uc_link);
+       err |= __put_user((void __user *)current->sas_ss_sp,
                                &frame->rs_uc.uc_stack.ss_sp);
        err |= __put_user(sas_ss_flags(regs->regs[0]),
                                &frame->rs_uc.uc_stack.ss_flags);
@@ -236,7 +241,7 @@ give_sigsegv:
        return -EFAULT;
 }
 
-int handle_signal(unsigned long sig, siginfo_t *info,
+static int handle_signal(unsigned long sig, siginfo_t *info,
        struct k_sigaction *ka, sigset_t *oldset, struct pt_regs *regs)
 {
        int ret;
@@ -276,7 +281,7 @@ int handle_signal(unsigned long sig, siginfo_t *info,
        return ret;
 }
 
-void do_signal(struct pt_regs *regs)
+static void do_signal(struct pt_regs *regs)
 {
        struct k_sigaction ka;
        sigset_t *oldset;
diff --git a/arch/score/kernel/sys_score.c b/arch/score/kernel/sys_score.c
index 3318861..c5a3fbc 100644
--- a/arch/score/kernel/sys_score.c
+++ b/arch/score/kernel/sys_score.c
@@ -27,12 +27,12 @@
 #include <linux/fs.h>
 #include <linux/mman.h>
 #include <linux/module.h>
+#include <linux/syscalls.h>
 #include <linux/unistd.h>
 
-unsigned long shm_align_mask = PAGE_SIZE - 1;
-EXPORT_SYMBOL(shm_align_mask);
+#include <asm/syscalls.h>
 
-asmlinkage unsigned long
+asmlinkage long
 sys_mmap2(unsigned long addr, unsigned long len, unsigned long prot,
          unsigned long flags, unsigned long fd, unsigned long pgoff)
 {
@@ -64,7 +64,7 @@ sys_mmap2(unsigned long addr, unsigned long len, 
unsigned long prot,
  * Clone a task - this clones the calling program thread.
  * This is called indirectly via a small wrapper
  */
-int score_clone(struct pt_regs *regs)
+asmlinkage long score_clone(struct pt_regs *regs)
 {
        unsigned long clone_flags;
        unsigned long newsp;
@@ -85,33 +85,25 @@ int score_clone(struct pt_regs *regs)
  * sys_execve() executes a new program.
  * This is called indirectly via a small wrapper
  */
-int score_execve(struct pt_regs *regs)
+asmlinkage long score_execve(struct pt_regs *regs)
 {
        int error;
        char *filename;
 
-       filename = getname((char *) (long) regs->regs[4]);
+       filename = getname((char __user *)regs->regs[4]);
        error = PTR_ERR(filename);
        if (IS_ERR(filename))
                return error;
 
-       error = do_execve(filename, (char **) (long) regs->regs[5],
-                         (char **) (long) regs->regs[6], regs);
+       error = do_execve(filename,
+                       (char __user * __user *)(long)regs->regs[5],
+                       (char __user * __user *)(long)regs->regs[6], 
regs);
 
        putname(filename);
        return error;
 }
 
 /*
- * If we ever come here the user sp is bad.  Zap the process right away.
- * Due to the bad stack signaling wouldn't work.
- */
-void bad_stack(void)
-{
-       do_exit(SIGSEGV);
-}
-
-/*
  * Do a system call from kernel instead of calling sys_execve so we
  * end up with proper pt_regs.
  */
diff --git a/arch/score/kernel/time.c b/arch/score/kernel/time.c
index cd66ba3..f0a43af 100644
--- a/arch/score/kernel/time.c
+++ b/arch/score/kernel/time.c
@@ -28,7 +28,7 @@
 
 #include <asm/scoreregs.h>
 
-irqreturn_t timer_interrupt(int irq, void *dev_id)
+static irqreturn_t timer_interrupt(int irq, void *dev_id)
 {
        struct clock_event_device *evdev = dev_id;
 
diff --git a/arch/score/mm/init.c b/arch/score/mm/init.c
index 7780eec..e5f6f2e 100644
--- a/arch/score/mm/init.c
+++ b/arch/score/mm/init.c
@@ -32,44 +32,30 @@
 #include <linux/pagemap.h>
 #include <linux/proc_fs.h>
 #include <linux/sched.h>
-#include <asm-generic/sections.h>
+#include <linux/initrd.h>
 
+#include <asm/sections.h>
 #include <asm/tlb.h>
 
 DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
 
-/*
- * We have up to 8 empty zeroed pages so we can map one of the right 
colour
- * when needed.
- */
-unsigned long zero_page_mask;
 unsigned long empty_zero_page;
 EXPORT_SYMBOL_GPL(empty_zero_page);
 
 static struct kcore_list kcore_mem, kcore_vmalloc;
 
-unsigned long setup_zero_pages(void)
+static unsigned long setup_zero_page(void)
 {
-       unsigned int order = 0;
-       unsigned long size;
        struct page *page;
 
-       empty_zero_page = __get_free_pages(GFP_KERNEL | __GFP_ZERO, 
order);
+       empty_zero_page = __get_free_pages(GFP_KERNEL | __GFP_ZERO, 0);
        if (!empty_zero_page)
                panic("Oh boy, that early out of memory?");
 
        page = virt_to_page((void *) empty_zero_page);
-       split_page(page, order);
-       while (page < virt_to_page((void *) (empty_zero_page +
-                                            (PAGE_SIZE << order)))) {
-               SetPageReserved(page);
-               page++;
-       }
-
-       size = PAGE_SIZE << order;
-       zero_page_mask = (size - 1) & PAGE_MASK;
+       SetPageReserved(page);
 
-       return 1UL << order;
+       return 1UL;
 }
 
 #ifndef CONFIG_NEED_MULTIPLE_NODES
@@ -100,7 +86,7 @@ void __init mem_init(void)
        max_mapnr = max_low_pfn;
        high_memory = (void *) __va(max_low_pfn << PAGE_SHIFT);
        totalram_pages += free_all_bootmem();
-       totalram_pages -= setup_zero_pages();   /* Setup zeroed pages. */
+       totalram_pages -= setup_zero_page();    /* Setup zeroed pages. */
        reservedpages = 0;
 
        for (tmp = 0; tmp < max_low_pfn; tmp++)
@@ -129,7 +115,8 @@ void __init mem_init(void)
 }
 #endif /* !CONFIG_NEED_MULTIPLE_NODES */
 
-void free_init_pages(const char *what, unsigned long begin, unsigned long 
end)
+static void
+free_init_pages(const char *what, unsigned long begin, unsigned long end)
 {
        unsigned long pfn;
 
@@ -150,8 +137,8 @@ void free_init_pages(const char *what, unsigned long 
begin, unsigned long end)
 void free_initrd_mem(unsigned long start, unsigned long end)
 {
        free_init_pages("initrd memory",
-       virt_to_phys((void *) start),
-       virt_to_phys((void *) end));
+                       virt_to_phys((void *) start),
+                       virt_to_phys((void *) end));
 }
 #endif
 
-- 
1.6.2




Download attachment "0001-score-code-cleanups.patch" of type "application/octet-stream" (17013 bytes)

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ