diff options
author | Srikant Patnaik | 2015-01-11 12:28:04 +0530 |
---|---|---|
committer | Srikant Patnaik | 2015-01-11 12:28:04 +0530 |
commit | 871480933a1c28f8a9fed4c4d34d06c439a7a422 (patch) | |
tree | 8718f573808810c2a1e8cb8fb6ac469093ca2784 /ANDROID_3.4.5/arch/score/kernel | |
parent | 9d40ac5867b9aefe0722bc1f110b965ff294d30d (diff) | |
download | FOSSEE-netbook-kernel-source-871480933a1c28f8a9fed4c4d34d06c439a7a422.tar.gz FOSSEE-netbook-kernel-source-871480933a1c28f8a9fed4c4d34d06c439a7a422.tar.bz2 FOSSEE-netbook-kernel-source-871480933a1c28f8a9fed4c4d34d06c439a7a422.zip |
Moved, renamed, and deleted files
The original directory structure was scattered and unorganized.
Changes are basically to make it look like kernel structure.
Diffstat (limited to 'ANDROID_3.4.5/arch/score/kernel')
-rw-r--r-- | ANDROID_3.4.5/arch/score/kernel/Makefile | 11 | ||||
-rw-r--r-- | ANDROID_3.4.5/arch/score/kernel/asm-offsets.c | 216 | ||||
-rw-r--r-- | ANDROID_3.4.5/arch/score/kernel/entry.S | 514 | ||||
-rw-r--r-- | ANDROID_3.4.5/arch/score/kernel/head.S | 70 | ||||
-rw-r--r-- | ANDROID_3.4.5/arch/score/kernel/init_task.c | 46 | ||||
-rw-r--r-- | ANDROID_3.4.5/arch/score/kernel/irq.c | 111 | ||||
-rw-r--r-- | ANDROID_3.4.5/arch/score/kernel/module.c | 142 | ||||
-rw-r--r-- | ANDROID_3.4.5/arch/score/kernel/process.c | 166 | ||||
-rw-r--r-- | ANDROID_3.4.5/arch/score/kernel/ptrace.c | 383 | ||||
-rw-r--r-- | ANDROID_3.4.5/arch/score/kernel/setup.c | 162 | ||||
-rw-r--r-- | ANDROID_3.4.5/arch/score/kernel/signal.c | 361 | ||||
-rw-r--r-- | ANDROID_3.4.5/arch/score/kernel/sys_call_table.c | 12 | ||||
-rw-r--r-- | ANDROID_3.4.5/arch/score/kernel/sys_score.c | 138 | ||||
-rw-r--r-- | ANDROID_3.4.5/arch/score/kernel/time.c | 99 | ||||
-rw-r--r-- | ANDROID_3.4.5/arch/score/kernel/traps.c | 349 | ||||
-rw-r--r-- | ANDROID_3.4.5/arch/score/kernel/vmlinux.lds.S | 89 |
16 files changed, 0 insertions, 2869 deletions
diff --git a/ANDROID_3.4.5/arch/score/kernel/Makefile b/ANDROID_3.4.5/arch/score/kernel/Makefile deleted file mode 100644 index f218673b..00000000 --- a/ANDROID_3.4.5/arch/score/kernel/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -# -# Makefile for the Linux/SCORE kernel. -# - -extra-y := head.o vmlinux.lds - -obj-y += entry.o init_task.o irq.o process.o ptrace.o \ - setup.o signal.o sys_score.o time.o traps.o \ - sys_call_table.o - -obj-$(CONFIG_MODULES) += module.o diff --git a/ANDROID_3.4.5/arch/score/kernel/asm-offsets.c b/ANDROID_3.4.5/arch/score/kernel/asm-offsets.c deleted file mode 100644 index 57788f44..00000000 --- a/ANDROID_3.4.5/arch/score/kernel/asm-offsets.c +++ /dev/null @@ -1,216 +0,0 @@ -/* - * arch/score/kernel/asm-offsets.c - * - * Score Processor version. - * - * Copyright (C) 2009 Sunplus Core Technology Co., Ltd. - * Chen Liqin <liqin.chen@sunplusct.com> - * Lennox Wu <lennox.wu@sunplusct.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, 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, see the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/kbuild.h> -#include <linux/interrupt.h> -#include <linux/mm.h> -#include <linux/sched.h> - -#include <asm-generic/cmpxchg-local.h> - -void output_ptreg_defines(void) -{ - COMMENT("SCORE pt_regs offsets."); - OFFSET(PT_R0, pt_regs, regs[0]); - OFFSET(PT_R1, pt_regs, regs[1]); - OFFSET(PT_R2, pt_regs, regs[2]); - OFFSET(PT_R3, pt_regs, regs[3]); - OFFSET(PT_R4, pt_regs, regs[4]); - OFFSET(PT_R5, pt_regs, regs[5]); - OFFSET(PT_R6, pt_regs, regs[6]); - OFFSET(PT_R7, pt_regs, regs[7]); - OFFSET(PT_R8, pt_regs, regs[8]); - OFFSET(PT_R9, pt_regs, regs[9]); - OFFSET(PT_R10, pt_regs, regs[10]); - OFFSET(PT_R11, pt_regs, regs[11]); - OFFSET(PT_R12, pt_regs, regs[12]); - OFFSET(PT_R13, pt_regs, regs[13]); - OFFSET(PT_R14, pt_regs, regs[14]); - OFFSET(PT_R15, pt_regs, regs[15]); - OFFSET(PT_R16, pt_regs, regs[16]); - OFFSET(PT_R17, pt_regs, regs[17]); - OFFSET(PT_R18, pt_regs, regs[18]); - OFFSET(PT_R19, pt_regs, regs[19]); - OFFSET(PT_R20, pt_regs, regs[20]); - OFFSET(PT_R21, pt_regs, regs[21]); - OFFSET(PT_R22, pt_regs, regs[22]); - OFFSET(PT_R23, pt_regs, regs[23]); - OFFSET(PT_R24, pt_regs, regs[24]); - OFFSET(PT_R25, pt_regs, regs[25]); - OFFSET(PT_R26, pt_regs, regs[26]); - OFFSET(PT_R27, pt_regs, regs[27]); - OFFSET(PT_R28, pt_regs, regs[28]); - OFFSET(PT_R29, pt_regs, regs[29]); - OFFSET(PT_R30, pt_regs, regs[30]); - OFFSET(PT_R31, pt_regs, regs[31]); - - OFFSET(PT_ORIG_R4, pt_regs, orig_r4); - OFFSET(PT_ORIG_R7, pt_regs, orig_r7); - OFFSET(PT_CEL, pt_regs, cel); - OFFSET(PT_CEH, pt_regs, ceh); - OFFSET(PT_SR0, pt_regs, sr0); - OFFSET(PT_SR1, pt_regs, sr1); - OFFSET(PT_SR2, pt_regs, sr2); - OFFSET(PT_EPC, pt_regs, cp0_epc); - OFFSET(PT_EMA, pt_regs, cp0_ema); - OFFSET(PT_PSR, pt_regs, cp0_psr); - OFFSET(PT_ECR, pt_regs, cp0_ecr); - OFFSET(PT_CONDITION, pt_regs, cp0_condition); - OFFSET(PT_IS_SYSCALL, pt_regs, is_syscall); - - DEFINE(PT_SIZE, sizeof(struct pt_regs)); - BLANK(); -} - -void output_task_defines(void) -{ - COMMENT("SCORE task_struct offsets."); - OFFSET(TASK_STATE, task_struct, state); - OFFSET(TASK_THREAD_INFO, task_struct, stack); - OFFSET(TASK_FLAGS, task_struct, flags); - OFFSET(TASK_MM, task_struct, mm); - OFFSET(TASK_PID, task_struct, pid); - DEFINE(TASK_STRUCT_SIZE, sizeof(struct task_struct)); - BLANK(); -} - -void output_thread_info_defines(void) -{ - COMMENT("SCORE thread_info offsets."); - OFFSET(TI_TASK, thread_info, task); - OFFSET(TI_EXEC_DOMAIN, thread_info, exec_domain); - OFFSET(TI_FLAGS, thread_info, flags); - OFFSET(TI_TP_VALUE, thread_info, tp_value); - OFFSET(TI_CPU, thread_info, cpu); - OFFSET(TI_PRE_COUNT, thread_info, preempt_count); - OFFSET(TI_ADDR_LIMIT, thread_info, addr_limit); - OFFSET(TI_RESTART_BLOCK, thread_info, restart_block); - OFFSET(TI_REGS, thread_info, regs); - DEFINE(KERNEL_STACK_SIZE, THREAD_SIZE); - DEFINE(KERNEL_STACK_MASK, THREAD_MASK); - BLANK(); -} - -void output_thread_defines(void) -{ - COMMENT("SCORE specific thread_struct offsets."); - OFFSET(THREAD_REG0, task_struct, thread.reg0); - OFFSET(THREAD_REG2, task_struct, thread.reg2); - OFFSET(THREAD_REG3, task_struct, thread.reg3); - OFFSET(THREAD_REG12, task_struct, thread.reg12); - OFFSET(THREAD_REG13, task_struct, thread.reg13); - OFFSET(THREAD_REG14, task_struct, thread.reg14); - OFFSET(THREAD_REG15, task_struct, thread.reg15); - OFFSET(THREAD_REG16, task_struct, thread.reg16); - OFFSET(THREAD_REG17, task_struct, thread.reg17); - OFFSET(THREAD_REG18, task_struct, thread.reg18); - OFFSET(THREAD_REG19, task_struct, thread.reg19); - OFFSET(THREAD_REG20, task_struct, thread.reg20); - OFFSET(THREAD_REG21, task_struct, thread.reg21); - OFFSET(THREAD_REG29, task_struct, thread.reg29); - - OFFSET(THREAD_PSR, task_struct, thread.cp0_psr); - OFFSET(THREAD_EMA, task_struct, thread.cp0_ema); - OFFSET(THREAD_BADUADDR, task_struct, thread.cp0_baduaddr); - OFFSET(THREAD_ECODE, task_struct, thread.error_code); - OFFSET(THREAD_TRAPNO, task_struct, thread.trap_no); - BLANK(); -} - -void output_mm_defines(void) -{ - COMMENT("Size of struct page"); - DEFINE(STRUCT_PAGE_SIZE, sizeof(struct page)); - BLANK(); - COMMENT("Linux mm_struct offsets."); - OFFSET(MM_USERS, mm_struct, mm_users); - OFFSET(MM_PGD, mm_struct, pgd); - OFFSET(MM_CONTEXT, mm_struct, context); - BLANK(); - DEFINE(_PAGE_SIZE, PAGE_SIZE); - DEFINE(_PAGE_SHIFT, PAGE_SHIFT); - BLANK(); - DEFINE(_PGD_T_SIZE, sizeof(pgd_t)); - DEFINE(_PTE_T_SIZE, sizeof(pte_t)); - BLANK(); - DEFINE(_PGD_ORDER, PGD_ORDER); - DEFINE(_PTE_ORDER, PTE_ORDER); - BLANK(); - DEFINE(_PGDIR_SHIFT, PGDIR_SHIFT); - BLANK(); - DEFINE(_PTRS_PER_PGD, PTRS_PER_PGD); - DEFINE(_PTRS_PER_PTE, PTRS_PER_PTE); - BLANK(); -} - -void output_sc_defines(void) -{ - COMMENT("Linux sigcontext offsets."); - OFFSET(SC_REGS, sigcontext, sc_regs); - OFFSET(SC_MDCEH, sigcontext, sc_mdceh); - OFFSET(SC_MDCEL, sigcontext, sc_mdcel); - OFFSET(SC_PC, sigcontext, sc_pc); - OFFSET(SC_PSR, sigcontext, sc_psr); - OFFSET(SC_ECR, sigcontext, sc_ecr); - OFFSET(SC_EMA, sigcontext, sc_ema); - BLANK(); -} - -void output_signal_defined(void) -{ - COMMENT("Linux signal numbers."); - DEFINE(_SIGHUP, SIGHUP); - DEFINE(_SIGINT, SIGINT); - DEFINE(_SIGQUIT, SIGQUIT); - DEFINE(_SIGILL, SIGILL); - DEFINE(_SIGTRAP, SIGTRAP); - DEFINE(_SIGIOT, SIGIOT); - DEFINE(_SIGABRT, SIGABRT); - DEFINE(_SIGFPE, SIGFPE); - DEFINE(_SIGKILL, SIGKILL); - DEFINE(_SIGBUS, SIGBUS); - DEFINE(_SIGSEGV, SIGSEGV); - DEFINE(_SIGSYS, SIGSYS); - DEFINE(_SIGPIPE, SIGPIPE); - DEFINE(_SIGALRM, SIGALRM); - DEFINE(_SIGTERM, SIGTERM); - DEFINE(_SIGUSR1, SIGUSR1); - DEFINE(_SIGUSR2, SIGUSR2); - DEFINE(_SIGCHLD, SIGCHLD); - DEFINE(_SIGPWR, SIGPWR); - DEFINE(_SIGWINCH, SIGWINCH); - DEFINE(_SIGURG, SIGURG); - DEFINE(_SIGIO, SIGIO); - DEFINE(_SIGSTOP, SIGSTOP); - DEFINE(_SIGTSTP, SIGTSTP); - DEFINE(_SIGCONT, SIGCONT); - DEFINE(_SIGTTIN, SIGTTIN); - DEFINE(_SIGTTOU, SIGTTOU); - DEFINE(_SIGVTALRM, SIGVTALRM); - DEFINE(_SIGPROF, SIGPROF); - DEFINE(_SIGXCPU, SIGXCPU); - DEFINE(_SIGXFSZ, SIGXFSZ); - BLANK(); -} diff --git a/ANDROID_3.4.5/arch/score/kernel/entry.S b/ANDROID_3.4.5/arch/score/kernel/entry.S deleted file mode 100644 index 83bb9607..00000000 --- a/ANDROID_3.4.5/arch/score/kernel/entry.S +++ /dev/null @@ -1,514 +0,0 @@ -/* - * arch/score/kernel/entry.S - * - * Score Processor version. - * - * Copyright (C) 2009 Sunplus Core Technology Co., Ltd. - * Chen Liqin <liqin.chen@sunplusct.com> - * Lennox Wu <lennox.wu@sunplusct.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, 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, see the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/err.h> -#include <linux/init.h> -#include <linux/linkage.h> - -#include <asm/asmmacro.h> -#include <asm/thread_info.h> -#include <asm/unistd.h> - -/* - * disable interrupts. - */ -.macro disable_irq - mfcr r8, cr0 - srli r8, r8, 1 - slli r8, r8, 1 - mtcr r8, cr0 - nop - nop - nop - nop - nop -.endm - -/* - * enable interrupts. - */ -.macro enable_irq - mfcr r8, cr0 - ori r8, 1 - mtcr r8, cr0 - nop - nop - nop - nop - nop -.endm - -__INIT -ENTRY(debug_exception_vector) - nop! - nop! - nop! - nop! - nop! - nop! - nop! - nop! - -ENTRY(general_exception_vector) # should move to addr 0x200 - j general_exception - nop! - nop! - nop! - nop! - nop! - nop! - -ENTRY(interrupt_exception_vector) # should move to addr 0x210 - j interrupt_exception - nop! - nop! - nop! - nop! - nop! - nop! - - .section ".text", "ax" - .align 2; -general_exception: - mfcr r31, cr2 - nop - la r30, exception_handlers - andi r31, 0x1f # get ecr.exc_code - slli r31, r31, 2 - add r30, r30, r31 - lw r30, [r30] - br r30 - -interrupt_exception: - SAVE_ALL - mfcr r4, cr2 - nop - lw r16, [r28, TI_REGS] - sw r0, [r28, TI_REGS] - la r3, ret_from_irq - srli r4, r4, 18 # get ecr.ip[7:2], interrupt No. - mv r5, r0 - j do_IRQ - -ENTRY(handle_nmi) # NMI #1 - SAVE_ALL - mv r4, r0 - la r8, nmi_exception_handler - brl r8 - j restore_all - -ENTRY(handle_adelinsn) # AdEL-instruction #2 - SAVE_ALL - mfcr r8, cr6 - nop - nop - sw r8, [r0, PT_EMA] - mv r4, r0 - la r8, do_adelinsn - brl r8 - mv r4, r0 - j ret_from_exception - nop - -ENTRY(handle_ibe) # BusEL-instruction #5 - SAVE_ALL - mv r4, r0 - la r8, do_be - brl r8 - mv r4, r0 - j ret_from_exception - nop - -ENTRY(handle_pel) # P-EL #6 - SAVE_ALL - mv r4, r0 - la r8, do_pel - brl r8 - mv r4, r0 - j ret_from_exception - nop - -ENTRY(handle_ccu) # CCU #8 - SAVE_ALL - mv r4, r0 - la r8, do_ccu - brl r8 - mv r4, r0 - j ret_from_exception - nop - -ENTRY(handle_ri) # RI #9 - SAVE_ALL - mv r4, r0 - la r8, do_ri - brl r8 - mv r4, r0 - j ret_from_exception - nop - -ENTRY(handle_tr) # Trap #10 - SAVE_ALL - mv r4, r0 - la r8, do_tr - brl r8 - mv r4, r0 - j ret_from_exception - nop - -ENTRY(handle_adedata) # AdES-instruction #12 - SAVE_ALL - mfcr r8, cr6 - nop - nop - sw r8, [r0, PT_EMA] - mv r4, r0 - la r8, do_adedata - brl r8 - mv r4, r0 - j ret_from_exception - nop - -ENTRY(handle_cee) # CeE #16 - SAVE_ALL - mv r4, r0 - la r8, do_cee - brl r8 - mv r4, r0 - j ret_from_exception - nop - -ENTRY(handle_cpe) # CpE #17 - SAVE_ALL - mv r4, r0 - la r8, do_cpe - brl r8 - mv r4, r0 - j ret_from_exception - nop - -ENTRY(handle_dbe) # BusEL-data #18 - SAVE_ALL - mv r4, r0 - la r8, do_be - brl r8 - mv r4, r0 - j ret_from_exception - nop - -ENTRY(handle_reserved) # others - SAVE_ALL - mv r4, r0 - la r8, do_reserved - brl r8 - mv r4, r0 - j ret_from_exception - nop - -#ifndef CONFIG_PREEMPT -#define resume_kernel restore_all -#else -#define __ret_from_irq ret_from_exception -#endif - - .align 2 -#ifndef CONFIG_PREEMPT -ENTRY(ret_from_exception) - disable_irq # preempt stop - nop - j __ret_from_irq - nop -#endif - -ENTRY(ret_from_irq) - sw r16, [r28, TI_REGS] - -ENTRY(__ret_from_irq) - lw r8, [r0, PT_PSR] # returning to kernel mode? - andri.c r8, r8, KU_USER - beq resume_kernel - -resume_userspace: - disable_irq - lw r6, [r28, TI_FLAGS] # current->work - li r8, _TIF_WORK_MASK - and.c r8, r8, r6 # ignoring syscall_trace - bne work_pending - nop - j restore_all - nop - -#ifdef CONFIG_PREEMPT -resume_kernel: - disable_irq - lw r8, [r28, TI_PRE_COUNT] - cmpz.c r8 - bne r8, restore_all -need_resched: - lw r8, [r28, TI_FLAGS] - andri.c r9, r8, _TIF_NEED_RESCHED - beq restore_all - lw r8, [r28, PT_PSR] # Interrupts off? - andri.c r8, r8, 1 - beq restore_all - bl preempt_schedule_irq - nop - j need_resched - nop -#endif - -ENTRY(ret_from_fork) - bl schedule_tail # r4=struct task_struct *prev - -ENTRY(syscall_exit) - nop - disable_irq - lw r6, [r28, TI_FLAGS] # current->work - li r8, _TIF_WORK_MASK - and.c r8, r6, r8 - bne syscall_exit_work - -ENTRY(restore_all) # restore full frame - RESTORE_ALL_AND_RET - -work_pending: - andri.c r8, r6, _TIF_NEED_RESCHED # r6 is preloaded with TI_FLAGS - beq work_notifysig -work_resched: - bl schedule - nop - disable_irq - lw r6, [r28, TI_FLAGS] - li r8, _TIF_WORK_MASK - and.c r8, r6, r8 # is there any work to be done - # other than syscall tracing? - beq restore_all - andri.c r8, r6, _TIF_NEED_RESCHED - bne work_resched - -work_notifysig: - mv r4, r0 - li r5, 0 - bl do_notify_resume # r6 already loaded - nop - j resume_userspace - nop - -ENTRY(syscall_exit_work) - li r8, _TIF_SYSCALL_TRACE - and.c r8, r8, r6 # r6 is preloaded with TI_FLAGS - beq work_pending # trace bit set? - nop - enable_irq - mv r4, r0 - li r5, 1 - bl do_syscall_trace - nop - b resume_userspace - nop - -.macro save_context reg - sw r12, [\reg, THREAD_REG12]; - sw r13, [\reg, THREAD_REG13]; - sw r14, [\reg, THREAD_REG14]; - sw r15, [\reg, THREAD_REG15]; - sw r16, [\reg, THREAD_REG16]; - sw r17, [\reg, THREAD_REG17]; - sw r18, [\reg, THREAD_REG18]; - sw r19, [\reg, THREAD_REG19]; - sw r20, [\reg, THREAD_REG20]; - sw r21, [\reg, THREAD_REG21]; - sw r29, [\reg, THREAD_REG29]; - sw r2, [\reg, THREAD_REG2]; - sw r0, [\reg, THREAD_REG0] -.endm - -.macro restore_context reg - lw r12, [\reg, THREAD_REG12]; - lw r13, [\reg, THREAD_REG13]; - lw r14, [\reg, THREAD_REG14]; - lw r15, [\reg, THREAD_REG15]; - lw r16, [\reg, THREAD_REG16]; - lw r17, [\reg, THREAD_REG17]; - lw r18, [\reg, THREAD_REG18]; - lw r19, [\reg, THREAD_REG19]; - lw r20, [\reg, THREAD_REG20]; - lw r21, [\reg, THREAD_REG21]; - lw r29, [\reg, THREAD_REG29]; - lw r0, [\reg, THREAD_REG0]; - lw r2, [\reg, THREAD_REG2]; - lw r3, [\reg, THREAD_REG3] -.endm - -/* - * task_struct *resume(task_struct *prev, task_struct *next, - * struct thread_info *next_ti) - */ -ENTRY(resume) - mfcr r9, cr0 - nop - nop - sw r9, [r4, THREAD_PSR] - save_context r4 - sw r3, [r4, THREAD_REG3] - - mv r28, r6 - restore_context r5 - mv r8, r6 - addi r8, KERNEL_STACK_SIZE - subi r8, 32 - la r9, kernelsp; - sw r8, [r9]; - - mfcr r9, cr0 - ldis r7, 0x00ff - nop - and r9, r9, r7 - lw r6, [r5, THREAD_PSR] - not r7, r7 - and r6, r6, r7 - or r6, r6, r9 - mtcr r6, cr0 - nop; nop; nop; nop; nop - br r3 - -ENTRY(handle_sys) - SAVE_ALL - sw r8, [r0, 16] # argument 5 from user r8 - sw r9, [r0, 20] # argument 6 from user r9 - enable_irq - - sw r4, [r0, PT_ORIG_R4] #for restart syscall - sw r7, [r0, PT_ORIG_R7] #for restart syscall - sw r27, [r0, PT_IS_SYSCALL] # it from syscall - - lw r9, [r0, PT_EPC] # skip syscall on return - addi r9, 4 - sw r9, [r0, PT_EPC] - - cmpi.c r27, __NR_syscalls # check syscall number - bgeu illegal_syscall - - slli r8, r27, 2 # get syscall routine - la r11, sys_call_table - add r11, r11, r8 - lw r10, [r11] # get syscall entry - - cmpz.c r10 - beq illegal_syscall - - lw r8, [r28, TI_FLAGS] - li r9, _TIF_SYSCALL_TRACE - and.c r8, r8, r9 - bne syscall_trace_entry - - brl r10 # Do The Real system call - - cmpi.c r4, 0 - blt 1f - ldi r8, 0 - sw r8, [r0, PT_R7] - b 2f -1: - cmpi.c r4, -MAX_ERRNO - 1 - ble 2f - ldi r8, 0x1; - sw r8, [r0, PT_R7] - neg r4, r4 -2: - sw r4, [r0, PT_R4] # save result - -syscall_return: - disable_irq - lw r6, [r28, TI_FLAGS] # current->work - li r8, _TIF_WORK_MASK - and.c r8, r6, r8 - bne syscall_return_work - j restore_all - -syscall_return_work: - j syscall_exit_work - -syscall_trace_entry: - mv r16, r10 - mv r4, r0 - li r5, 0 - bl do_syscall_trace - - mv r8, r16 - lw r4, [r0, PT_R4] # Restore argument registers - lw r5, [r0, PT_R5] - lw r6, [r0, PT_R6] - lw r7, [r0, PT_R7] - brl r8 - - li r8, -MAX_ERRNO - 1 - sw r8, [r0, PT_R7] # set error flag - - neg r4, r4 # error - sw r4, [r0, PT_R0] # set flag for syscall - # restarting -1: sw r4, [r0, PT_R2] # result - j syscall_exit - -illegal_syscall: - ldi r4, -ENOSYS # error - sw r4, [r0, PT_ORIG_R4] - sw r4, [r0, PT_R4] - ldi r9, 1 # set error flag - sw r9, [r0, PT_R7] - j syscall_return - -ENTRY(sys_execve) - mv r4, r0 - la r8, score_execve - br r8 - -ENTRY(sys_clone) - mv r4, r0 - la r8, score_clone - br r8 - -ENTRY(sys_rt_sigreturn) - mv r4, r0 - la r8, score_rt_sigreturn - br r8 - -ENTRY(sys_sigaltstack) - mv r4, r0 - la r8, score_sigaltstack - br r8 - -#ifdef __ARCH_WANT_SYSCALL_DEPRECATED -ENTRY(sys_fork) - mv r4, r0 - la r8, score_fork - br r8 - -ENTRY(sys_vfork) - mv r4, r0 - la r8, score_vfork - br r8 -#endif /* __ARCH_WANT_SYSCALL_DEPRECATED */ - diff --git a/ANDROID_3.4.5/arch/score/kernel/head.S b/ANDROID_3.4.5/arch/score/kernel/head.S deleted file mode 100644 index 22a7e3c7..00000000 --- a/ANDROID_3.4.5/arch/score/kernel/head.S +++ /dev/null @@ -1,70 +0,0 @@ -/* - * arch/score/kernel/head.S - * - * Score Processor version. - * - * Copyright (C) 2009 Sunplus Core Technology Co., Ltd. - * Chen Liqin <liqin.chen@sunplusct.com> - * Lennox Wu <lennox.wu@sunplusct.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, 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, see the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#include <linux/init.h> -#include <linux/linkage.h> - -#include <asm/asm-offsets.h> - - .extern start_kernel - .global init_thread_union - .global kernelsp - -__INIT -ENTRY(_stext) - la r30, __bss_start /* initialize BSS segment. */ - la r31, _end - xor r8, r8, r8 - -1: cmp.c r31, r30 - beq 2f - - sw r8, [r30] /* clean memory. */ - addi r30, 4 - b 1b - -2: la r28, init_thread_union /* set kernel stack. */ - mv r0, r28 - addi r0, KERNEL_STACK_SIZE - 32 - la r30, kernelsp - sw r0, [r30] - subi r0, 4*4 - xor r30, r30, r30 - ori r30, 0x02 /* enable MMU. */ - mtcr r30, cr4 - nop - nop - nop - nop - nop - nop - nop - - /* there is no parameter */ - xor r4, r4, r4 - xor r5, r5, r5 - xor r6, r6, r6 - xor r7, r7, r7 - la r30, start_kernel /* jump to init_arch */ - br r30 diff --git a/ANDROID_3.4.5/arch/score/kernel/init_task.c b/ANDROID_3.4.5/arch/score/kernel/init_task.c deleted file mode 100644 index baa03ee2..00000000 --- a/ANDROID_3.4.5/arch/score/kernel/init_task.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - * arch/score/kernel/init_task.c - * - * Score Processor version. - * - * Copyright (C) 2009 Sunplus Core Technology Co., Ltd. - * - * 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, see the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/init_task.h> -#include <linux/mqueue.h> - -static struct signal_struct init_signals = INIT_SIGNALS(init_signals); -static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); - -/* - * Initial thread structure. - * - * We need to make sure that this is THREAD_SIZE aligned due to the - * way process stacks are handled. This is done by having a special - * "init_task" linker map entry.. - */ -union thread_union init_thread_union __init_task_data = - { INIT_THREAD_INFO(init_task) }; - -/* - * Initial task structure. - * - * All other task structs will be allocated on slabs in fork.c - */ -struct task_struct init_task = INIT_TASK(init_task); -EXPORT_SYMBOL(init_task); diff --git a/ANDROID_3.4.5/arch/score/kernel/irq.c b/ANDROID_3.4.5/arch/score/kernel/irq.c deleted file mode 100644 index d4196732..00000000 --- a/ANDROID_3.4.5/arch/score/kernel/irq.c +++ /dev/null @@ -1,111 +0,0 @@ -/* - * arch/score/kernel/irq.c - * - * Score Processor version. - * - * Copyright (C) 2009 Sunplus Core Technology Co., Ltd. - * Chen Liqin <liqin.chen@sunplusct.com> - * Lennox Wu <lennox.wu@sunplusct.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, 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, see the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/interrupt.h> -#include <linux/kernel_stat.h> -#include <linux/seq_file.h> - -#include <asm/io.h> - -/* the interrupt controller is hardcoded at this address */ -#define SCORE_PIC ((u32 __iomem __force *)0x95F50000) - -#define INT_PNDL 0 -#define INT_PNDH 1 -#define INT_PRIORITY_M 2 -#define INT_PRIORITY_SG0 4 -#define INT_PRIORITY_SG1 5 -#define INT_PRIORITY_SG2 6 -#define INT_PRIORITY_SG3 7 -#define INT_MASKL 8 -#define INT_MASKH 9 - -/* - * handles all normal device IRQs - */ -asmlinkage void do_IRQ(int irq) -{ - irq_enter(); - generic_handle_irq(irq); - irq_exit(); -} - -static void score_mask(struct irq_data *d) -{ - unsigned int irq_source = 63 - d->irq; - - if (irq_source < 32) - __raw_writel((__raw_readl(SCORE_PIC + INT_MASKL) | \ - (1 << irq_source)), SCORE_PIC + INT_MASKL); - else - __raw_writel((__raw_readl(SCORE_PIC + INT_MASKH) | \ - (1 << (irq_source - 32))), SCORE_PIC + INT_MASKH); -} - -static void score_unmask(struct irq_data *d) -{ - unsigned int irq_source = 63 - d->irq; - - if (irq_source < 32) - __raw_writel((__raw_readl(SCORE_PIC + INT_MASKL) & \ - ~(1 << irq_source)), SCORE_PIC + INT_MASKL); - else - __raw_writel((__raw_readl(SCORE_PIC + INT_MASKH) & \ - ~(1 << (irq_source - 32))), SCORE_PIC + INT_MASKH); -} - -struct irq_chip score_irq_chip = { - .name = "Score7-level", - .irq_mask = score_mask, - .irq_mask_ack = score_mask, - .irq_unmask = score_unmask, -}; - -/* - * initialise the interrupt system - */ -void __init init_IRQ(void) -{ - int index; - unsigned long target_addr; - - for (index = 0; index < NR_IRQS; ++index) - irq_set_chip_and_handler(index, &score_irq_chip, - handle_level_irq); - - for (target_addr = IRQ_VECTOR_BASE_ADDR; - target_addr <= IRQ_VECTOR_END_ADDR; - target_addr += IRQ_VECTOR_SIZE) - memcpy((void *)target_addr, \ - interrupt_exception_vector, IRQ_VECTOR_SIZE); - - __raw_writel(0xffffffff, SCORE_PIC + INT_MASKL); - __raw_writel(0xffffffff, SCORE_PIC + INT_MASKH); - - __asm__ __volatile__( - "mtcr %0, cr3\n\t" - : : "r" (EXCEPTION_VECTOR_BASE_ADDR | \ - VECTOR_ADDRESS_OFFSET_MODE16)); -} diff --git a/ANDROID_3.4.5/arch/score/kernel/module.c b/ANDROID_3.4.5/arch/score/kernel/module.c deleted file mode 100644 index 469e3b64..00000000 --- a/ANDROID_3.4.5/arch/score/kernel/module.c +++ /dev/null @@ -1,142 +0,0 @@ -/* - * arch/score/kernel/module.c - * - * Score Processor version. - * - * Copyright (C) 2009 Sunplus Core Technology Co., Ltd. - * Chen Liqin <liqin.chen@sunplusct.com> - * Lennox Wu <lennox.wu@sunplusct.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, 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, see the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/moduleloader.h> -#include <linux/module.h> -#include <linux/vmalloc.h> - -int apply_relocate(Elf_Shdr *sechdrs, const char *strtab, - unsigned int symindex, unsigned int relindex, - struct module *me) -{ - Elf32_Shdr *symsec = sechdrs + symindex; - Elf32_Shdr *relsec = sechdrs + relindex; - Elf32_Shdr *dstsec = sechdrs + relsec->sh_info; - Elf32_Rel *rel = (void *)relsec->sh_addr; - unsigned int i; - - for (i = 0; i < relsec->sh_size / sizeof(Elf32_Rel); i++, rel++) { - unsigned long loc; - Elf32_Sym *sym; - s32 r_offset; - - 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) + r_offset; - - if ((rel->r_offset < 0) || - (rel->r_offset > dstsec->sh_size - sizeof(u32))) { - printk(KERN_ERR "%s: out of bounds relocation, " - "section %d reloc %d offset %d size %d\n", - me->name, relindex, i, rel->r_offset, - dstsec->sh_size); - return -ENOEXEC; - } - - loc = dstsec->sh_addr + rel->r_offset; - switch (ELF32_R_TYPE(rel->r_info)) { - case R_SCORE_NONE: - break; - case R_SCORE_ABS32: - *(unsigned long *)loc += sym->st_value; - break; - case R_SCORE_HI16: - break; - case R_SCORE_LO16: { - unsigned long hi16_offset, offset; - unsigned long uvalue; - unsigned long temp, temp_hi; - temp_hi = *((unsigned long *)loc - 1); - temp = *(unsigned long *)loc; - - hi16_offset = (((((temp_hi) >> 16) & 0x3) << 15) | - ((temp_hi) & 0x7fff)) >> 1; - offset = ((temp >> 16 & 0x03) << 15) | - ((temp & 0x7fff) >> 1); - offset = (hi16_offset << 16) | (offset & 0xffff); - uvalue = sym->st_value + offset; - hi16_offset = (uvalue >> 16) << 1; - - temp_hi = ((temp_hi) & (~(0x37fff))) | - (hi16_offset & 0x7fff) | - ((hi16_offset << 1) & 0x30000); - *((unsigned long *)loc - 1) = temp_hi; - - offset = (uvalue & 0xffff) << 1; - temp = (temp & (~(0x37fff))) | (offset & 0x7fff) | - ((offset << 1) & 0x30000); - *(unsigned long *)loc = temp; - break; - } - case R_SCORE_24: { - unsigned long hi16_offset, offset; - unsigned long uvalue; - unsigned long temp; - - temp = *(unsigned long *)loc; - offset = (temp & 0x03FF7FFE); - hi16_offset = (offset & 0xFFFF0000); - offset = (hi16_offset | ((offset & 0xFFFF) << 1)) >> 2; - - uvalue = (sym->st_value + offset) >> 1; - uvalue = uvalue & 0x00ffffff; - - temp = (temp & 0xfc008001) | - ((uvalue << 2) & 0x3ff0000) | - ((uvalue & 0x3fff) << 1); - *(unsigned long *)loc = temp; - break; - } - default: - printk(KERN_ERR "%s: unknown relocation: %u\n", - me->name, ELF32_R_TYPE(rel->r_info)); - return -ENOEXEC; - } - } - - return 0; -} - -int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab, - unsigned int symindex, unsigned int relsec, - struct module *me) -{ - /* Non-standard return value... most other arch's return -ENOEXEC - * for an unsupported relocation variant - */ - return 0; -} - -/* Given an address, look for it in the module exception tables. */ -const struct exception_table_entry *search_module_dbetables(unsigned long addr) -{ - return NULL; -} diff --git a/ANDROID_3.4.5/arch/score/kernel/process.c b/ANDROID_3.4.5/arch/score/kernel/process.c deleted file mode 100644 index 2707023c..00000000 --- a/ANDROID_3.4.5/arch/score/kernel/process.c +++ /dev/null @@ -1,166 +0,0 @@ -/* - * arch/score/kernel/process.c - * - * Score Processor version. - * - * Copyright (C) 2009 Sunplus Core Technology Co., Ltd. - * Chen Liqin <liqin.chen@sunplusct.com> - * Lennox Wu <lennox.wu@sunplusct.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, 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, see the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/module.h> -#include <linux/reboot.h> -#include <linux/elfcore.h> -#include <linux/pm.h> - -void (*pm_power_off)(void); -EXPORT_SYMBOL(pm_power_off); - -/* If or when software machine-restart is implemented, add code here. */ -void machine_restart(char *command) {} - -/* If or when software machine-halt is implemented, add code here. */ -void machine_halt(void) {} - -/* If or when software machine-power-off is implemented, add code here. */ -void machine_power_off(void) {} - -/* - * The idle thread. There's no useful work to be - * done, so just try to conserve power and have a - * low exit latency (ie sit in a loop waiting for - * somebody to say that they'd like to reschedule) - */ -void __noreturn cpu_idle(void) -{ - /* endless idle loop with no priority at all */ - while (1) { - while (!need_resched()) - barrier(); - - schedule_preempt_disabled(); - } -} - -void ret_from_fork(void); - -void start_thread(struct pt_regs *regs, unsigned long pc, unsigned long sp) -{ - unsigned long status; - - /* New thread loses kernel privileges. */ - status = regs->cp0_psr & ~(KU_MASK); - status |= KU_USER; - regs->cp0_psr = status; - regs->cp0_epc = pc; - regs->regs[0] = sp; -} - -void exit_thread(void) {} - -/* - * When a process does an "exec", machine state like FPU and debug - * registers need to be reset. This is a hook function for that. - * Currently we don't have any such state to reset, so this is empty. - */ -void flush_thread(void) {} - -/* - * set up the kernel stack and exception frames for a new process - */ -int copy_thread(unsigned long clone_flags, unsigned long usp, - unsigned long unused, - struct task_struct *p, struct pt_regs *regs) -{ - struct thread_info *ti = task_thread_info(p); - struct pt_regs *childregs = task_pt_regs(p); - - p->set_child_tid = NULL; - p->clear_child_tid = NULL; - - *childregs = *regs; - childregs->regs[7] = 0; /* Clear error flag */ - childregs->regs[4] = 0; /* Child gets zero as return value */ - regs->regs[4] = p->pid; - - if (childregs->cp0_psr & 0x8) { /* test kernel fork or user fork */ - childregs->regs[0] = usp; /* user fork */ - } else { - childregs->regs[28] = (unsigned long) ti; /* kernel fork */ - childregs->regs[0] = (unsigned long) childregs; - } - - p->thread.reg0 = (unsigned long) childregs; - p->thread.reg3 = (unsigned long) ret_from_fork; - p->thread.cp0_psr = 0; - - return 0; -} - -/* Fill in the fpu structure for a core dump. */ -int dump_fpu(struct pt_regs *regs, elf_fpregset_t *r) -{ - return 1; -} - -static void __noreturn -kernel_thread_helper(void *unused0, int (*fn)(void *), - void *arg, void *unused1) -{ - do_exit(fn(arg)); -} - -/* - * Create a kernel thread. - */ -long kernel_thread(int (*fn)(void *), void *arg, unsigned long flags) -{ - struct pt_regs regs; - - memset(®s, 0, sizeof(regs)); - - regs.regs[6] = (unsigned long) arg; - regs.regs[5] = (unsigned long) fn; - regs.cp0_epc = (unsigned long) kernel_thread_helper; - regs.cp0_psr = (regs.cp0_psr & ~(0x1|0x4|0x8)) | \ - ((regs.cp0_psr & 0x3) << 2); - - return do_fork(flags | CLONE_VM | CLONE_UNTRACED, \ - 0, ®s, 0, NULL, NULL); -} - -unsigned long thread_saved_pc(struct task_struct *tsk) -{ - return task_pt_regs(tsk)->cp0_epc; -} - -unsigned long get_wchan(struct task_struct *task) -{ - if (!task || task == current || task->state == TASK_RUNNING) - return 0; - - if (!task_stack_page(task)) - return 0; - - return task_pt_regs(task)->cp0_epc; -} - -unsigned long arch_align_stack(unsigned long sp) -{ - return sp; -} diff --git a/ANDROID_3.4.5/arch/score/kernel/ptrace.c b/ANDROID_3.4.5/arch/score/kernel/ptrace.c deleted file mode 100644 index 55836188..00000000 --- a/ANDROID_3.4.5/arch/score/kernel/ptrace.c +++ /dev/null @@ -1,383 +0,0 @@ -/* - * arch/score/kernel/ptrace.c - * - * Score Processor version. - * - * Copyright (C) 2009 Sunplus Core Technology Co., Ltd. - * Chen Liqin <liqin.chen@sunplusct.com> - * Lennox Wu <lennox.wu@sunplusct.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, 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, see the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/elf.h> -#include <linux/kernel.h> -#include <linux/mm.h> -#include <linux/ptrace.h> -#include <linux/regset.h> - -#include <asm/uaccess.h> - -/* - * retrieve the contents of SCORE userspace general registers - */ -static int genregs_get(struct task_struct *target, - const struct user_regset *regset, - unsigned int pos, unsigned int count, - void *kbuf, void __user *ubuf) -{ - const struct pt_regs *regs = task_pt_regs(target); - int ret; - - /* skip 9 * sizeof(unsigned long) not use for pt_regs */ - ret = user_regset_copyout_zero(&pos, &count, &kbuf, &ubuf, - 0, offsetof(struct pt_regs, regs)); - - /* r0 - r31, cel, ceh, sr0, sr1, sr2, epc, ema, psr, ecr, condition */ - ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf, - regs->regs, - offsetof(struct pt_regs, regs), - offsetof(struct pt_regs, cp0_condition)); - - if (!ret) - ret = user_regset_copyout_zero(&pos, &count, &kbuf, &ubuf, - sizeof(struct pt_regs), -1); - - return ret; -} - -/* - * update the contents of the SCORE userspace general registers - */ -static int genregs_set(struct task_struct *target, - const struct user_regset *regset, - unsigned int pos, unsigned int count, - const void *kbuf, const void __user *ubuf) -{ - struct pt_regs *regs = task_pt_regs(target); - int ret; - - /* skip 9 * sizeof(unsigned long) */ - ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, - 0, offsetof(struct pt_regs, regs)); - - /* r0 - r31, cel, ceh, sr0, sr1, sr2, epc, ema, psr, ecr, condition */ - ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, - regs->regs, - offsetof(struct pt_regs, regs), - offsetof(struct pt_regs, cp0_condition)); - - if (!ret) - ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, - sizeof(struct pt_regs), -1); - - return ret; -} - -/* - * Define the register sets available on the score7 under Linux - */ -enum score7_regset { - REGSET_GENERAL, -}; - -static const struct user_regset score7_regsets[] = { - [REGSET_GENERAL] = { - .core_note_type = NT_PRSTATUS, - .n = ELF_NGREG, - .size = sizeof(long), - .align = sizeof(long), - .get = genregs_get, - .set = genregs_set, - }, -}; - -static const struct user_regset_view user_score_native_view = { - .name = "score7", - .e_machine = EM_SCORE7, - .regsets = score7_regsets, - .n = ARRAY_SIZE(score7_regsets), -}; - -const struct user_regset_view *task_user_regset_view(struct task_struct *task) -{ - return &user_score_native_view; -} - -static int is_16bitinsn(unsigned long insn) -{ - if ((insn & INSN32_MASK) == INSN32_MASK) - return 0; - else - return 1; -} - -int -read_tsk_long(struct task_struct *child, - unsigned long addr, unsigned long *res) -{ - int copied; - - copied = access_process_vm(child, addr, res, sizeof(*res), 0); - - return copied != sizeof(*res) ? -EIO : 0; -} - -int -read_tsk_short(struct task_struct *child, - unsigned long addr, unsigned short *res) -{ - int copied; - - copied = access_process_vm(child, addr, res, sizeof(*res), 0); - - return copied != sizeof(*res) ? -EIO : 0; -} - -static int -write_tsk_short(struct task_struct *child, - unsigned long addr, unsigned short val) -{ - int copied; - - copied = access_process_vm(child, addr, &val, sizeof(val), 1); - - return copied != sizeof(val) ? -EIO : 0; -} - -static int -write_tsk_long(struct task_struct *child, - unsigned long addr, unsigned long val) -{ - int copied; - - copied = access_process_vm(child, addr, &val, sizeof(val), 1); - - return copied != sizeof(val) ? -EIO : 0; -} - -void user_enable_single_step(struct task_struct *child) -{ - /* far_epc is the target of branch */ - unsigned int epc, far_epc = 0; - unsigned long epc_insn, far_epc_insn; - int ninsn_type; /* next insn type 0=16b, 1=32b */ - unsigned int tmp, tmp2; - struct pt_regs *regs = task_pt_regs(child); - child->thread.single_step = 1; - child->thread.ss_nextcnt = 1; - epc = regs->cp0_epc; - - read_tsk_long(child, epc, &epc_insn); - - if (is_16bitinsn(epc_insn)) { - if ((epc_insn & J16M) == J16) { - tmp = epc_insn & 0xFFE; - epc = (epc & 0xFFFFF000) | tmp; - } else if ((epc_insn & B16M) == B16) { - child->thread.ss_nextcnt = 2; - tmp = (epc_insn & 0xFF) << 1; - tmp = tmp << 23; - tmp = (unsigned int)((int) tmp >> 23); - far_epc = epc + tmp; - epc += 2; - } else if ((epc_insn & BR16M) == BR16) { - child->thread.ss_nextcnt = 2; - tmp = (epc_insn >> 4) & 0xF; - far_epc = regs->regs[tmp]; - epc += 2; - } else - epc += 2; - } else { - if ((epc_insn & J32M) == J32) { - tmp = epc_insn & 0x03FFFFFE; - tmp2 = tmp & 0x7FFF; - tmp = (((tmp >> 16) & 0x3FF) << 15) | tmp2; - epc = (epc & 0xFFC00000) | tmp; - } else if ((epc_insn & B32M) == B32) { - child->thread.ss_nextcnt = 2; - tmp = epc_insn & 0x03FFFFFE; /* discard LK bit */ - tmp2 = tmp & 0x3FF; - tmp = (((tmp >> 16) & 0x3FF) << 10) | tmp2; /* 20bit */ - tmp = tmp << 12; - tmp = (unsigned int)((int) tmp >> 12); - far_epc = epc + tmp; - epc += 4; - } else if ((epc_insn & BR32M) == BR32) { - child->thread.ss_nextcnt = 2; - tmp = (epc_insn >> 16) & 0x1F; - far_epc = regs->regs[tmp]; - epc += 4; - } else - epc += 4; - } - - if (child->thread.ss_nextcnt == 1) { - read_tsk_long(child, epc, &epc_insn); - - if (is_16bitinsn(epc_insn)) { - write_tsk_short(child, epc, SINGLESTEP16_INSN); - ninsn_type = 0; - } else { - write_tsk_long(child, epc, SINGLESTEP32_INSN); - ninsn_type = 1; - } - - if (ninsn_type == 0) { /* 16bits */ - child->thread.insn1_type = 0; - child->thread.addr1 = epc; - /* the insn may have 32bit data */ - child->thread.insn1 = (short)epc_insn; - } else { - child->thread.insn1_type = 1; - child->thread.addr1 = epc; - child->thread.insn1 = epc_insn; - } - } else { - /* branch! have two target child->thread.ss_nextcnt=2 */ - read_tsk_long(child, epc, &epc_insn); - read_tsk_long(child, far_epc, &far_epc_insn); - if (is_16bitinsn(epc_insn)) { - write_tsk_short(child, epc, SINGLESTEP16_INSN); - ninsn_type = 0; - } else { - write_tsk_long(child, epc, SINGLESTEP32_INSN); - ninsn_type = 1; - } - - if (ninsn_type == 0) { /* 16bits */ - child->thread.insn1_type = 0; - child->thread.addr1 = epc; - /* the insn may have 32bit data */ - child->thread.insn1 = (short)epc_insn; - } else { - child->thread.insn1_type = 1; - child->thread.addr1 = epc; - child->thread.insn1 = epc_insn; - } - - if (is_16bitinsn(far_epc_insn)) { - write_tsk_short(child, far_epc, SINGLESTEP16_INSN); - ninsn_type = 0; - } else { - write_tsk_long(child, far_epc, SINGLESTEP32_INSN); - ninsn_type = 1; - } - - if (ninsn_type == 0) { /* 16bits */ - child->thread.insn2_type = 0; - child->thread.addr2 = far_epc; - /* the insn may have 32bit data */ - child->thread.insn2 = (short)far_epc_insn; - } else { - child->thread.insn2_type = 1; - child->thread.addr2 = far_epc; - child->thread.insn2 = far_epc_insn; - } - } -} - -void user_disable_single_step(struct task_struct *child) -{ - if (child->thread.insn1_type == 0) - write_tsk_short(child, child->thread.addr1, - child->thread.insn1); - - if (child->thread.insn1_type == 1) - write_tsk_long(child, child->thread.addr1, - child->thread.insn1); - - if (child->thread.ss_nextcnt == 2) { /* branch */ - if (child->thread.insn1_type == 0) - write_tsk_short(child, child->thread.addr1, - child->thread.insn1); - if (child->thread.insn1_type == 1) - write_tsk_long(child, child->thread.addr1, - child->thread.insn1); - if (child->thread.insn2_type == 0) - write_tsk_short(child, child->thread.addr2, - child->thread.insn2); - if (child->thread.insn2_type == 1) - write_tsk_long(child, child->thread.addr2, - child->thread.insn2); - } - - child->thread.single_step = 0; - child->thread.ss_nextcnt = 0; -} - -void ptrace_disable(struct task_struct *child) -{ - user_disable_single_step(child); -} - -long -arch_ptrace(struct task_struct *child, long request, - unsigned long addr, unsigned long data) -{ - int ret; - unsigned long __user *datap = (void __user *)data; - - switch (request) { - case PTRACE_GETREGS: - ret = copy_regset_to_user(child, &user_score_native_view, - REGSET_GENERAL, - 0, sizeof(struct pt_regs), - datap); - break; - - case PTRACE_SETREGS: - ret = copy_regset_from_user(child, &user_score_native_view, - REGSET_GENERAL, - 0, sizeof(struct pt_regs), - datap); - break; - - default: - ret = ptrace_request(child, request, addr, data); - break; - } - - return ret; -} - -/* - * Notification of system call entry/exit - * - triggered by current->work.syscall_trace - */ -asmlinkage void do_syscall_trace(struct pt_regs *regs, int entryexit) -{ - if (!(current->ptrace & PT_PTRACED)) - return; - - if (!test_thread_flag(TIF_SYSCALL_TRACE)) - return; - - /* The 0x80 provides a way for the tracing parent to distinguish - between a syscall stop and SIGTRAP delivery. */ - ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) ? - 0x80 : 0)); - - /* - * this isn't the same as continuing with a signal, but it will do - * for normal use. strace only continues with a signal if the - * stopping signal is not SIGTRAP. -brl - */ - if (current->exit_code) { - send_sig(current->exit_code, current, 1); - current->exit_code = 0; - } -} diff --git a/ANDROID_3.4.5/arch/score/kernel/setup.c b/ANDROID_3.4.5/arch/score/kernel/setup.c deleted file mode 100644 index b48459af..00000000 --- a/ANDROID_3.4.5/arch/score/kernel/setup.c +++ /dev/null @@ -1,162 +0,0 @@ -/* - * arch/score/kernel/setup.c - * - * Score Processor version. - * - * Copyright (C) 2009 Sunplus Core Technology Co., Ltd. - * Chen Liqin <liqin.chen@sunplusct.com> - * Lennox Wu <lennox.wu@sunplusct.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, 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, see the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/bootmem.h> -#include <linux/initrd.h> -#include <linux/ioport.h> -#include <linux/memblock.h> -#include <linux/mm.h> -#include <linux/seq_file.h> -#include <linux/screen_info.h> - -#include <asm-generic/sections.h> -#include <asm/setup.h> - -struct screen_info screen_info; -unsigned long kernelsp; - -static char command_line[COMMAND_LINE_SIZE]; -static struct resource code_resource = { .name = "Kernel code",}; -static struct resource data_resource = { .name = "Kernel data",}; - -static void __init bootmem_init(void) -{ - unsigned long start_pfn, bootmap_size; - unsigned long size = initrd_end - initrd_start; - - start_pfn = PFN_UP(__pa(&_end)); - - min_low_pfn = PFN_UP(MEMORY_START); - max_low_pfn = PFN_UP(MEMORY_START + MEMORY_SIZE); - max_mapnr = max_low_pfn - min_low_pfn; - - /* Initialize the boot-time allocator with low memory only. */ - bootmap_size = init_bootmem_node(NODE_DATA(0), start_pfn, - min_low_pfn, max_low_pfn); - memblock_add_node(PFN_PHYS(min_low_pfn), - PFN_PHYS(max_low_pfn - min_low_pfn), 0); - - free_bootmem(PFN_PHYS(start_pfn), - (max_low_pfn - start_pfn) << PAGE_SHIFT); - memory_present(0, start_pfn, max_low_pfn); - - /* Reserve space for the bootmem bitmap. */ - reserve_bootmem(PFN_PHYS(start_pfn), bootmap_size, BOOTMEM_DEFAULT); - - if (size == 0) { - printk(KERN_INFO "Initrd not found or empty"); - goto disable; - } - - if (__pa(initrd_end) > PFN_PHYS(max_low_pfn)) { - printk(KERN_ERR "Initrd extends beyond end of memory"); - goto disable; - } - - /* Reserve space for the initrd bitmap. */ - reserve_bootmem(__pa(initrd_start), size, BOOTMEM_DEFAULT); - initrd_below_start_ok = 1; - - pr_info("Initial ramdisk at: 0x%lx (%lu bytes)\n", - initrd_start, size); - return; -disable: - printk(KERN_CONT " - disabling initrd\n"); - initrd_start = 0; - initrd_end = 0; -} - -static void __init resource_init(void) -{ - struct resource *res; - - code_resource.start = __pa(&_text); - code_resource.end = __pa(&_etext) - 1; - data_resource.start = __pa(&_etext); - data_resource.end = __pa(&_edata) - 1; - - res = alloc_bootmem(sizeof(struct resource)); - res->name = "System RAM"; - res->start = MEMORY_START; - res->end = MEMORY_START + MEMORY_SIZE - 1; - res->flags = IORESOURCE_MEM | IORESOURCE_BUSY; - request_resource(&iomem_resource, res); - - request_resource(res, &code_resource); - request_resource(res, &data_resource); -} - -void __init setup_arch(char **cmdline_p) -{ - randomize_va_space = 0; - *cmdline_p = command_line; - - cpu_cache_init(); - tlb_init(); - bootmem_init(); - paging_init(); - resource_init(); -} - -static int show_cpuinfo(struct seq_file *m, void *v) -{ - unsigned long n = (unsigned long) v - 1; - - seq_printf(m, "processor\t\t: %ld\n", n); - seq_printf(m, "\n"); - - return 0; -} - -static void *c_start(struct seq_file *m, loff_t *pos) -{ - unsigned long i = *pos; - - return i < 1 ? (void *) (i + 1) : NULL; -} - -static void *c_next(struct seq_file *m, void *v, loff_t *pos) -{ - ++*pos; - return c_start(m, pos); -} - -static void c_stop(struct seq_file *m, void *v) -{ -} - -const struct seq_operations cpuinfo_op = { - .start = c_start, - .next = c_next, - .stop = c_stop, - .show = show_cpuinfo, -}; - -static int __init topology_init(void) -{ - return 0; -} - -subsys_initcall(topology_init); diff --git a/ANDROID_3.4.5/arch/score/kernel/signal.c b/ANDROID_3.4.5/arch/score/kernel/signal.c deleted file mode 100644 index aa57440e..00000000 --- a/ANDROID_3.4.5/arch/score/kernel/signal.c +++ /dev/null @@ -1,361 +0,0 @@ -/* - * arch/score/kernel/signal.c - * - * Score Processor version. - * - * Copyright (C) 2009 Sunplus Core Technology Co., Ltd. - * Chen Liqin <liqin.chen@sunplusct.com> - * Lennox Wu <lennox.wu@sunplusct.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, 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, see the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/errno.h> -#include <linux/signal.h> -#include <linux/ptrace.h> -#include <linux/unistd.h> -#include <linux/uaccess.h> - -#include <asm/cacheflush.h> -#include <asm/syscalls.h> -#include <asm/ucontext.h> - -#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) - -struct rt_sigframe { - u32 rs_ass[4]; /* argument save space */ - u32 rs_code[2]; /* signal trampoline */ - struct siginfo rs_info; - struct ucontext rs_uc; -}; - -static int setup_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc) -{ - int err = 0; - unsigned long reg; - - reg = regs->cp0_epc; err |= __put_user(reg, &sc->sc_pc); - err |= __put_user(regs->cp0_psr, &sc->sc_psr); - err |= __put_user(regs->cp0_condition, &sc->sc_condition); - - -#define save_gp_reg(i) { \ - reg = regs->regs[i]; \ - err |= __put_user(reg, &sc->sc_regs[i]); \ -} while (0) - save_gp_reg(0); save_gp_reg(1); save_gp_reg(2); - save_gp_reg(3); save_gp_reg(4); save_gp_reg(5); - save_gp_reg(6); save_gp_reg(7); save_gp_reg(8); - save_gp_reg(9); save_gp_reg(10); save_gp_reg(11); - save_gp_reg(12); save_gp_reg(13); save_gp_reg(14); - save_gp_reg(15); save_gp_reg(16); save_gp_reg(17); - save_gp_reg(18); save_gp_reg(19); save_gp_reg(20); - save_gp_reg(21); save_gp_reg(22); save_gp_reg(23); - save_gp_reg(24); save_gp_reg(25); save_gp_reg(26); - save_gp_reg(27); save_gp_reg(28); save_gp_reg(29); -#undef save_gp_reg - - reg = regs->ceh; err |= __put_user(reg, &sc->sc_mdceh); - reg = regs->cel; err |= __put_user(reg, &sc->sc_mdcel); - err |= __put_user(regs->cp0_ecr, &sc->sc_ecr); - err |= __put_user(regs->cp0_ema, &sc->sc_ema); - - return err; -} - -static int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc) -{ - int err = 0; - u32 reg; - - err |= __get_user(regs->cp0_epc, &sc->sc_pc); - err |= __get_user(regs->cp0_condition, &sc->sc_condition); - - err |= __get_user(reg, &sc->sc_mdceh); - regs->ceh = (int) reg; - err |= __get_user(reg, &sc->sc_mdcel); - regs->cel = (int) reg; - - err |= __get_user(reg, &sc->sc_psr); - regs->cp0_psr = (int) reg; - err |= __get_user(reg, &sc->sc_ecr); - regs->cp0_ecr = (int) reg; - err |= __get_user(reg, &sc->sc_ema); - regs->cp0_ema = (int) reg; - -#define restore_gp_reg(i) do { \ - err |= __get_user(reg, &sc->sc_regs[i]); \ - regs->regs[i] = reg; \ -} while (0) - restore_gp_reg(0); restore_gp_reg(1); restore_gp_reg(2); - restore_gp_reg(3); restore_gp_reg(4); restore_gp_reg(5); - restore_gp_reg(6); restore_gp_reg(7); restore_gp_reg(8); - restore_gp_reg(9); restore_gp_reg(10); restore_gp_reg(11); - restore_gp_reg(12); restore_gp_reg(13); restore_gp_reg(14); - restore_gp_reg(15); restore_gp_reg(16); restore_gp_reg(17); - restore_gp_reg(18); restore_gp_reg(19); restore_gp_reg(20); - restore_gp_reg(21); restore_gp_reg(22); restore_gp_reg(23); - restore_gp_reg(24); restore_gp_reg(25); restore_gp_reg(26); - restore_gp_reg(27); restore_gp_reg(28); restore_gp_reg(29); -#undef restore_gp_reg - - return err; -} - -/* - * Determine which stack to use.. - */ -static void __user *get_sigframe(struct k_sigaction *ka, - struct pt_regs *regs, size_t frame_size) -{ - unsigned long sp; - - /* Default to using normal stack */ - sp = regs->regs[0]; - sp -= 32; - - /* This is the X/Open sanctioned signal stack switching. */ - if ((ka->sa.sa_flags & SA_ONSTACK) && (!on_sig_stack(sp))) - sp = current->sas_ss_sp + current->sas_ss_size; - - return (void __user*)((sp - frame_size) & ~7); -} - -asmlinkage long -score_sigaltstack(struct pt_regs *regs) -{ - 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); -} - -asmlinkage long -score_rt_sigreturn(struct pt_regs *regs) -{ - struct rt_sigframe __user *frame; - sigset_t set; - stack_t st; - int sig; - - frame = (struct rt_sigframe __user *) regs->regs[0]; - if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) - goto badframe; - if (__copy_from_user(&set, &frame->rs_uc.uc_sigmask, sizeof(set))) - goto badframe; - - sigdelsetmask(&set, ~_BLOCKABLE); - spin_lock_irq(¤t->sighand->siglock); - current->blocked = set; - recalc_sigpending(); - spin_unlock_irq(¤t->sighand->siglock); - - sig = restore_sigcontext(regs, &frame->rs_uc.uc_mcontext); - if (sig < 0) - goto badframe; - else if (sig) - force_sig(sig, current); - - if (__copy_from_user(&st, &frame->rs_uc.uc_stack, sizeof(st))) - goto badframe; - - /* It is more difficult to avoid calling this function than to - call it and ignore errors. */ - do_sigaltstack((stack_t __user *)&st, NULL, regs->regs[0]); - - __asm__ __volatile__( - "mv\tr0, %0\n\t" - "la\tr8, syscall_exit\n\t" - "br\tr8\n\t" - : : "r" (regs) : "r8"); - -badframe: - force_sig(SIGSEGV, current); - - return 0; -} - -static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs, - int signr, sigset_t *set, siginfo_t *info) -{ - struct rt_sigframe __user *frame; - int err = 0; - - frame = get_sigframe(ka, regs, sizeof(*frame)); - if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) - goto give_sigsegv; - - /* - * Set up the return code ... - * - * li v0, __NR_rt_sigreturn - * syscall - */ - err |= __put_user(0x87788000 + __NR_rt_sigreturn*2, - frame->rs_code + 0); - err |= __put_user(0x80008002, frame->rs_code + 1); - flush_cache_sigtramp((unsigned long) frame->rs_code); - - err |= copy_siginfo_to_user(&frame->rs_info, info); - err |= __put_user(0, &frame->rs_uc.uc_flags); - 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); - err |= __put_user(current->sas_ss_size, - &frame->rs_uc.uc_stack.ss_size); - err |= setup_sigcontext(regs, &frame->rs_uc.uc_mcontext); - err |= __copy_to_user(&frame->rs_uc.uc_sigmask, set, sizeof(*set)); - - if (err) - goto give_sigsegv; - - regs->regs[0] = (unsigned long) frame; - regs->regs[3] = (unsigned long) frame->rs_code; - regs->regs[4] = signr; - regs->regs[5] = (unsigned long) &frame->rs_info; - regs->regs[6] = (unsigned long) &frame->rs_uc; - regs->regs[29] = (unsigned long) ka->sa.sa_handler; - regs->cp0_epc = (unsigned long) ka->sa.sa_handler; - - return 0; - -give_sigsegv: - if (signr == SIGSEGV) - ka->sa.sa_handler = SIG_DFL; - force_sig(SIGSEGV, current); - return -EFAULT; -} - -static int handle_signal(unsigned long sig, siginfo_t *info, - struct k_sigaction *ka, sigset_t *oldset, struct pt_regs *regs) -{ - int ret; - - if (regs->is_syscall) { - switch (regs->regs[4]) { - case ERESTART_RESTARTBLOCK: - case ERESTARTNOHAND: - regs->regs[4] = EINTR; - break; - case ERESTARTSYS: - if (!(ka->sa.sa_flags & SA_RESTART)) { - regs->regs[4] = EINTR; - break; - } - case ERESTARTNOINTR: - regs->regs[4] = regs->orig_r4; - regs->regs[7] = regs->orig_r7; - regs->cp0_epc -= 8; - } - - regs->is_syscall = 0; - } - - /* - * Set up the stack frame - */ - ret = setup_rt_frame(ka, regs, sig, oldset, info); - - spin_lock_irq(¤t->sighand->siglock); - sigorsets(¤t->blocked, ¤t->blocked, &ka->sa.sa_mask); - if (!(ka->sa.sa_flags & SA_NODEFER)) - sigaddset(¤t->blocked, sig); - recalc_sigpending(); - spin_unlock_irq(¤t->sighand->siglock); - - return ret; -} - -static void do_signal(struct pt_regs *regs) -{ - struct k_sigaction ka; - sigset_t *oldset; - siginfo_t info; - int signr; - - /* - * We want the common case to go fast, which is why we may in certain - * cases get here from kernel mode. Just return without doing anything - * if so. - */ - if (!user_mode(regs)) - return; - - if (test_thread_flag(TIF_RESTORE_SIGMASK)) - oldset = ¤t->saved_sigmask; - else - oldset = ¤t->blocked; - - signr = get_signal_to_deliver(&info, &ka, regs, NULL); - if (signr > 0) { - /* Actually deliver the signal. */ - if (handle_signal(signr, &info, &ka, oldset, regs) == 0) { - /* - * A signal was successfully delivered; the saved - * sigmask will have been stored in the signal frame, - * and will be restored by sigreturn, so we can simply - * clear the TIF_RESTORE_SIGMASK flag. - */ - if (test_thread_flag(TIF_RESTORE_SIGMASK)) - clear_thread_flag(TIF_RESTORE_SIGMASK); - } - - return; - } - - if (regs->is_syscall) { - if (regs->regs[4] == ERESTARTNOHAND || - regs->regs[4] == ERESTARTSYS || - regs->regs[4] == ERESTARTNOINTR) { - regs->regs[4] = regs->orig_r4; - regs->regs[7] = regs->orig_r7; - regs->cp0_epc -= 8; - } - - if (regs->regs[4] == ERESTART_RESTARTBLOCK) { - regs->regs[27] = __NR_restart_syscall; - regs->regs[4] = regs->orig_r4; - regs->regs[7] = regs->orig_r7; - regs->cp0_epc -= 8; - } - - regs->is_syscall = 0; /* Don't deal with this again. */ - } - - /* - * If there's no signal to deliver, we just put the saved sigmask - * back - */ - if (test_thread_flag(TIF_RESTORE_SIGMASK)) { - clear_thread_flag(TIF_RESTORE_SIGMASK); - sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); - } -} - -/* - * notification of userspace execution resumption - * - triggered by the TIF_WORK_MASK flags - */ -asmlinkage void do_notify_resume(struct pt_regs *regs, void *unused, - __u32 thread_info_flags) -{ - /* deal with pending signal delivery */ - if (thread_info_flags & (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK)) - do_signal(regs); -} diff --git a/ANDROID_3.4.5/arch/score/kernel/sys_call_table.c b/ANDROID_3.4.5/arch/score/kernel/sys_call_table.c deleted file mode 100644 index 287369b8..00000000 --- a/ANDROID_3.4.5/arch/score/kernel/sys_call_table.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <linux/syscalls.h> -#include <linux/signal.h> -#include <linux/unistd.h> - -#include <asm/syscalls.h> - -#undef __SYSCALL -#define __SYSCALL(nr, call) [nr] = (call), - -void *sys_call_table[__NR_syscalls] = { -#include <asm/unistd.h> -}; diff --git a/ANDROID_3.4.5/arch/score/kernel/sys_score.c b/ANDROID_3.4.5/arch/score/kernel/sys_score.c deleted file mode 100644 index e478bf9a..00000000 --- a/ANDROID_3.4.5/arch/score/kernel/sys_score.c +++ /dev/null @@ -1,138 +0,0 @@ -/* - * arch/score/kernel/syscall.c - * - * Score Processor version. - * - * Copyright (C) 2009 Sunplus Core Technology Co., Ltd. - * Chen Liqin <liqin.chen@sunplusct.com> - * Lennox Wu <lennox.wu@sunplusct.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, 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, see the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/file.h> -#include <linux/fs.h> -#include <linux/mm.h> -#include <linux/mman.h> -#include <linux/module.h> -#include <linux/slab.h> -#include <linux/unistd.h> -#include <linux/syscalls.h> -#include <asm/syscalls.h> - -asmlinkage long -sys_mmap2(unsigned long addr, unsigned long len, unsigned long prot, - unsigned long flags, unsigned long fd, unsigned long pgoff) -{ - return sys_mmap_pgoff(addr, len, prot, flags, fd, pgoff); -} - -asmlinkage long -sys_mmap(unsigned long addr, unsigned long len, unsigned long prot, - unsigned long flags, unsigned long fd, off_t offset) -{ - if (unlikely(offset & ~PAGE_MASK)) - return -EINVAL; - return sys_mmap_pgoff(addr, len, prot, flags, fd, offset >> PAGE_SHIFT); -} - -asmlinkage long -score_fork(struct pt_regs *regs) -{ - return do_fork(SIGCHLD, regs->regs[0], regs, 0, NULL, NULL); -} - -/* - * Clone a task - this clones the calling program thread. - * This is called indirectly via a small wrapper - */ -asmlinkage long -score_clone(struct pt_regs *regs) -{ - unsigned long clone_flags; - unsigned long newsp; - int __user *parent_tidptr, *child_tidptr; - - clone_flags = regs->regs[4]; - newsp = regs->regs[5]; - if (!newsp) - newsp = regs->regs[0]; - parent_tidptr = (int __user *)regs->regs[6]; - child_tidptr = (int __user *)regs->regs[8]; - - return do_fork(clone_flags, newsp, regs, 0, - parent_tidptr, child_tidptr); -} - -asmlinkage long -score_vfork(struct pt_regs *regs) -{ - return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, - regs->regs[0], regs, 0, NULL, NULL); -} - -/* - * sys_execve() executes a new program. - * This is called indirectly via a small wrapper - */ -asmlinkage long -score_execve(struct pt_regs *regs) -{ - int error; - char *filename; - - filename = getname((char __user*)regs->regs[4]); - error = PTR_ERR(filename); - if (IS_ERR(filename)) - return error; - - error = do_execve(filename, - (const char __user *const __user *)regs->regs[5], - (const char __user *const __user *)regs->regs[6], - regs); - - putname(filename); - return error; -} - -/* - * Do a system call from kernel instead of calling sys_execve so we - * end up with proper pt_regs. - */ -int kernel_execve(const char *filename, - const char *const argv[], - const char *const envp[]) -{ - register unsigned long __r4 asm("r4") = (unsigned long) filename; - register unsigned long __r5 asm("r5") = (unsigned long) argv; - register unsigned long __r6 asm("r6") = (unsigned long) envp; - register unsigned long __r7 asm("r7"); - - __asm__ __volatile__ (" \n" - "ldi r27, %5 \n" - "syscall \n" - "mv %0, r4 \n" - "mv %1, r7 \n" - : "=&r" (__r4), "=r" (__r7) - : "r" (__r4), "r" (__r5), "r" (__r6), "i" (__NR_execve) - : "r8", "r9", "r10", "r11", "r22", "r23", "r24", "r25", - "r26", "r27", "memory"); - - if (__r7 == 0) - return __r4; - - return -__r4; -} diff --git a/ANDROID_3.4.5/arch/score/kernel/time.c b/ANDROID_3.4.5/arch/score/kernel/time.c deleted file mode 100644 index f0a43aff..00000000 --- a/ANDROID_3.4.5/arch/score/kernel/time.c +++ /dev/null @@ -1,99 +0,0 @@ -/* - * arch/score/kernel/time.c - * - * Score Processor version. - * - * Copyright (C) 2009 Sunplus Core Technology Co., Ltd. - * Chen Liqin <liqin.chen@sunplusct.com> - * Lennox Wu <lennox.wu@sunplusct.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, 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, see the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/clockchips.h> -#include <linux/interrupt.h> - -#include <asm/scoreregs.h> - -static irqreturn_t timer_interrupt(int irq, void *dev_id) -{ - struct clock_event_device *evdev = dev_id; - - /* clear timer interrupt flag */ - outl(1, P_TIMER0_CPP_REG); - evdev->event_handler(evdev); - - return IRQ_HANDLED; -} - -static struct irqaction timer_irq = { - .handler = timer_interrupt, - .flags = IRQF_DISABLED | IRQF_TIMER, - .name = "timer", -}; - -static int score_timer_set_next_event(unsigned long delta, - struct clock_event_device *evdev) -{ - outl((TMR_M_PERIODIC | TMR_IE_ENABLE), P_TIMER0_CTRL); - outl(delta, P_TIMER0_PRELOAD); - outl(inl(P_TIMER0_CTRL) | TMR_ENABLE, P_TIMER0_CTRL); - - return 0; -} - -static void score_timer_set_mode(enum clock_event_mode mode, - struct clock_event_device *evdev) -{ - switch (mode) { - case CLOCK_EVT_MODE_PERIODIC: - outl((TMR_M_PERIODIC | TMR_IE_ENABLE), P_TIMER0_CTRL); - outl(SYSTEM_CLOCK/HZ, P_TIMER0_PRELOAD); - outl(inl(P_TIMER0_CTRL) | TMR_ENABLE, P_TIMER0_CTRL); - break; - case CLOCK_EVT_MODE_ONESHOT: - case CLOCK_EVT_MODE_SHUTDOWN: - case CLOCK_EVT_MODE_RESUME: - case CLOCK_EVT_MODE_UNUSED: - break; - default: - BUG(); - } -} - -static struct clock_event_device score_clockevent = { - .name = "score_clockevent", - .features = CLOCK_EVT_FEAT_PERIODIC, - .shift = 16, - .set_next_event = score_timer_set_next_event, - .set_mode = score_timer_set_mode, -}; - -void __init time_init(void) -{ - timer_irq.dev_id = &score_clockevent; - setup_irq(IRQ_TIMER , &timer_irq); - - /* setup COMPARE clockevent */ - score_clockevent.mult = div_sc(SYSTEM_CLOCK, NSEC_PER_SEC, - score_clockevent.shift); - score_clockevent.max_delta_ns = clockevent_delta2ns((u32)~0, - &score_clockevent); - score_clockevent.min_delta_ns = clockevent_delta2ns(50, - &score_clockevent) + 1; - score_clockevent.cpumask = cpumask_of(0); - clockevents_register_device(&score_clockevent); -} diff --git a/ANDROID_3.4.5/arch/score/kernel/traps.c b/ANDROID_3.4.5/arch/score/kernel/traps.c deleted file mode 100644 index 0e46fb19..00000000 --- a/ANDROID_3.4.5/arch/score/kernel/traps.c +++ /dev/null @@ -1,349 +0,0 @@ -/* - * arch/score/kernel/traps.c - * - * Score Processor version. - * - * Copyright (C) 2009 Sunplus Core Technology Co., Ltd. - * Chen Liqin <liqin.chen@sunplusct.com> - * Lennox Wu <lennox.wu@sunplusct.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, 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, see the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/module.h> -#include <linux/sched.h> - -#include <asm/cacheflush.h> -#include <asm/irq.h> -#include <asm/irq_regs.h> - -unsigned long exception_handlers[32]; - -/* - * The architecture-independent show_stack generator - */ -void show_stack(struct task_struct *task, unsigned long *sp) -{ - int i; - long stackdata; - - sp = sp ? sp : (unsigned long *)&sp; - - printk(KERN_NOTICE "Stack: "); - i = 1; - while ((long) sp & (PAGE_SIZE - 1)) { - if (i && ((i % 8) == 0)) - printk(KERN_NOTICE "\n"); - if (i > 40) { - printk(KERN_NOTICE " ..."); - break; - } - - if (__get_user(stackdata, sp++)) { - printk(KERN_NOTICE " (Bad stack address)"); - break; - } - - printk(KERN_NOTICE " %08lx", stackdata); - i++; - } - printk(KERN_NOTICE "\n"); -} - -static void show_trace(long *sp) -{ - int i; - long addr; - - sp = sp ? sp : (long *) &sp; - - printk(KERN_NOTICE "Call Trace: "); - i = 1; - while ((long) sp & (PAGE_SIZE - 1)) { - if (__get_user(addr, sp++)) { - if (i && ((i % 6) == 0)) - printk(KERN_NOTICE "\n"); - printk(KERN_NOTICE " (Bad stack address)\n"); - break; - } - - if (kernel_text_address(addr)) { - if (i && ((i % 6) == 0)) - printk(KERN_NOTICE "\n"); - if (i > 40) { - printk(KERN_NOTICE " ..."); - break; - } - - printk(KERN_NOTICE " [<%08lx>]", addr); - i++; - } - } - printk(KERN_NOTICE "\n"); -} - -static void show_code(unsigned int *pc) -{ - long i; - - printk(KERN_NOTICE "\nCode:"); - - for (i = -3; i < 6; i++) { - unsigned long insn; - if (__get_user(insn, pc + i)) { - printk(KERN_NOTICE " (Bad address in epc)\n"); - break; - } - printk(KERN_NOTICE "%c%08lx%c", (i ? ' ' : '<'), - insn, (i ? ' ' : '>')); - } -} - -/* - * FIXME: really the generic show_regs should take a const pointer argument. - */ -void show_regs(struct pt_regs *regs) -{ - printk("r0 : %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - regs->regs[0], regs->regs[1], regs->regs[2], regs->regs[3], - regs->regs[4], regs->regs[5], regs->regs[6], regs->regs[7]); - printk("r8 : %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - regs->regs[8], regs->regs[9], regs->regs[10], regs->regs[11], - regs->regs[12], regs->regs[13], regs->regs[14], regs->regs[15]); - printk("r16: %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - regs->regs[16], regs->regs[17], regs->regs[18], regs->regs[19], - regs->regs[20], regs->regs[21], regs->regs[22], regs->regs[23]); - printk("r24: %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - regs->regs[24], regs->regs[25], regs->regs[26], regs->regs[27], - regs->regs[28], regs->regs[29], regs->regs[30], regs->regs[31]); - - printk("CEH : %08lx\n", regs->ceh); - printk("CEL : %08lx\n", regs->cel); - - printk("EMA:%08lx, epc:%08lx %s\nPSR: %08lx\nECR:%08lx\nCondition : %08lx\n", - regs->cp0_ema, regs->cp0_epc, print_tainted(), regs->cp0_psr, - regs->cp0_ecr, regs->cp0_condition); -} - -static void show_registers(struct pt_regs *regs) -{ - show_regs(regs); - printk(KERN_NOTICE "Process %s (pid: %d, stackpage=%08lx)\n", - current->comm, current->pid, (unsigned long) current); - show_stack(current_thread_info()->task, (long *) regs->regs[0]); - show_trace((long *) regs->regs[0]); - show_code((unsigned int *) regs->cp0_epc); - printk(KERN_NOTICE "\n"); -} - -/* - * The architecture-independent dump_stack generator - */ -void dump_stack(void) -{ - show_stack(current_thread_info()->task, - (long *) get_irq_regs()->regs[0]); -} -EXPORT_SYMBOL(dump_stack); - -void __die(const char *str, struct pt_regs *regs, const char *file, - const char *func, unsigned long line) -{ - console_verbose(); - printk("%s", str); - if (file && func) - printk(" in %s:%s, line %ld", file, func, line); - printk(":\n"); - show_registers(regs); - do_exit(SIGSEGV); -} - -void __die_if_kernel(const char *str, struct pt_regs *regs, - const char *file, const char *func, unsigned long line) -{ - if (!user_mode(regs)) - __die(str, regs, file, func, line); -} - -asmlinkage void do_adelinsn(struct pt_regs *regs) -{ - printk("do_ADE-linsn:ema:0x%08lx:epc:0x%08lx\n", - regs->cp0_ema, regs->cp0_epc); - die_if_kernel("do_ade execution Exception\n", regs); - force_sig(SIGBUS, current); -} - -asmlinkage void do_adedata(struct pt_regs *regs) -{ - const struct exception_table_entry *fixup; - fixup = search_exception_tables(regs->cp0_epc); - if (fixup) { - regs->cp0_epc = fixup->fixup; - return; - } - printk("do_ADE-data:ema:0x%08lx:epc:0x%08lx\n", - regs->cp0_ema, regs->cp0_epc); - die_if_kernel("do_ade execution Exception\n", regs); - force_sig(SIGBUS, current); -} - -asmlinkage void do_pel(struct pt_regs *regs) -{ - die_if_kernel("do_pel execution Exception", regs); - force_sig(SIGFPE, current); -} - -asmlinkage void do_cee(struct pt_regs *regs) -{ - die_if_kernel("do_cee execution Exception", regs); - force_sig(SIGFPE, current); -} - -asmlinkage void do_cpe(struct pt_regs *regs) -{ - die_if_kernel("do_cpe execution Exception", regs); - force_sig(SIGFPE, current); -} - -asmlinkage void do_be(struct pt_regs *regs) -{ - die_if_kernel("do_be execution Exception", regs); - force_sig(SIGBUS, current); -} - -asmlinkage void do_ov(struct pt_regs *regs) -{ - siginfo_t info; - - die_if_kernel("do_ov execution Exception", regs); - - info.si_code = FPE_INTOVF; - info.si_signo = SIGFPE; - info.si_errno = 0; - info.si_addr = (void *)regs->cp0_epc; - force_sig_info(SIGFPE, &info, current); -} - -asmlinkage void do_tr(struct pt_regs *regs) -{ - die_if_kernel("do_tr execution Exception", regs); - force_sig(SIGTRAP, current); -} - -asmlinkage void do_ri(struct pt_regs *regs) -{ - unsigned long epc_insn; - unsigned long epc = regs->cp0_epc; - - read_tsk_long(current, epc, &epc_insn); - if (current->thread.single_step == 1) { - if ((epc == current->thread.addr1) || - (epc == current->thread.addr2)) { - user_disable_single_step(current); - force_sig(SIGTRAP, current); - return; - } else - BUG(); - } else if ((epc_insn == BREAKPOINT32_INSN) || - ((epc_insn & 0x0000FFFF) == 0x7002) || - ((epc_insn & 0xFFFF0000) == 0x70020000)) { - force_sig(SIGTRAP, current); - return; - } else { - die_if_kernel("do_ri execution Exception", regs); - force_sig(SIGILL, current); - } -} - -asmlinkage void do_ccu(struct pt_regs *regs) -{ - die_if_kernel("do_ccu execution Exception", regs); - force_sig(SIGILL, current); -} - -asmlinkage void do_reserved(struct pt_regs *regs) -{ - /* - * Game over - no way to handle this if it ever occurs. Most probably - * caused by a new unknown cpu type or after another deadly - * hard/software error. - */ - die_if_kernel("do_reserved execution Exception", regs); - show_regs(regs); - panic("Caught reserved exception - should not happen."); -} - -/* - * NMI exception handler. - */ -void nmi_exception_handler(struct pt_regs *regs) -{ - die_if_kernel("nmi_exception_handler execution Exception", regs); - die("NMI", regs); -} - -/* Install CPU exception handler */ -void *set_except_vector(int n, void *addr) -{ - unsigned long handler = (unsigned long) addr; - unsigned long old_handler = exception_handlers[n]; - - exception_handlers[n] = handler; - return (void *)old_handler; -} - -void __init trap_init(void) -{ - int i; - - pgd_current = (unsigned long)init_mm.pgd; - /* DEBUG EXCEPTION */ - memcpy((void *)DEBUG_VECTOR_BASE_ADDR, - &debug_exception_vector, DEBUG_VECTOR_SIZE); - /* NMI EXCEPTION */ - memcpy((void *)GENERAL_VECTOR_BASE_ADDR, - &general_exception_vector, GENERAL_VECTOR_SIZE); - - /* - * Initialise exception handlers - */ - for (i = 0; i <= 31; i++) - set_except_vector(i, handle_reserved); - - set_except_vector(1, handle_nmi); - set_except_vector(2, handle_adelinsn); - set_except_vector(3, handle_tlb_refill); - set_except_vector(4, handle_tlb_invaild); - set_except_vector(5, handle_ibe); - set_except_vector(6, handle_pel); - set_except_vector(7, handle_sys); - set_except_vector(8, handle_ccu); - set_except_vector(9, handle_ri); - set_except_vector(10, handle_tr); - set_except_vector(11, handle_adedata); - set_except_vector(12, handle_adedata); - set_except_vector(13, handle_tlb_refill); - set_except_vector(14, handle_tlb_invaild); - set_except_vector(15, handle_mod); - set_except_vector(16, handle_cee); - set_except_vector(17, handle_cpe); - set_except_vector(18, handle_dbe); - flush_icache_range(DEBUG_VECTOR_BASE_ADDR, IRQ_VECTOR_BASE_ADDR); - - atomic_inc(&init_mm.mm_count); - current->active_mm = &init_mm; - cpu_cache_init(); -} diff --git a/ANDROID_3.4.5/arch/score/kernel/vmlinux.lds.S b/ANDROID_3.4.5/arch/score/kernel/vmlinux.lds.S deleted file mode 100644 index eebcbaa4..00000000 --- a/ANDROID_3.4.5/arch/score/kernel/vmlinux.lds.S +++ /dev/null @@ -1,89 +0,0 @@ -/* - * arch/score/kernel/vmlinux.lds.S - * - * Score Processor version. - * - * Copyright (C) 2009 Sunplus Core Technology Co., Ltd. - * Chen Liqin <liqin.chen@sunplusct.com> - * Lennox Wu <lennox.wu@sunplusct.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, 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, see the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <asm-generic/vmlinux.lds.h> -#include <asm/thread_info.h> -#include <asm/page.h> - -OUTPUT_ARCH(score) -ENTRY(_stext) - -jiffies = jiffies_64; - -SECTIONS -{ - . = CONFIG_MEMORY_START + 0x2000; - /* read-only */ - .text : { - _text = .; /* Text and read-only data */ - TEXT_TEXT - SCHED_TEXT - LOCK_TEXT - KPROBES_TEXT - *(.text.*) - *(.fixup) - . = ALIGN (4) ; - _etext = .; /* End of text section */ - } - - . = ALIGN(16); - RODATA - - EXCEPTION_TABLE(16) - - RW_DATA_SECTION(32, PAGE_SIZE, THREAD_SIZE) - - /* We want the small data sections together, so single-instruction offsets - can access them all, and initialized data all before uninitialized, so - we can shorten the on-disk segment size. */ - . = ALIGN(8); - .sdata : { - *(.sdata) - } - _edata = .; /* End of data section */ - - /* will be freed after init */ - . = ALIGN(PAGE_SIZE); /* Init code and data */ - __init_begin = .; - - INIT_TEXT_SECTION(PAGE_SIZE) - INIT_DATA_SECTION(16) - - /* .exit.text is discarded at runtime, not link time, to deal with - * references from .rodata - */ - .exit.text : { - EXIT_TEXT - } - .exit.data : { - EXIT_DATA - } - . = ALIGN(PAGE_SIZE); - __init_end = .; - /* freed after init ends here */ - - BSS_SECTION(0, 0, 0) - _end = .; -} |