summaryrefslogtreecommitdiff
path: root/arch/frv/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'arch/frv/kernel')
-rw-r--r--arch/frv/kernel/.gitignore1
-rw-r--r--arch/frv/kernel/Makefile24
-rw-r--r--arch/frv/kernel/asm-offsets.c96
-rw-r--r--arch/frv/kernel/break.S792
-rw-r--r--arch/frv/kernel/cmode.S189
-rw-r--r--arch/frv/kernel/debug-stub.c258
-rw-r--r--arch/frv/kernel/dma.c463
-rw-r--r--arch/frv/kernel/entry-table.S329
-rw-r--r--arch/frv/kernel/entry.S1519
-rw-r--r--arch/frv/kernel/frv_ksyms.c109
-rw-r--r--arch/frv/kernel/futex.c223
-rw-r--r--arch/frv/kernel/gdb-io.c215
-rw-r--r--arch/frv/kernel/gdb-io.h55
-rw-r--r--arch/frv/kernel/gdb-stub.c2149
-rw-r--r--arch/frv/kernel/head-mmu-fr451.S374
-rw-r--r--arch/frv/kernel/head-uc-fr401.S311
-rw-r--r--arch/frv/kernel/head-uc-fr451.S174
-rw-r--r--arch/frv/kernel/head-uc-fr555.S347
-rw-r--r--arch/frv/kernel/head.S638
-rw-r--r--arch/frv/kernel/head.inc50
-rw-r--r--arch/frv/kernel/irq-mb93091.c157
-rw-r--r--arch/frv/kernel/irq-mb93093.c129
-rw-r--r--arch/frv/kernel/irq-mb93493.c147
-rw-r--r--arch/frv/kernel/irq.c159
-rw-r--r--arch/frv/kernel/local.h59
-rw-r--r--arch/frv/kernel/local64.h1
-rw-r--r--arch/frv/kernel/module.c27
-rw-r--r--arch/frv/kernel/pm-mb93093.c65
-rw-r--r--arch/frv/kernel/pm.c352
-rw-r--r--arch/frv/kernel/process.c275
-rw-r--r--arch/frv/kernel/ptrace.c377
-rw-r--r--arch/frv/kernel/setup.c1178
-rw-r--r--arch/frv/kernel/signal.c426
-rw-r--r--arch/frv/kernel/sleep.S373
-rw-r--r--arch/frv/kernel/switch_to.S489
-rw-r--r--arch/frv/kernel/sys_frv.c44
-rw-r--r--arch/frv/kernel/sysctl.c221
-rw-r--r--arch/frv/kernel/time.c122
-rw-r--r--arch/frv/kernel/traps.c642
-rw-r--r--arch/frv/kernel/uaccess.c100
-rw-r--r--arch/frv/kernel/vmlinux.lds.S136
41 files changed, 0 insertions, 13795 deletions
diff --git a/arch/frv/kernel/.gitignore b/arch/frv/kernel/.gitignore
deleted file mode 100644
index c5f676c3c224..000000000000
--- a/arch/frv/kernel/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-vmlinux.lds
diff --git a/arch/frv/kernel/Makefile b/arch/frv/kernel/Makefile
deleted file mode 100644
index 216ddf30c3c1..000000000000
--- a/arch/frv/kernel/Makefile
+++ /dev/null
@@ -1,24 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0
-#
-# Makefile for the linux kernel.
-#
-
-heads-y := head-uc-fr401.o head-uc-fr451.o head-uc-fr555.o
-heads-$(CONFIG_MMU) := head-mmu-fr451.o
-
-extra-y:= head.o vmlinux.lds
-
-obj-y := $(heads-y) entry.o entry-table.o break.o switch_to.o \
- process.o traps.o ptrace.o signal.o dma.o \
- sys_frv.o time.o setup.o frv_ksyms.o \
- debug-stub.o irq.o sleep.o uaccess.o
-
-obj-$(CONFIG_GDBSTUB) += gdb-stub.o gdb-io.o
-
-obj-$(CONFIG_MB93091_VDK) += irq-mb93091.o
-obj-$(CONFIG_PM) += pm.o cmode.o
-obj-$(CONFIG_MB93093_PDK) += pm-mb93093.o
-obj-$(CONFIG_FUJITSU_MB93493) += irq-mb93493.o
-obj-$(CONFIG_SYSCTL) += sysctl.o
-obj-$(CONFIG_FUTEX) += futex.o
-obj-$(CONFIG_MODULES) += module.o
diff --git a/arch/frv/kernel/asm-offsets.c b/arch/frv/kernel/asm-offsets.c
deleted file mode 100644
index 0a468e9b51ad..000000000000
--- a/arch/frv/kernel/asm-offsets.c
+++ /dev/null
@@ -1,96 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Generate definitions needed by assembly language modules.
- * This code generates raw asm output which is post-processed
- * to extract and format the required data.
- */
-
-#include <linux/sched.h>
-#include <linux/signal.h>
-#include <linux/personality.h>
-#include <linux/kbuild.h>
-#include <asm/registers.h>
-#include <asm/ucontext.h>
-#include <asm/processor.h>
-#include <asm/thread_info.h>
-#include <asm/gdb-stub.h>
-
-#define DEF_PTREG(sym, reg) OFFSET(sym, pt_regs, reg)
-#define DEF_IREG(sym, reg) OFFSET(sym, user_context, reg)
-#define DEF_FREG(sym, reg) OFFSET(sym, user_context, reg)
-#define DEF_0REG(sym, reg) OFFSET(sym, frv_frame0, reg)
-
-void foo(void)
-{
- /* offsets into the thread_info structure */
- OFFSET(TI_TASK, thread_info, task);
- OFFSET(TI_FLAGS, thread_info, flags);
- OFFSET(TI_STATUS, thread_info, status);
- OFFSET(TI_CPU, thread_info, cpu);
- OFFSET(TI_PREEMPT_COUNT, thread_info, preempt_count);
- OFFSET(TI_ADDR_LIMIT, thread_info, addr_limit);
- BLANK();
-
- /* offsets into register file storage */
- DEF_PTREG(REG_PSR, psr);
- DEF_PTREG(REG_ISR, isr);
- DEF_PTREG(REG_CCR, ccr);
- DEF_PTREG(REG_CCCR, cccr);
- DEF_PTREG(REG_LR, lr);
- DEF_PTREG(REG_LCR, lcr);
- DEF_PTREG(REG_PC, pc);
- DEF_PTREG(REG__STATUS, __status);
- DEF_PTREG(REG_SYSCALLNO, syscallno);
- DEF_PTREG(REG_ORIG_GR8, orig_gr8);
- DEF_PTREG(REG_GNER0, gner0);
- DEF_PTREG(REG_GNER1, gner1);
- DEF_PTREG(REG_IACC0, iacc0);
- DEF_PTREG(REG_TBR, tbr);
- DEF_PTREG(REG_GR0, tbr);
- DEFINE(REG__END, sizeof(struct pt_regs));
- BLANK();
-
- DEF_0REG(REG_DCR, debug.dcr);
- DEF_0REG(REG_IBAR0, debug.ibar[0]);
- DEF_0REG(REG_DBAR0, debug.dbar[0]);
- DEF_0REG(REG_DBDR00, debug.dbdr[0][0]);
- DEF_0REG(REG_DBMR00, debug.dbmr[0][0]);
- BLANK();
-
- DEF_IREG(__INT_GR0, i.gr[0]);
- DEF_FREG(__USER_FPMEDIA, f);
- DEF_FREG(__FPMEDIA_FR0, f.fr[0]);
- DEF_FREG(__FPMEDIA_FNER0, f.fner[0]);
- DEF_FREG(__FPMEDIA_MSR0, f.msr[0]);
- DEF_FREG(__FPMEDIA_ACC0, f.acc[0]);
- DEF_FREG(__FPMEDIA_ACCG0, f.accg[0]);
- DEF_FREG(__FPMEDIA_FSR0, f.fsr[0]);
- BLANK();
-
- DEFINE(NR_PT_REGS, sizeof(struct pt_regs) / 4);
- DEFINE(NR_USER_INT_REGS, sizeof(struct user_int_regs) / 4);
- DEFINE(NR_USER_FPMEDIA_REGS, sizeof(struct user_fpmedia_regs) / 4);
- DEFINE(NR_USER_CONTEXT, sizeof(struct user_context) / 4);
- DEFINE(FRV_FRAME0_SIZE, sizeof(struct frv_frame0));
- BLANK();
-
- /* offsets into thread_struct */
- OFFSET(__THREAD_FRAME, thread_struct, frame);
- OFFSET(__THREAD_CURR, thread_struct, curr);
- OFFSET(__THREAD_SP, thread_struct, sp);
- OFFSET(__THREAD_FP, thread_struct, fp);
- OFFSET(__THREAD_LR, thread_struct, lr);
- OFFSET(__THREAD_PC, thread_struct, pc);
- OFFSET(__THREAD_GR16, thread_struct, gr[0]);
- OFFSET(__THREAD_SCHED_LR, thread_struct, sched_lr);
- OFFSET(__THREAD_FRAME0, thread_struct, frame0);
- OFFSET(__THREAD_USER, thread_struct, user);
- BLANK();
-
- /* offsets into frv_debug_status */
- OFFSET(DEBUG_BPSR, frv_debug_status, bpsr);
- OFFSET(DEBUG_DCR, frv_debug_status, dcr);
- OFFSET(DEBUG_BRR, frv_debug_status, brr);
- OFFSET(DEBUG_NMAR, frv_debug_status, nmar);
- BLANK();
-}
diff --git a/arch/frv/kernel/break.S b/arch/frv/kernel/break.S
deleted file mode 100644
index cbb6958a3147..000000000000
--- a/arch/frv/kernel/break.S
+++ /dev/null
@@ -1,792 +0,0 @@
-/* break.S: Break interrupt handling (kept separate from entry.S)
- *
- * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved.
- * Written by David Howells (dhowells@redhat.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.
- */
-
-#include <linux/linkage.h>
-#include <asm/setup.h>
-#include <asm/segment.h>
-#include <asm/ptrace.h>
-#include <asm/thread_info.h>
-#include <asm/spr-regs.h>
-
-#include <asm/errno.h>
-
-#
-# the break handler has its own stack
-#
- .section .bss..stack
- .globl __break_user_context
- .balign THREAD_SIZE
-__break_stack:
- .space THREAD_SIZE - FRV_FRAME0_SIZE
-__break_frame_0:
- .space FRV_FRAME0_SIZE
-
-#
-# miscellaneous variables
-#
- .section .bss
-#ifdef CONFIG_MMU
- .globl __break_tlb_miss_real_return_info
-__break_tlb_miss_real_return_info:
- .balign 8
- .space 2*4 /* saved PCSR, PSR for TLB-miss handler fixup */
-#endif
-
-__break_trace_through_exceptions:
- .space 4
-
-#define CS2_ECS1 0xe1200000
-#define CS2_USERLED 0x4
-
-.macro LEDS val,reg
-# sethi.p %hi(CS2_ECS1+CS2_USERLED),gr30
-# setlo %lo(CS2_ECS1+CS2_USERLED),gr30
-# setlos #~\val,\reg
-# st \reg,@(gr30,gr0)
-# setlos #0x5555,\reg
-# sethi.p %hi(0xffc00100),gr30
-# setlo %lo(0xffc00100),gr30
-# sth \reg,@(gr30,gr0)
-# membar
-.endm
-
-###############################################################################
-#
-# entry point for Break Exceptions/Interrupts
-#
-###############################################################################
- .section .text..break
- .balign 4
- .globl __entry_break
-__entry_break:
-#ifdef CONFIG_MMU
- movgs gr31,scr3
-#endif
- LEDS 0x1001,gr31
-
- sethi.p %hi(__break_frame_0),gr31
- setlo %lo(__break_frame_0),gr31
-
- stdi gr2,@(gr31,#REG_GR(2))
- movsg ccr,gr3
- sti gr3,@(gr31,#REG_CCR)
-
- # catch the return from a TLB-miss handler that had single-step disabled
- # traps will be enabled, so we have to do this now
-#ifdef CONFIG_MMU
- movsg bpcsr,gr3
- sethi.p %hi(__break_tlb_miss_return_breaks_here),gr2
- setlo %lo(__break_tlb_miss_return_breaks_here),gr2
- subcc gr2,gr3,gr0,icc0
- beq icc0,#2,__break_return_singlestep_tlbmiss
-#endif
-
- # determine whether we have stepped through into an exception
- # - we need to take special action to suspend h/w single stepping if we've done
- # that, so that the gdbstub doesn't get bogged down endlessly stepping through
- # external interrupt handling
- movsg bpsr,gr3
- andicc gr3,#BPSR_BET,gr0,icc0
- bne icc0,#2,__break_maybe_userspace /* jump if PSR.ET was 1 */
-
- LEDS 0x1003,gr2
-
- movsg brr,gr3
- andicc gr3,#BRR_ST,gr0,icc0
- andicc.p gr3,#BRR_SB,gr0,icc1
- bne icc0,#2,__break_step /* jump if single-step caused break */
- beq icc1,#2,__break_continue /* jump if BREAK didn't cause break */
-
- LEDS 0x1007,gr2
-
- # handle special breaks
- movsg bpcsr,gr3
-
- sethi.p %hi(__entry_return_singlestep_breaks_here),gr2
- setlo %lo(__entry_return_singlestep_breaks_here),gr2
- subcc gr2,gr3,gr0,icc0
- beq icc0,#2,__break_return_singlestep
-
- bra __break_continue
-
-
-###############################################################################
-#
-# handle BREAK instruction in kernel-mode exception epilogue
-#
-###############################################################################
-__break_return_singlestep:
- LEDS 0x100f,gr2
-
- # special break insn requests single-stepping to be turned back on
- # HERE RETT
- # PSR.ET 0 0
- # PSR.PS old PSR.S ?
- # PSR.S 1 1
- # BPSR.ET 0 1 (can't have caused orig excep otherwise)
- # BPSR.BS 1 old PSR.S
- movsg dcr,gr2
- sethi.p %hi(DCR_SE),gr3
- setlo %lo(DCR_SE),gr3
- or gr2,gr3,gr2
- movgs gr2,dcr
-
- movsg psr,gr2
- andi gr2,#PSR_PS,gr2
- slli gr2,#11,gr2 /* PSR.PS -> BPSR.BS */
- ori gr2,#BPSR_BET,gr2 /* 1 -> BPSR.BET */
- movgs gr2,bpsr
-
- # return to the invoker of the original kernel exception
- movsg pcsr,gr2
- movgs gr2,bpcsr
-
- LEDS 0x101f,gr2
-
- ldi @(gr31,#REG_CCR),gr3
- movgs gr3,ccr
- lddi.p @(gr31,#REG_GR(2)),gr2
- xor gr31,gr31,gr31
- movgs gr0,brr
-#ifdef CONFIG_MMU
- movsg scr3,gr31
-#endif
- rett #1
-
-###############################################################################
-#
-# handle BREAK instruction in TLB-miss handler return path
-#
-###############################################################################
-#ifdef CONFIG_MMU
-__break_return_singlestep_tlbmiss:
- LEDS 0x1100,gr2
-
- sethi.p %hi(__break_tlb_miss_real_return_info),gr3
- setlo %lo(__break_tlb_miss_real_return_info),gr3
- lddi @(gr3,#0),gr2
- movgs gr2,pcsr
- movgs gr3,psr
-
- bra __break_return_singlestep
-#endif
-
-
-###############################################################################
-#
-# handle single stepping into an exception prologue from kernel mode
-# - we try and catch it whilst it is still in the main vector table
-# - if we catch it there, we have to jump to the fixup handler
-# - there is a fixup table that has a pointer for every 16b slot in the trap
-# table
-#
-###############################################################################
-__break_step:
- LEDS 0x2003,gr2
-
- # external interrupts seem to escape from the trap table before single
- # step catches up with them
- movsg bpcsr,gr2
- sethi.p %hi(__entry_kernel_external_interrupt),gr3
- setlo %lo(__entry_kernel_external_interrupt),gr3
- subcc.p gr2,gr3,gr0,icc0
- sethi %hi(__entry_uspace_external_interrupt),gr3
- setlo.p %lo(__entry_uspace_external_interrupt),gr3
- beq icc0,#2,__break_step_kernel_external_interrupt
- subcc.p gr2,gr3,gr0,icc0
- sethi %hi(__entry_kernel_external_interrupt_virtually_disabled),gr3
- setlo.p %lo(__entry_kernel_external_interrupt_virtually_disabled),gr3
- beq icc0,#2,__break_step_uspace_external_interrupt
- subcc.p gr2,gr3,gr0,icc0
- sethi %hi(__entry_kernel_external_interrupt_virtual_reenable),gr3
- setlo.p %lo(__entry_kernel_external_interrupt_virtual_reenable),gr3
- beq icc0,#2,__break_step_kernel_external_interrupt_virtually_disabled
- subcc gr2,gr3,gr0,icc0
- beq icc0,#2,__break_step_kernel_external_interrupt_virtual_reenable
-
- LEDS 0x2007,gr2
-
- # the two main vector tables are adjacent on one 8Kb slab
- movsg bpcsr,gr2
- setlos #0xffffe000,gr3
- and gr2,gr3,gr2
- sethi.p %hi(__trap_tables),gr3
- setlo %lo(__trap_tables),gr3
- subcc gr2,gr3,gr0,icc0
- bne icc0,#2,__break_continue
-
- LEDS 0x200f,gr2
-
- # skip workaround if so requested by GDB
- sethi.p %hi(__break_trace_through_exceptions),gr3
- setlo %lo(__break_trace_through_exceptions),gr3
- ld @(gr3,gr0),gr3
- subcc gr3,gr0,gr0,icc0
- bne icc0,#0,__break_continue
-
- LEDS 0x201f,gr2
-
- # access the fixup table - there's a 1:1 mapping between the slots in the trap tables and
- # the slots in the trap fixup tables allowing us to simply divide the offset into the
- # former by 4 to access the latter
- sethi.p %hi(__trap_tables),gr3
- setlo %lo(__trap_tables),gr3
- movsg bpcsr,gr2
- sub gr2,gr3,gr2
- srli.p gr2,#2,gr2
-
- sethi %hi(__trap_fixup_tables),gr3
- setlo.p %lo(__trap_fixup_tables),gr3
- andi gr2,#~3,gr2
- ld @(gr2,gr3),gr2
- jmpil @(gr2,#0)
-
-# step through an internal exception from kernel mode
- .globl __break_step_kernel_softprog_interrupt
-__break_step_kernel_softprog_interrupt:
- sethi.p %hi(__entry_kernel_softprog_interrupt_reentry),gr3
- setlo %lo(__entry_kernel_softprog_interrupt_reentry),gr3
- bra __break_return_as_kernel_prologue
-
-# step through an external interrupt from kernel mode
- .globl __break_step_kernel_external_interrupt
-__break_step_kernel_external_interrupt:
- # deal with virtual interrupt disablement
- beq icc2,#0,__break_step_kernel_external_interrupt_virtually_disabled
-
- sethi.p %hi(__entry_kernel_external_interrupt_reentry),gr3
- setlo %lo(__entry_kernel_external_interrupt_reentry),gr3
-
-__break_return_as_kernel_prologue:
- LEDS 0x203f,gr2
-
- movgs gr3,bpcsr
-
- # do the bit we had to skip
-#ifdef CONFIG_MMU
- movsg ear0,gr2 /* EAR0 can get clobbered by gdb-stub (ICI/ICEI) */
- movgs gr2,scr2
-#endif
-
- or.p sp,gr0,gr2 /* set up the stack pointer */
- subi sp,#REG__END,sp
- sti.p gr2,@(sp,#REG_SP)
-
- setlos #REG__STATUS_STEP,gr2
- sti gr2,@(sp,#REG__STATUS) /* record single step status */
-
- # cancel single-stepping mode
- movsg dcr,gr2
- sethi.p %hi(~DCR_SE),gr3
- setlo %lo(~DCR_SE),gr3
- and gr2,gr3,gr2
- movgs gr2,dcr
-
- LEDS 0x207f,gr2
-
- ldi @(gr31,#REG_CCR),gr3
- movgs gr3,ccr
- lddi.p @(gr31,#REG_GR(2)),gr2
- xor gr31,gr31,gr31
- movgs gr0,brr
-#ifdef CONFIG_MMU
- movsg scr3,gr31
-#endif
- rett #1
-
-# we single-stepped into an interrupt handler whilst interrupts were merely virtually disabled
-# need to really disable interrupts, set flag, fix up and return
-__break_step_kernel_external_interrupt_virtually_disabled:
- movsg psr,gr2
- andi gr2,#~PSR_PIL,gr2
- ori gr2,#PSR_PIL_14,gr2 /* debugging interrupts only */
- movgs gr2,psr
-
- ldi @(gr31,#REG_CCR),gr3
- movgs gr3,ccr
- subcc.p gr0,gr0,gr0,icc2 /* leave Z set, clear C */
-
- # exceptions must've been enabled and we must've been in supervisor mode
- setlos BPSR_BET|BPSR_BS,gr3
- movgs gr3,bpsr
-
- # return to where the interrupt happened
- movsg pcsr,gr2
- movgs gr2,bpcsr
-
- lddi.p @(gr31,#REG_GR(2)),gr2
-
- xor gr31,gr31,gr31
- movgs gr0,brr
-#ifdef CONFIG_MMU
- movsg scr3,gr31
-#endif
- rett #1
-
-# we stepped through into the virtual interrupt reenablement trap
-#
-# we also want to single step anyway, but after fixing up so that we get an event on the
-# instruction after the broken-into exception returns
- .globl __break_step_kernel_external_interrupt_virtual_reenable
-__break_step_kernel_external_interrupt_virtual_reenable:
- movsg psr,gr2
- andi gr2,#~PSR_PIL,gr2
- movgs gr2,psr
-
- ldi @(gr31,#REG_CCR),gr3
- movgs gr3,ccr
- subicc gr0,#1,gr0,icc2 /* clear Z, set C */
-
- # save the adjusted ICC2
- movsg ccr,gr3
- sti gr3,@(gr31,#REG_CCR)
-
- # exceptions must've been enabled and we must've been in supervisor mode
- setlos BPSR_BET|BPSR_BS,gr3
- movgs gr3,bpsr
-
- # return to where the trap happened
- movsg pcsr,gr2
- movgs gr2,bpcsr
-
- # and then process the single step
- bra __break_continue
-
-# step through an internal exception from uspace mode
- .globl __break_step_uspace_softprog_interrupt
-__break_step_uspace_softprog_interrupt:
- sethi.p %hi(__entry_uspace_softprog_interrupt_reentry),gr3
- setlo %lo(__entry_uspace_softprog_interrupt_reentry),gr3
- bra __break_return_as_uspace_prologue
-
-# step through an external interrupt from kernel mode
- .globl __break_step_uspace_external_interrupt
-__break_step_uspace_external_interrupt:
- sethi.p %hi(__entry_uspace_external_interrupt_reentry),gr3
- setlo %lo(__entry_uspace_external_interrupt_reentry),gr3
-
-__break_return_as_uspace_prologue:
- LEDS 0x20ff,gr2
-
- movgs gr3,bpcsr
-
- # do the bit we had to skip
- sethi.p %hi(__kernel_frame0_ptr),gr28
- setlo %lo(__kernel_frame0_ptr),gr28
- ldi.p @(gr28,#0),gr28
-
- setlos #REG__STATUS_STEP,gr2
- sti gr2,@(gr28,#REG__STATUS) /* record single step status */
-
- # cancel single-stepping mode
- movsg dcr,gr2
- sethi.p %hi(~DCR_SE),gr3
- setlo %lo(~DCR_SE),gr3
- and gr2,gr3,gr2
- movgs gr2,dcr
-
- LEDS 0x20fe,gr2
-
- ldi @(gr31,#REG_CCR),gr3
- movgs gr3,ccr
- lddi.p @(gr31,#REG_GR(2)),gr2
- xor gr31,gr31,gr31
- movgs gr0,brr
-#ifdef CONFIG_MMU
- movsg scr3,gr31
-#endif
- rett #1
-
-#ifdef CONFIG_MMU
-# step through an ITLB-miss handler from user mode
- .globl __break_user_insn_tlb_miss
-__break_user_insn_tlb_miss:
- # we'll want to try the trap stub again
- sethi.p %hi(__trap_user_insn_tlb_miss),gr2
- setlo %lo(__trap_user_insn_tlb_miss),gr2
- movgs gr2,bpcsr
-
-__break_tlb_miss_common:
- LEDS 0x2101,gr2
-
- # cancel single-stepping mode
- movsg dcr,gr2
- sethi.p %hi(~DCR_SE),gr3
- setlo %lo(~DCR_SE),gr3
- and gr2,gr3,gr2
- movgs gr2,dcr
-
- # we'll swap the real return address for one with a BREAK insn so that we can re-enable
- # single stepping on return
- movsg pcsr,gr2
- sethi.p %hi(__break_tlb_miss_real_return_info),gr3
- setlo %lo(__break_tlb_miss_real_return_info),gr3
- sti gr2,@(gr3,#0)
-
- sethi.p %hi(__break_tlb_miss_return_break),gr2
- setlo %lo(__break_tlb_miss_return_break),gr2
- movgs gr2,pcsr
-
- # we also have to fudge PSR because the return BREAK is in kernel space and we want
- # to get a BREAK fault not an access violation should the return be to userspace
- movsg psr,gr2
- sti.p gr2,@(gr3,#4)
- ori gr2,#PSR_PS,gr2
- movgs gr2,psr
-
- LEDS 0x2102,gr2
-
- ldi @(gr31,#REG_CCR),gr3
- movgs gr3,ccr
- lddi @(gr31,#REG_GR(2)),gr2
- movsg scr3,gr31
- movgs gr0,brr
- rett #1
-
-# step through a DTLB-miss handler from user mode
- .globl __break_user_data_tlb_miss
-__break_user_data_tlb_miss:
- # we'll want to try the trap stub again
- sethi.p %hi(__trap_user_data_tlb_miss),gr2
- setlo %lo(__trap_user_data_tlb_miss),gr2
- movgs gr2,bpcsr
- bra __break_tlb_miss_common
-
-# step through an ITLB-miss handler from kernel mode
- .globl __break_kernel_insn_tlb_miss
-__break_kernel_insn_tlb_miss:
- # we'll want to try the trap stub again
- sethi.p %hi(__trap_kernel_insn_tlb_miss),gr2
- setlo %lo(__trap_kernel_insn_tlb_miss),gr2
- movgs gr2,bpcsr
- bra __break_tlb_miss_common
-
-# step through a DTLB-miss handler from kernel mode
- .globl __break_kernel_data_tlb_miss
-__break_kernel_data_tlb_miss:
- # we'll want to try the trap stub again
- sethi.p %hi(__trap_kernel_data_tlb_miss),gr2
- setlo %lo(__trap_kernel_data_tlb_miss),gr2
- movgs gr2,bpcsr
- bra __break_tlb_miss_common
-#endif
-
-###############################################################################
-#
-# handle debug events originating with userspace
-#
-###############################################################################
-__break_maybe_userspace:
- LEDS 0x3003,gr2
-
- setlos #BPSR_BS,gr2
- andcc gr3,gr2,gr0,icc0
- bne icc0,#0,__break_continue /* skip if PSR.S was 1 */
-
- movsg brr,gr2
- andicc gr2,#BRR_ST|BRR_SB,gr0,icc0
- beq icc0,#0,__break_continue /* jump if not BREAK or single-step */
-
- LEDS 0x3007,gr2
-
- # do the first part of the exception prologue here
- sethi.p %hi(__kernel_frame0_ptr),gr28
- setlo %lo(__kernel_frame0_ptr),gr28
- ldi @(gr28,#0),gr28
- andi gr28,#~7,gr28
-
- # set up the kernel stack pointer
- sti sp ,@(gr28,#REG_SP)
- ori gr28,0,sp
- sti gr0 ,@(gr28,#REG_GR(28))
-
- stdi gr20,@(gr28,#REG_GR(20))
- stdi gr22,@(gr28,#REG_GR(22))
-
- movsg tbr,gr20
- movsg bpcsr,gr21
- movsg psr,gr22
-
- # determine the exception type and cancel single-stepping mode
- or gr0,gr0,gr23
-
- movsg dcr,gr2
- sethi.p %hi(DCR_SE),gr3
- setlo %lo(DCR_SE),gr3
- andcc gr2,gr3,gr0,icc0
- beq icc0,#0,__break_no_user_sstep /* must have been a BREAK insn */
-
- not gr3,gr3
- and gr2,gr3,gr2
- movgs gr2,dcr
- ori gr23,#REG__STATUS_STEP,gr23
-
-__break_no_user_sstep:
- LEDS 0x300f,gr2
-
- movsg brr,gr2
- andi gr2,#BRR_ST|BRR_SB,gr2
- slli gr2,#1,gr2
- or gr23,gr2,gr23
- sti.p gr23,@(gr28,#REG__STATUS) /* record single step status */
-
- # adjust the value acquired from TBR - this indicates the exception
- setlos #~TBR_TT,gr2
- and.p gr20,gr2,gr20
- setlos #TBR_TT_BREAK,gr2
- or.p gr20,gr2,gr20
-
- # fudge PSR.PS and BPSR.BS to return to kernel mode through the trap
- # table as trap 126
- andi gr22,#~PSR_PS,gr22 /* PSR.PS should be 0 */
- movgs gr22,psr
-
- setlos #BPSR_BS,gr2 /* BPSR.BS should be 1 and BPSR.BET 0 */
- movgs gr2,bpsr
-
- # return through remainder of the exception prologue
- # - need to load gr23 with return handler address
- sethi.p %hi(__entry_return_from_user_exception),gr23
- setlo %lo(__entry_return_from_user_exception),gr23
- sethi.p %hi(__entry_common),gr3
- setlo %lo(__entry_common),gr3
- movgs gr3,bpcsr
-
- LEDS 0x301f,gr2
-
- ldi @(gr31,#REG_CCR),gr3
- movgs gr3,ccr
- lddi.p @(gr31,#REG_GR(2)),gr2
- xor gr31,gr31,gr31
- movgs gr0,brr
-#ifdef CONFIG_MMU
- movsg scr3,gr31
-#endif
- rett #1
-
-###############################################################################
-#
-# resume normal debug-mode entry
-#
-###############################################################################
-__break_continue:
- LEDS 0x4003,gr2
-
- # set up the kernel stack pointer
- sti sp,@(gr31,#REG_SP)
-
- sethi.p %hi(__break_frame_0),sp
- setlo %lo(__break_frame_0),sp
-
- # finish building the exception frame
- stdi gr4 ,@(gr31,#REG_GR(4))
- stdi gr6 ,@(gr31,#REG_GR(6))
- stdi gr8 ,@(gr31,#REG_GR(8))
- stdi gr10,@(gr31,#REG_GR(10))
- stdi gr12,@(gr31,#REG_GR(12))
- stdi gr14,@(gr31,#REG_GR(14))
- stdi gr16,@(gr31,#REG_GR(16))
- stdi gr18,@(gr31,#REG_GR(18))
- stdi gr20,@(gr31,#REG_GR(20))
- stdi gr22,@(gr31,#REG_GR(22))
- stdi gr24,@(gr31,#REG_GR(24))
- stdi gr26,@(gr31,#REG_GR(26))
- sti gr0 ,@(gr31,#REG_GR(28)) /* NULL frame pointer */
- sti gr29,@(gr31,#REG_GR(29))
- sti gr30,@(gr31,#REG_GR(30))
- sti gr8 ,@(gr31,#REG_ORIG_GR8)
-
-#ifdef CONFIG_MMU
- movsg scr3,gr19
- sti gr19,@(gr31,#REG_GR(31))
-#endif
-
- movsg bpsr ,gr19
- movsg tbr ,gr20
- movsg bpcsr,gr21
- movsg psr ,gr22
- movsg isr ,gr23
- movsg cccr ,gr25
- movsg lr ,gr26
- movsg lcr ,gr27
-
- andi.p gr22,#~(PSR_S|PSR_ET),gr5 /* rebuild PSR */
- andi gr19,#PSR_ET,gr4
- or.p gr4,gr5,gr5
- srli gr19,#10,gr4
- andi gr4,#PSR_S,gr4
- or.p gr4,gr5,gr5
-
- setlos #-1,gr6
- sti gr20,@(gr31,#REG_TBR)
- sti gr21,@(gr31,#REG_PC)
- sti gr5 ,@(gr31,#REG_PSR)
- sti gr23,@(gr31,#REG_ISR)
- sti gr25,@(gr31,#REG_CCCR)
- stdi gr26,@(gr31,#REG_LR)
- sti gr6 ,@(gr31,#REG_SYSCALLNO)
-
- # store CPU-specific regs
- movsg iacc0h,gr4
- movsg iacc0l,gr5
- stdi gr4,@(gr31,#REG_IACC0)
-
- movsg gner0,gr4
- movsg gner1,gr5
- stdi gr4,@(gr31,#REG_GNER0)
-
- # build the debug register frame
- movsg brr,gr4
- movgs gr0,brr
- movsg nmar,gr5
- movsg dcr,gr6
-
- sethi.p %hi(__debug_status),gr7
- setlo %lo(__debug_status),gr7
-
- stdi gr4 ,@(gr7,#DEBUG_BRR)
- sti gr19,@(gr7,#DEBUG_BPSR)
- sti.p gr6 ,@(gr7,#DEBUG_DCR)
-
- # trap exceptions during break handling and disable h/w breakpoints/watchpoints
- sethi %hi(DCR_EBE),gr5
- setlo.p %lo(DCR_EBE),gr5
- sethi %hi(__entry_breaktrap_table),gr4
- setlo %lo(__entry_breaktrap_table),gr4
- movgs gr5,dcr
- movgs gr4,tbr
-
- # set up kernel global registers
- sethi.p %hi(__kernel_current_task),gr5
- setlo %lo(__kernel_current_task),gr5
- ld @(gr5,gr0),gr29
- ldi.p @(gr29,#4),gr15 ; __current_thread_info = current->thread_info
-
- sethi %hi(_gp),gr16
- setlo.p %lo(_gp),gr16
-
- # make sure we (the kernel) get div-zero and misalignment exceptions
- setlos #ISR_EDE|ISR_DTT_DIVBYZERO|ISR_EMAM_EXCEPTION,gr5
- movgs gr5,isr
-
- # enter the GDB stub
- LEDS 0x4007,gr2
-
- or.p gr0,gr0,fp
- call debug_stub
-
- LEDS 0x403f,gr2
-
- # return from break
- lddi @(gr31,#REG_IACC0),gr4
- movgs gr4,iacc0h
- movgs gr5,iacc0l
-
- lddi @(gr31,#REG_GNER0),gr4
- movgs gr4,gner0
- movgs gr5,gner1
-
- lddi @(gr31,#REG_LR) ,gr26
- lddi @(gr31,#REG_CCR) ,gr24
- lddi @(gr31,#REG_PSR) ,gr22
- ldi @(gr31,#REG_PC) ,gr21
- ldi @(gr31,#REG_TBR) ,gr20
-
- sethi.p %hi(__debug_status),gr6
- setlo %lo(__debug_status),gr6
- ldi.p @(gr6,#DEBUG_DCR) ,gr6
-
- andi gr22,#PSR_S,gr19 /* rebuild BPSR */
- andi.p gr22,#PSR_ET,gr5
- slli gr19,#10,gr19
- or gr5,gr19,gr19
-
- movgs gr6 ,dcr
- movgs gr19,bpsr
- movgs gr20,tbr
- movgs gr21,bpcsr
- movgs gr23,isr
- movgs gr24,ccr
- movgs gr25,cccr
- movgs gr26,lr
- movgs gr27,lcr
-
- LEDS 0x407f,gr2
-
-#ifdef CONFIG_MMU
- ldi @(gr31,#REG_GR(31)),gr2
- movgs gr2,scr3
-#endif
-
- ldi @(gr31,#REG_GR(30)),gr30
- ldi @(gr31,#REG_GR(29)),gr29
- lddi @(gr31,#REG_GR(26)),gr26
- lddi @(gr31,#REG_GR(24)),gr24
- lddi @(gr31,#REG_GR(22)),gr22
- lddi @(gr31,#REG_GR(20)),gr20
- lddi @(gr31,#REG_GR(18)),gr18
- lddi @(gr31,#REG_GR(16)),gr16
- lddi @(gr31,#REG_GR(14)),gr14
- lddi @(gr31,#REG_GR(12)),gr12
- lddi @(gr31,#REG_GR(10)),gr10
- lddi @(gr31,#REG_GR(8)) ,gr8
- lddi @(gr31,#REG_GR(6)) ,gr6
- lddi @(gr31,#REG_GR(4)) ,gr4
- lddi @(gr31,#REG_GR(2)) ,gr2
- ldi.p @(gr31,#REG_SP) ,sp
-
- xor gr31,gr31,gr31
- movgs gr0,brr
-#ifdef CONFIG_MMU
- movsg scr3,gr31
-#endif
- rett #1
-
-###################################################################################################
-#
-# GDB stub "system calls"
-#
-###################################################################################################
-
-#ifdef CONFIG_GDBSTUB
- # void gdbstub_console_write(struct console *con, const char *p, unsigned n)
- .globl gdbstub_console_write
-gdbstub_console_write:
- break
- bralr
-#endif
-
- # GDB stub BUG() trap
- # GR8 is the proposed signal number
- .globl __debug_bug_trap
-__debug_bug_trap:
- break
- bralr
-
- # transfer kernel exeception to GDB for handling
- .globl __break_hijack_kernel_event
-__break_hijack_kernel_event:
- break
- .globl __break_hijack_kernel_event_breaks_here
-__break_hijack_kernel_event_breaks_here:
- nop
-
-#ifdef CONFIG_MMU
- # handle a return from TLB-miss that requires single-step reactivation
- .globl __break_tlb_miss_return_break
-__break_tlb_miss_return_break:
- break
-__break_tlb_miss_return_breaks_here:
- nop
-#endif
-
- # guard the first .text label in the next file from confusion
- nop
diff --git a/arch/frv/kernel/cmode.S b/arch/frv/kernel/cmode.S
deleted file mode 100644
index 53deeb5d7e87..000000000000
--- a/arch/frv/kernel/cmode.S
+++ /dev/null
@@ -1,189 +0,0 @@
-/* cmode.S: clock mode management
- *
- * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
- * Written by David Woodhouse (dwmw2@infradead.org)
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
- *
- */
-
-#include <linux/sys.h>
-#include <linux/linkage.h>
-#include <asm/setup.h>
-#include <asm/segment.h>
-#include <asm/ptrace.h>
-#include <asm/errno.h>
-#include <asm/cache.h>
-#include <asm/spr-regs.h>
-
-#define __addr_MASK 0xfeff9820 /* interrupt controller mask */
-
-#define __addr_SDRAMC 0xfe000400 /* SDRAM controller regs */
-#define SDRAMC_DSTS 0x28 /* SDRAM status */
-#define SDRAMC_DSTS_SSI 0x00000001 /* indicates that the SDRAM is in self-refresh mode */
-#define SDRAMC_DRCN 0x30 /* SDRAM refresh control */
-#define SDRAMC_DRCN_SR 0x00000001 /* transition SDRAM into self-refresh mode */
-#define __addr_CLKC 0xfeff9a00
-#define CLKC_SWCMODE 0x00000008
-#define __addr_LEDS 0xe1200004
-
-.macro li v r
- sethi.p %hi(\v),\r
- setlo %lo(\v),\r
-.endm
-
- .text
- .balign 4
-
-
-###############################################################################
-#
-# Change CMODE
-# - void frv_change_cmode(int cmode)
-#
-###############################################################################
- .globl frv_change_cmode
- .type frv_change_cmode,@function
-
-.macro LEDS v
-#ifdef DEBUG_CMODE
- setlos #~\v,gr10
- sti gr10,@(gr11,#0)
- membar
-#endif
-.endm
-
-frv_change_cmode:
- movsg lr,gr9
-#ifdef DEBUG_CMODE
- li __addr_LEDS,gr11
-#endif
- dcef @(gr0,gr0),#1
-
- # Shift argument left by 24 bits to fit in SWCMODE register later.
- slli gr8,#24,gr8
-
- # (1) Set '0' in the PSR.ET bit, and prohibit interrupts.
- movsg psr,gr14
- andi gr14,#~PSR_ET,gr3
- movgs gr3,psr
-
-#if 0 // Fujitsu recommend to skip this and will update docs.
- # (2) Set '0' to all bits of the MASK register of the interrupt
- # controller, and mask interrupts.
- li __addr_MASK,gr12
- ldi @(gr12,#0),gr13
- li 0xffff0000,gr4
- sti gr4,@(gr12,#0)
-#endif
-
- # (3) Stop the transfer function of DMAC. Stop all the bus masters
- # to access SDRAM and the internal resources.
-
- # (already done by caller)
-
- # (4) Preload a series of following instructions to the instruction
- # cache.
- li #__cmode_icache_lock_start,gr3
- li #__cmode_icache_lock_end,gr4
-
-1: icpl gr3,gr0,#1
- addi gr3,#L1_CACHE_BYTES,gr3
- cmp gr4,gr3,icc0
- bhi icc0,#0,1b
-
- # Set up addresses in regs for later steps.
- setlos SDRAMC_DRCN_SR,gr3
- li __addr_SDRAMC,gr4
- li __addr_CLKC,gr5
- ldi @(gr5,#0),gr6
- li #0x80000000,gr7
- or gr6,gr7,gr6
-
- bra __cmode_icache_lock_start
-
- .balign L1_CACHE_BYTES
-__cmode_icache_lock_start:
-
- # (5) Flush the content of all caches by the DCEF instruction.
- dcef @(gr0,gr0),#1
-
- # (6) Execute loading the dummy for SDRAM.
- ldi @(gr9,#0),gr0
-
- # (7) Set '1' to the DRCN.SR bit, and change SDRAM to the
- # self-refresh mode. Execute the dummy load to all memory
- # devices set to cacheable on the external bus side in parallel
- # with this.
- sti gr3,@(gr4,#SDRAMC_DRCN)
-
- # (8) Execute memory barrier instruction (MEMBAR).
- membar
-
- # (9) Read the DSTS register repeatedly until '1' stands in the
- # DSTS.SSI field.
-1: ldi @(gr4,#SDRAMC_DSTS),gr3
- andicc gr3,#SDRAMC_DSTS_SSI,gr3,icc0
- beq icc0,#0,1b
-
- # (10) Execute memory barrier instruction (MEMBAR).
- membar
-
-#if 1
- # (11) Set the value of CMODE that you want to change to
- # SWCMODE.SWCM[3:0].
- sti gr8,@(gr5,#CLKC_SWCMODE)
-
- # (12) Set '1' to the CLKC.SWEN bit. In that case, do not change
- # fields other than SWEN of the CLKC register.
- sti gr6,@(gr5,#0)
-#endif
- # (13) Execute the instruction just after the memory barrier
- # instruction that executes the self-loop 256 times. (Meanwhile,
- # the CMODE switch is done.)
- membar
- setlos #256,gr7
-2: subicc gr7,#1,gr7,icc0
- bne icc0,#2,2b
-
- LEDS 0x36
-
- # (14) Release the self-refresh of SDRAM.
- sti gr0,@(gr4,#SDRAMC_DRCN)
-
- # Wait for it...
-3: ldi @(gr4,#SDRAMC_DSTS),gr3
- andicc gr3,#SDRAMC_DSTS_SSI,gr3,icc0
- bne icc0,#2,3b
-
-#if 0
- li 0x0100000,gr10
-4: subicc gr10,#1,gr10,icc0
-
- bne icc0,#0,4b
-#endif
-
-__cmode_icache_lock_end:
-
- li #__cmode_icache_lock_start,gr3
- li #__cmode_icache_lock_end,gr4
-
-4: icul gr3
- addi gr3,#L1_CACHE_BYTES,gr3
- cmp gr4,gr3,icc0
- bhi icc0,#0,4b
-
-#if 0 // Fujitsu recommend to skip this and will update docs.
- # (15) Release the interrupt mask setting of the MASK register of
- # the interrupt controller if necessary.
- sti gr13,@(gr12,#0)
-#endif
- # (16) Set 1' in the PSR.ET bit, and permit interrupt.
- movgs gr14,psr
-
- bralr
-
- .size frv_change_cmode, .-frv_change_cmode
diff --git a/arch/frv/kernel/debug-stub.c b/arch/frv/kernel/debug-stub.c
deleted file mode 100644
index a0228f717ef2..000000000000
--- a/arch/frv/kernel/debug-stub.c
+++ /dev/null
@@ -1,258 +0,0 @@
-/* debug-stub.c: debug-mode stub
- *
- * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
- * Written by David Howells (dhowells@redhat.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.
- */
-
-#include <linux/string.h>
-#include <linux/kernel.h>
-#include <linux/signal.h>
-#include <linux/sched.h>
-#include <linux/init.h>
-#include <linux/serial_reg.h>
-#include <linux/start_kernel.h>
-
-#include <asm/serial-regs.h>
-#include <asm/timer-regs.h>
-#include <asm/irc-regs.h>
-#include <asm/gdb-stub.h>
-#include "gdb-io.h"
-
-/* CPU board CON5 */
-#define __UART0(X) (*(volatile uint8_t *)(UART0_BASE + (UART_##X)))
-
-#define LSR_WAIT_FOR0(STATE) \
-do { \
-} while (!(__UART0(LSR) & UART_LSR_##STATE))
-
-#define FLOWCTL_QUERY0(LINE) ({ __UART0(MSR) & UART_MSR_##LINE; })
-#define FLOWCTL_CLEAR0(LINE) do { __UART0(MCR) &= ~UART_MCR_##LINE; } while (0)
-#define FLOWCTL_SET0(LINE) do { __UART0(MCR) |= UART_MCR_##LINE; } while (0)
-
-#define FLOWCTL_WAIT_FOR0(LINE) \
-do { \
- gdbstub_do_rx(); \
-} while(!FLOWCTL_QUERY(LINE))
-
-struct frv_debug_status __debug_status;
-
-static void __init debug_stub_init(void);
-
-/*****************************************************************************/
-/*
- * debug mode handler stub
- * - we come here with the CPU in debug mode and with exceptions disabled
- * - handle debugging services for userspace
- */
-asmlinkage void debug_stub(void)
-{
- unsigned long hsr0;
- int type = 0;
-
- static u8 inited = 0;
- if (!inited) {
- debug_stub_init();
- type = -1;
- inited = 1;
- }
-
- hsr0 = __get_HSR(0);
- if (hsr0 & HSR0_ETMD)
- __set_HSR(0, hsr0 & ~HSR0_ETMD);
-
- /* disable single stepping */
- __debug_status.dcr &= ~DCR_SE;
-
- /* kernel mode can propose an exception be handled in debug mode by jumping to a special
- * location */
- if (__debug_frame->pc == (unsigned long) __break_hijack_kernel_event_breaks_here) {
- /* replace the debug frame with the kernel frame and discard
- * the top kernel context */
- *__debug_frame = *__frame;
- __frame = __debug_frame->next_frame;
- __debug_status.brr = (__debug_frame->tbr & TBR_TT) << 12;
- __debug_status.brr |= BRR_EB;
- }
-
- if (__debug_frame->pc == (unsigned long) __debug_bug_trap + 4) {
- __debug_frame->pc = __debug_frame->lr;
- type = __debug_frame->gr8;
- }
-
-#ifdef CONFIG_GDBSTUB
- gdbstub(type);
-#endif
-
- if (hsr0 & HSR0_ETMD)
- __set_HSR(0, __get_HSR(0) | HSR0_ETMD);
-
-} /* end debug_stub() */
-
-/*****************************************************************************/
-/*
- * debug stub initialisation
- */
-static void __init debug_stub_init(void)
-{
- __set_IRR(6, 0xff000000); /* map ERRs to NMI */
- __set_IITMR(1, 0x20000000); /* ERR0/1, UART0/1 IRQ detect levels */
-
- asm volatile(" movgs gr0,ibar0 \n"
- " movgs gr0,ibar1 \n"
- " movgs gr0,ibar2 \n"
- " movgs gr0,ibar3 \n"
- " movgs gr0,dbar0 \n"
- " movgs gr0,dbmr00 \n"
- " movgs gr0,dbmr01 \n"
- " movgs gr0,dbdr00 \n"
- " movgs gr0,dbdr01 \n"
- " movgs gr0,dbar1 \n"
- " movgs gr0,dbmr10 \n"
- " movgs gr0,dbmr11 \n"
- " movgs gr0,dbdr10 \n"
- " movgs gr0,dbdr11 \n"
- );
-
- /* deal with debugging stub initialisation and initial pause */
- if (__debug_frame->pc == (unsigned long) __debug_stub_init_break)
- __debug_frame->pc = (unsigned long) start_kernel;
-
- /* enable the debug events we want to trap */
- __debug_status.dcr = DCR_EBE;
-
-#ifdef CONFIG_GDBSTUB
- gdbstub_init();
-#endif
-
- __clr_MASK_all();
- __clr_MASK(15);
- __clr_RC(15);
-
-} /* end debug_stub_init() */
-
-/*****************************************************************************/
-/*
- * kernel "exit" trap for gdb stub
- */
-void debug_stub_exit(int status)
-{
-
-#ifdef CONFIG_GDBSTUB
- gdbstub_exit(status);
-#endif
-
-} /* end debug_stub_exit() */
-
-/*****************************************************************************/
-/*
- * send string to serial port
- */
-void debug_to_serial(const char *p, int n)
-{
- char ch;
-
- for (; n > 0; n--) {
- ch = *p++;
- FLOWCTL_SET0(DTR);
- LSR_WAIT_FOR0(THRE);
- // FLOWCTL_WAIT_FOR(CTS);
-
- if (ch == 0x0a) {
- __UART0(TX) = 0x0d;
- mb();
- LSR_WAIT_FOR0(THRE);
- // FLOWCTL_WAIT_FOR(CTS);
- }
- __UART0(TX) = ch;
- mb();
-
- FLOWCTL_CLEAR0(DTR);
- }
-
-} /* end debug_to_serial() */
-
-/*****************************************************************************/
-/*
- * send string to serial port
- */
-void debug_to_serial2(const char *fmt, ...)
-{
- va_list va;
- char buf[64];
- int n;
-
- va_start(va, fmt);
- n = vsprintf(buf, fmt, va);
- va_end(va);
-
- debug_to_serial(buf, n);
-
-} /* end debug_to_serial2() */
-
-/*****************************************************************************/
-/*
- * set up the ttyS0 serial port baud rate timers
- */
-void __init console_set_baud(unsigned baud)
-{
- unsigned value, high, low;
- u8 lcr;
-
- /* work out the divisor to give us the nearest higher baud rate */
- value = __serial_clock_speed_HZ / 16 / baud;
-
- /* determine the baud rate range */
- high = __serial_clock_speed_HZ / 16 / value;
- low = __serial_clock_speed_HZ / 16 / (value + 1);
-
- /* pick the nearest bound */
- if (low + (high - low) / 2 > baud)
- value++;
-
- lcr = __UART0(LCR);
- __UART0(LCR) |= UART_LCR_DLAB;
- mb();
- __UART0(DLL) = value & 0xff;
- __UART0(DLM) = (value >> 8) & 0xff;
- mb();
- __UART0(LCR) = lcr;
- mb();
-
-} /* end console_set_baud() */
-
-/*****************************************************************************/
-/*
- *
- */
-int __init console_get_baud(void)
-{
- unsigned value;
- u8 lcr;
-
- lcr = __UART0(LCR);
- __UART0(LCR) |= UART_LCR_DLAB;
- mb();
- value = __UART0(DLM) << 8;
- value |= __UART0(DLL);
- __UART0(LCR) = lcr;
- mb();
-
- return value;
-} /* end console_get_baud() */
-
-/*****************************************************************************/
-/*
- * display BUG() info
- */
-#ifndef CONFIG_NO_KERNEL_MSG
-void __debug_bug_printk(const char *file, unsigned line)
-{
- printk("kernel BUG at %s:%d!\n", file, line);
-
-} /* end __debug_bug_printk() */
-#endif
diff --git a/arch/frv/kernel/dma.c b/arch/frv/kernel/dma.c
deleted file mode 100644
index 370dc9fa0b11..000000000000
--- a/arch/frv/kernel/dma.c
+++ /dev/null
@@ -1,463 +0,0 @@
-/* dma.c: DMA controller management on FR401 and the like
- *
- * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
- * Written by David Howells (dhowells@redhat.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.
- */
-
-#include <linux/module.h>
-#include <linux/sched.h>
-#include <linux/spinlock.h>
-#include <linux/errno.h>
-#include <linux/init.h>
-#include <asm/dma.h>
-#include <asm/gpio-regs.h>
-#include <asm/irc-regs.h>
-#include <asm/cpu-irqs.h>
-
-struct frv_dma_channel {
- uint8_t flags;
-#define FRV_DMA_FLAGS_RESERVED 0x01
-#define FRV_DMA_FLAGS_INUSE 0x02
-#define FRV_DMA_FLAGS_PAUSED 0x04
- uint8_t cap; /* capabilities available */
- int irq; /* completion IRQ */
- uint32_t dreqbit;
- uint32_t dackbit;
- uint32_t donebit;
- const unsigned long ioaddr; /* DMA controller regs addr */
- const char *devname;
- dma_irq_handler_t handler;
- void *data;
-};
-
-
-#define __get_DMAC(IO,X) ({ *(volatile unsigned long *)((IO) + DMAC_##X##x); })
-
-#define __set_DMAC(IO,X,V) \
-do { \
- *(volatile unsigned long *)((IO) + DMAC_##X##x) = (V); \
- mb(); \
-} while(0)
-
-#define ___set_DMAC(IO,X,V) \
-do { \
- *(volatile unsigned long *)((IO) + DMAC_##X##x) = (V); \
-} while(0)
-
-
-static struct frv_dma_channel frv_dma_channels[FRV_DMA_NCHANS] = {
- [0] = {
- .cap = FRV_DMA_CAP_DREQ | FRV_DMA_CAP_DACK | FRV_DMA_CAP_DONE,
- .irq = IRQ_CPU_DMA0,
- .dreqbit = SIR_DREQ0_INPUT,
- .dackbit = SOR_DACK0_OUTPUT,
- .donebit = SOR_DONE0_OUTPUT,
- .ioaddr = 0xfe000900,
- },
- [1] = {
- .cap = FRV_DMA_CAP_DREQ | FRV_DMA_CAP_DACK | FRV_DMA_CAP_DONE,
- .irq = IRQ_CPU_DMA1,
- .dreqbit = SIR_DREQ1_INPUT,
- .dackbit = SOR_DACK1_OUTPUT,
- .donebit = SOR_DONE1_OUTPUT,
- .ioaddr = 0xfe000980,
- },
- [2] = {
- .cap = FRV_DMA_CAP_DREQ | FRV_DMA_CAP_DACK,
- .irq = IRQ_CPU_DMA2,
- .dreqbit = SIR_DREQ2_INPUT,
- .dackbit = SOR_DACK2_OUTPUT,
- .ioaddr = 0xfe000a00,
- },
- [3] = {
- .cap = FRV_DMA_CAP_DREQ | FRV_DMA_CAP_DACK,
- .irq = IRQ_CPU_DMA3,
- .dreqbit = SIR_DREQ3_INPUT,
- .dackbit = SOR_DACK3_OUTPUT,
- .ioaddr = 0xfe000a80,
- },
- [4] = {
- .cap = FRV_DMA_CAP_DREQ,
- .irq = IRQ_CPU_DMA4,
- .dreqbit = SIR_DREQ4_INPUT,
- .ioaddr = 0xfe001000,
- },
- [5] = {
- .cap = FRV_DMA_CAP_DREQ,
- .irq = IRQ_CPU_DMA5,
- .dreqbit = SIR_DREQ5_INPUT,
- .ioaddr = 0xfe001080,
- },
- [6] = {
- .cap = FRV_DMA_CAP_DREQ,
- .irq = IRQ_CPU_DMA6,
- .dreqbit = SIR_DREQ6_INPUT,
- .ioaddr = 0xfe001100,
- },
- [7] = {
- .cap = FRV_DMA_CAP_DREQ,
- .irq = IRQ_CPU_DMA7,
- .dreqbit = SIR_DREQ7_INPUT,
- .ioaddr = 0xfe001180,
- },
-};
-
-static DEFINE_RWLOCK(frv_dma_channels_lock);
-
-unsigned int frv_dma_inprogress;
-
-#define frv_clear_dma_inprogress(channel) \
- (void)__atomic32_fetch_and(~(1 << (channel)), &frv_dma_inprogress);
-
-#define frv_set_dma_inprogress(channel) \
- (void)__atomic32_fetch_or(1 << (channel), &frv_dma_inprogress);
-
-/*****************************************************************************/
-/*
- * DMA irq handler - determine channel involved, grab status and call real handler
- */
-static irqreturn_t dma_irq_handler(int irq, void *_channel)
-{
- struct frv_dma_channel *channel = _channel;
-
- frv_clear_dma_inprogress(channel - frv_dma_channels);
- return channel->handler(channel - frv_dma_channels,
- __get_DMAC(channel->ioaddr, CSTR),
- channel->data);
-
-} /* end dma_irq_handler() */
-
-/*****************************************************************************/
-/*
- * Determine which DMA controllers are present on this CPU
- */
-void __init frv_dma_init(void)
-{
- unsigned long psr = __get_PSR();
- int num_dma, i;
-
- /* First, determine how many DMA channels are available */
- switch (PSR_IMPLE(psr)) {
- case PSR_IMPLE_FR405:
- case PSR_IMPLE_FR451:
- case PSR_IMPLE_FR501:
- case PSR_IMPLE_FR551:
- num_dma = FRV_DMA_8CHANS;
- break;
-
- case PSR_IMPLE_FR401:
- default:
- num_dma = FRV_DMA_4CHANS;
- break;
- }
-
- /* Now mark all of the non-existent channels as reserved */
- for(i = num_dma; i < FRV_DMA_NCHANS; i++)
- frv_dma_channels[i].flags = FRV_DMA_FLAGS_RESERVED;
-
-} /* end frv_dma_init() */
-
-/*****************************************************************************/
-/*
- * allocate a DMA controller channel and the IRQ associated with it
- */
-int frv_dma_open(const char *devname,
- unsigned long dmamask,
- int dmacap,
- dma_irq_handler_t handler,
- unsigned long irq_flags,
- void *data)
-{
- struct frv_dma_channel *channel;
- int dma, ret;
- uint32_t val;
-
- write_lock(&frv_dma_channels_lock);
-
- ret = -ENOSPC;
-
- for (dma = FRV_DMA_NCHANS - 1; dma >= 0; dma--) {
- channel = &frv_dma_channels[dma];
-
- if (!test_bit(dma, &dmamask))
- continue;
-
- if ((channel->cap & dmacap) != dmacap)
- continue;
-
- if (!frv_dma_channels[dma].flags)
- goto found;
- }
-
- goto out;
-
- found:
- ret = request_irq(channel->irq, dma_irq_handler, irq_flags, devname, channel);
- if (ret < 0)
- goto out;
-
- /* okay, we've allocated all the resources */
- channel = &frv_dma_channels[dma];
-
- channel->flags |= FRV_DMA_FLAGS_INUSE;
- channel->devname = devname;
- channel->handler = handler;
- channel->data = data;
-
- /* Now make sure we are set up for DMA and not GPIO */
- /* SIR bit must be set for DMA to work */
- __set_SIR(channel->dreqbit | __get_SIR());
- /* SOR bits depend on what the caller requests */
- val = __get_SOR();
- if(dmacap & FRV_DMA_CAP_DACK)
- val |= channel->dackbit;
- else
- val &= ~channel->dackbit;
- if(dmacap & FRV_DMA_CAP_DONE)
- val |= channel->donebit;
- else
- val &= ~channel->donebit;
- __set_SOR(val);
-
- ret = dma;
- out:
- write_unlock(&frv_dma_channels_lock);
- return ret;
-} /* end frv_dma_open() */
-
-EXPORT_SYMBOL(frv_dma_open);
-
-/*****************************************************************************/
-/*
- * close a DMA channel and its associated interrupt
- */
-void frv_dma_close(int dma)
-{
- struct frv_dma_channel *channel = &frv_dma_channels[dma];
- unsigned long flags;
-
- write_lock_irqsave(&frv_dma_channels_lock, flags);
-
- free_irq(channel->irq, channel);
- frv_dma_stop(dma);
-
- channel->flags &= ~FRV_DMA_FLAGS_INUSE;
-
- write_unlock_irqrestore(&frv_dma_channels_lock, flags);
-} /* end frv_dma_close() */
-
-EXPORT_SYMBOL(frv_dma_close);
-
-/*****************************************************************************/
-/*
- * set static configuration on a DMA channel
- */
-void frv_dma_config(int dma, unsigned long ccfr, unsigned long cctr, unsigned long apr)
-{
- unsigned long ioaddr = frv_dma_channels[dma].ioaddr;
-
- ___set_DMAC(ioaddr, CCFR, ccfr);
- ___set_DMAC(ioaddr, CCTR, cctr);
- ___set_DMAC(ioaddr, APR, apr);
- mb();
-
-} /* end frv_dma_config() */
-
-EXPORT_SYMBOL(frv_dma_config);
-
-/*****************************************************************************/
-/*
- * start a DMA channel
- */
-void frv_dma_start(int dma,
- unsigned long sba, unsigned long dba,
- unsigned long pix, unsigned long six, unsigned long bcl)
-{
- unsigned long ioaddr = frv_dma_channels[dma].ioaddr;
-
- ___set_DMAC(ioaddr, SBA, sba);
- ___set_DMAC(ioaddr, DBA, dba);
- ___set_DMAC(ioaddr, PIX, pix);
- ___set_DMAC(ioaddr, SIX, six);
- ___set_DMAC(ioaddr, BCL, bcl);
- ___set_DMAC(ioaddr, CSTR, 0);
- mb();
-
- __set_DMAC(ioaddr, CCTR, __get_DMAC(ioaddr, CCTR) | DMAC_CCTRx_ACT);
- frv_set_dma_inprogress(dma);
-
-} /* end frv_dma_start() */
-
-EXPORT_SYMBOL(frv_dma_start);
-
-/*****************************************************************************/
-/*
- * restart a DMA channel that's been stopped in circular addressing mode by comparison-end
- */
-void frv_dma_restart_circular(int dma, unsigned long six)
-{
- unsigned long ioaddr = frv_dma_channels[dma].ioaddr;
-
- ___set_DMAC(ioaddr, SIX, six);
- ___set_DMAC(ioaddr, CSTR, __get_DMAC(ioaddr, CSTR) & ~DMAC_CSTRx_CE);
- mb();
-
- __set_DMAC(ioaddr, CCTR, __get_DMAC(ioaddr, CCTR) | DMAC_CCTRx_ACT);
- frv_set_dma_inprogress(dma);
-
-} /* end frv_dma_restart_circular() */
-
-EXPORT_SYMBOL(frv_dma_restart_circular);
-
-/*****************************************************************************/
-/*
- * stop a DMA channel
- */
-void frv_dma_stop(int dma)
-{
- unsigned long ioaddr = frv_dma_channels[dma].ioaddr;
- uint32_t cctr;
-
- ___set_DMAC(ioaddr, CSTR, 0);
- cctr = __get_DMAC(ioaddr, CCTR);
- cctr &= ~(DMAC_CCTRx_IE | DMAC_CCTRx_ACT);
- cctr |= DMAC_CCTRx_FC; /* fifo clear */
- __set_DMAC(ioaddr, CCTR, cctr);
- __set_DMAC(ioaddr, BCL, 0);
- frv_clear_dma_inprogress(dma);
-} /* end frv_dma_stop() */
-
-EXPORT_SYMBOL(frv_dma_stop);
-
-/*****************************************************************************/
-/*
- * test interrupt status of DMA channel
- */
-int is_frv_dma_interrupting(int dma)
-{
- unsigned long ioaddr = frv_dma_channels[dma].ioaddr;
-
- return __get_DMAC(ioaddr, CSTR) & (1 << 23);
-
-} /* end is_frv_dma_interrupting() */
-
-EXPORT_SYMBOL(is_frv_dma_interrupting);
-
-/*****************************************************************************/
-/*
- * dump data about a DMA channel
- */
-void frv_dma_dump(int dma)
-{
- unsigned long ioaddr = frv_dma_channels[dma].ioaddr;
- unsigned long cstr, pix, six, bcl;
-
- cstr = __get_DMAC(ioaddr, CSTR);
- pix = __get_DMAC(ioaddr, PIX);
- six = __get_DMAC(ioaddr, SIX);
- bcl = __get_DMAC(ioaddr, BCL);
-
- printk("DMA[%d] cstr=%lx pix=%lx six=%lx bcl=%lx\n", dma, cstr, pix, six, bcl);
-
-} /* end frv_dma_dump() */
-
-EXPORT_SYMBOL(frv_dma_dump);
-
-/*****************************************************************************/
-/*
- * pause all DMA controllers
- * - called by clock mangling routines
- * - caller must be holding interrupts disabled
- */
-void frv_dma_pause_all(void)
-{
- struct frv_dma_channel *channel;
- unsigned long ioaddr;
- unsigned long cstr, cctr;
- int dma;
-
- write_lock(&frv_dma_channels_lock);
-
- for (dma = FRV_DMA_NCHANS - 1; dma >= 0; dma--) {
- channel = &frv_dma_channels[dma];
-
- if (!(channel->flags & FRV_DMA_FLAGS_INUSE))
- continue;
-
- ioaddr = channel->ioaddr;
- cctr = __get_DMAC(ioaddr, CCTR);
- if (cctr & DMAC_CCTRx_ACT) {
- cctr &= ~DMAC_CCTRx_ACT;
- __set_DMAC(ioaddr, CCTR, cctr);
-
- do {
- cstr = __get_DMAC(ioaddr, CSTR);
- } while (cstr & DMAC_CSTRx_BUSY);
-
- if (cstr & DMAC_CSTRx_FED)
- channel->flags |= FRV_DMA_FLAGS_PAUSED;
- frv_clear_dma_inprogress(dma);
- }
- }
-
-} /* end frv_dma_pause_all() */
-
-EXPORT_SYMBOL(frv_dma_pause_all);
-
-/*****************************************************************************/
-/*
- * resume paused DMA controllers
- * - called by clock mangling routines
- * - caller must be holding interrupts disabled
- */
-void frv_dma_resume_all(void)
-{
- struct frv_dma_channel *channel;
- unsigned long ioaddr;
- unsigned long cstr, cctr;
- int dma;
-
- for (dma = FRV_DMA_NCHANS - 1; dma >= 0; dma--) {
- channel = &frv_dma_channels[dma];
-
- if (!(channel->flags & FRV_DMA_FLAGS_PAUSED))
- continue;
-
- ioaddr = channel->ioaddr;
- cstr = __get_DMAC(ioaddr, CSTR);
- cstr &= ~(DMAC_CSTRx_FED | DMAC_CSTRx_INT);
- __set_DMAC(ioaddr, CSTR, cstr);
-
- cctr = __get_DMAC(ioaddr, CCTR);
- cctr |= DMAC_CCTRx_ACT;
- __set_DMAC(ioaddr, CCTR, cctr);
-
- channel->flags &= ~FRV_DMA_FLAGS_PAUSED;
- frv_set_dma_inprogress(dma);
- }
-
- write_unlock(&frv_dma_channels_lock);
-
-} /* end frv_dma_resume_all() */
-
-EXPORT_SYMBOL(frv_dma_resume_all);
-
-/*****************************************************************************/
-/*
- * dma status clear
- */
-void frv_dma_status_clear(int dma)
-{
- unsigned long ioaddr = frv_dma_channels[dma].ioaddr;
- uint32_t cctr;
- ___set_DMAC(ioaddr, CSTR, 0);
-
- cctr = __get_DMAC(ioaddr, CCTR);
-} /* end frv_dma_status_clear() */
-
-EXPORT_SYMBOL(frv_dma_status_clear);
diff --git a/arch/frv/kernel/entry-table.S b/arch/frv/kernel/entry-table.S
deleted file mode 100644
index 06c5ae191e59..000000000000
--- a/arch/frv/kernel/entry-table.S
+++ /dev/null
@@ -1,329 +0,0 @@
-/* entry-table.S: main trap vector tables and exception jump table
- *
- * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved.
- * Written by David Howells (dhowells@redhat.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.
- *
- */
-
-#include <linux/sys.h>
-#include <linux/linkage.h>
-#include <asm/spr-regs.h>
-
-###############################################################################
-#
-# Declare the main trap and vector tables
-#
-# There are six tables:
-#
-# (1) The trap table for debug mode
-# (2) The trap table for kernel mode
-# (3) The trap table for user mode
-#
-# The CPU jumps to an appropriate slot in the appropriate table to perform
-# exception processing. We have three different tables for the three
-# different CPU modes because there is no hardware differentiation between
-# stack pointers for these three modes, and so we have to invent one when
-# crossing mode boundaries.
-#
-# (4) The exception handler vector table
-#
-# The user and kernel trap tables use the same prologue for normal
-# exception processing. The prologue then jumps to the handler in this
-# table, as indexed by the exception ID from the TBR.
-#
-# (5) The fixup table for kernel-trap single-step
-# (6) The fixup table for user-trap single-step
-#
-# Due to the way single-stepping works on this CPU (single-step is not
-# disabled when crossing exception boundaries, only when in debug mode),
-# we have to catch the single-step event in break.S and jump to the fixup
-# routine pointed to by this table.
-#
-# The linker script places the user mode and kernel mode trap tables on to
-# the same 8Kb page, so that break.S can be more efficient when performing
-# single-step bypass management
-#
-###############################################################################
-
- # trap table for entry from debug mode
- .section .trap.break,"ax"
- .balign 256*16
- .globl __entry_breaktrap_table
-__entry_breaktrap_table:
-
- # trap table for entry from user mode
- .section .trap.user,"ax"
- .balign 256*16
- .globl __entry_usertrap_table
-__entry_usertrap_table:
-
- # trap table for entry from kernel mode
- .section .trap.kernel,"ax"
- .balign 256*16
- .globl __entry_kerneltrap_table
-__entry_kerneltrap_table:
-
- # exception handler jump table
- .section .trap.vector,"ax"
- .balign 256*4
- .globl __entry_vector_table
-__entry_vector_table:
-
- # trap fixup table for single-stepping in user mode
- .section .trap.fixup.user,"a"
- .balign 256*4
- .globl __break_usertrap_fixup_table
-__break_usertrap_fixup_table:
-
- # trap fixup table for single-stepping in user mode
- .section .trap.fixup.kernel,"a"
- .balign 256*4
- .globl __break_kerneltrap_fixup_table
-__break_kerneltrap_fixup_table:
-
- # handler declaration for a software or program interrupt
-.macro VECTOR_SOFTPROG tbr_tt, vec
- .section .trap.user
- .org \tbr_tt
- bra __entry_uspace_softprog_interrupt
- .section .trap.fixup.user
- .org \tbr_tt >> 2
- .long __break_step_uspace_softprog_interrupt
- .section .trap.kernel
- .org \tbr_tt
- bra __entry_kernel_softprog_interrupt
- .section .trap.fixup.kernel
- .org \tbr_tt >> 2
- .long __break_step_kernel_softprog_interrupt
- .section .trap.vector
- .org \tbr_tt >> 2
- .long \vec
-.endm
-
- # handler declaration for a maskable external interrupt
-.macro VECTOR_IRQ tbr_tt, vec
- .section .trap.user
- .org \tbr_tt
- bra __entry_uspace_external_interrupt
- .section .trap.fixup.user
- .org \tbr_tt >> 2
- .long __break_step_uspace_external_interrupt
- .section .trap.kernel
- .org \tbr_tt
- # deal with virtual interrupt disablement
- beq icc2,#0,__entry_kernel_external_interrupt_virtually_disabled
- bra __entry_kernel_external_interrupt
- .section .trap.fixup.kernel
- .org \tbr_tt >> 2
- .long __break_step_kernel_external_interrupt
- .section .trap.vector
- .org \tbr_tt >> 2
- .long \vec
-.endm
-
- # handler declaration for an NMI external interrupt
-.macro VECTOR_NMI tbr_tt, vec
- .section .trap.user
- .org \tbr_tt
- break
- break
- break
- break
- .section .trap.kernel
- .org \tbr_tt
- break
- break
- break
- break
- .section .trap.vector
- .org \tbr_tt >> 2
- .long \vec
-.endm
-
- # handler declaration for an MMU only software or program interrupt
-.macro VECTOR_SP_MMU tbr_tt, vec
-#ifdef CONFIG_MMU
- VECTOR_SOFTPROG \tbr_tt, \vec
-#else
- VECTOR_NMI \tbr_tt, 0
-#endif
-.endm
-
-
-###############################################################################
-#
-# specification of the vectors
-# - note: each macro inserts code into multiple sections
-#
-###############################################################################
- VECTOR_SP_MMU TBR_TT_INSTR_MMU_MISS, __entry_insn_mmu_miss
- VECTOR_SOFTPROG TBR_TT_INSTR_ACC_ERROR, __entry_insn_access_error
- VECTOR_SOFTPROG TBR_TT_INSTR_ACC_EXCEP, __entry_insn_access_exception
- VECTOR_SOFTPROG TBR_TT_PRIV_INSTR, __entry_privileged_instruction
- VECTOR_SOFTPROG TBR_TT_ILLEGAL_INSTR, __entry_illegal_instruction
- VECTOR_SOFTPROG TBR_TT_FP_EXCEPTION, __entry_media_exception
- VECTOR_SOFTPROG TBR_TT_MP_EXCEPTION, __entry_media_exception
- VECTOR_SOFTPROG TBR_TT_DATA_ACC_ERROR, __entry_data_access_error
- VECTOR_SP_MMU TBR_TT_DATA_MMU_MISS, __entry_data_mmu_miss
- VECTOR_SOFTPROG TBR_TT_DATA_ACC_EXCEP, __entry_data_access_exception
- VECTOR_SOFTPROG TBR_TT_DATA_STR_ERROR, __entry_data_store_error
- VECTOR_SOFTPROG TBR_TT_DIVISION_EXCEP, __entry_division_exception
-
-#ifdef CONFIG_MMU
- .section .trap.user
- .org TBR_TT_INSTR_TLB_MISS
- .globl __trap_user_insn_tlb_miss
-__trap_user_insn_tlb_miss:
- movsg ear0,gr28 /* faulting address */
- movsg scr0,gr31 /* get mapped PTD coverage start address */
- xor.p gr28,gr31,gr31 /* compare addresses */
- bra __entry_user_insn_tlb_miss
-
- .org TBR_TT_DATA_TLB_MISS
- .globl __trap_user_data_tlb_miss
-__trap_user_data_tlb_miss:
- movsg ear0,gr28 /* faulting address */
- movsg scr1,gr31 /* get mapped PTD coverage start address */
- xor.p gr28,gr31,gr31 /* compare addresses */
- bra __entry_user_data_tlb_miss
-
- .section .trap.kernel
- .org TBR_TT_INSTR_TLB_MISS
- .globl __trap_kernel_insn_tlb_miss
-__trap_kernel_insn_tlb_miss:
- movsg ear0,gr29 /* faulting address */
- movsg scr0,gr31 /* get mapped PTD coverage start address */
- xor.p gr29,gr31,gr31 /* compare addresses */
- bra __entry_kernel_insn_tlb_miss
-
- .org TBR_TT_DATA_TLB_MISS
- .globl __trap_kernel_data_tlb_miss
-__trap_kernel_data_tlb_miss:
- movsg ear0,gr29 /* faulting address */
- movsg scr1,gr31 /* get mapped PTD coverage start address */
- xor.p gr29,gr31,gr31 /* compare addresses */
- bra __entry_kernel_data_tlb_miss
-
- .section .trap.fixup.user
- .org TBR_TT_INSTR_TLB_MISS >> 2
- .globl __trap_fixup_user_insn_tlb_miss
-__trap_fixup_user_insn_tlb_miss:
- .long __break_user_insn_tlb_miss
- .org TBR_TT_DATA_TLB_MISS >> 2
- .globl __trap_fixup_user_data_tlb_miss
-__trap_fixup_user_data_tlb_miss:
- .long __break_user_data_tlb_miss
-
- .section .trap.fixup.kernel
- .org TBR_TT_INSTR_TLB_MISS >> 2
- .globl __trap_fixup_kernel_insn_tlb_miss
-__trap_fixup_kernel_insn_tlb_miss:
- .long __break_kernel_insn_tlb_miss
- .org TBR_TT_DATA_TLB_MISS >> 2
- .globl __trap_fixup_kernel_data_tlb_miss
-__trap_fixup_kernel_data_tlb_miss:
- .long __break_kernel_data_tlb_miss
-
- .section .trap.vector
- .org TBR_TT_INSTR_TLB_MISS >> 2
- .long __entry_insn_mmu_fault
- .org TBR_TT_DATA_TLB_MISS >> 2
- .long __entry_data_mmu_fault
-#endif
-
- VECTOR_SP_MMU TBR_TT_DATA_DAT_EXCEP, __entry_data_dat_fault
- VECTOR_NMI TBR_TT_DECREMENT_TIMER, __entry_do_NMI
- VECTOR_SOFTPROG TBR_TT_COMPOUND_EXCEP, __entry_compound_exception
- VECTOR_IRQ TBR_TT_INTERRUPT_1, __entry_do_IRQ
- VECTOR_IRQ TBR_TT_INTERRUPT_2, __entry_do_IRQ
- VECTOR_IRQ TBR_TT_INTERRUPT_3, __entry_do_IRQ
- VECTOR_IRQ TBR_TT_INTERRUPT_4, __entry_do_IRQ
- VECTOR_IRQ TBR_TT_INTERRUPT_5, __entry_do_IRQ
- VECTOR_IRQ TBR_TT_INTERRUPT_6, __entry_do_IRQ
- VECTOR_IRQ TBR_TT_INTERRUPT_7, __entry_do_IRQ
- VECTOR_IRQ TBR_TT_INTERRUPT_8, __entry_do_IRQ
- VECTOR_IRQ TBR_TT_INTERRUPT_9, __entry_do_IRQ
- VECTOR_IRQ TBR_TT_INTERRUPT_10, __entry_do_IRQ
- VECTOR_IRQ TBR_TT_INTERRUPT_11, __entry_do_IRQ
- VECTOR_IRQ TBR_TT_INTERRUPT_12, __entry_do_IRQ
- VECTOR_IRQ TBR_TT_INTERRUPT_13, __entry_do_IRQ
- VECTOR_IRQ TBR_TT_INTERRUPT_14, __entry_do_IRQ
- VECTOR_NMI TBR_TT_INTERRUPT_15, __entry_do_NMI
-
- # miscellaneous user mode entry points
- .section .trap.user
- .org TBR_TT_TRAP0
- .rept 127
- bra __entry_uspace_softprog_interrupt
- .long 0,0,0
- .endr
- .org TBR_TT_BREAK
- bra __entry_break
- .long 0,0,0
-
- .section .trap.fixup.user
- .org TBR_TT_TRAP0 >> 2
- .rept 127
- .long __break_step_uspace_softprog_interrupt
- .endr
- .org TBR_TT_BREAK >> 2
- .long 0
-
- # miscellaneous kernel mode entry points
- .section .trap.kernel
- .org TBR_TT_TRAP0
- bra __entry_kernel_softprog_interrupt
- .org TBR_TT_TRAP1
- bra __entry_kernel_softprog_interrupt
-
- # trap #2 in kernel - reenable interrupts
- .org TBR_TT_TRAP2
- bra __entry_kernel_external_interrupt_virtual_reenable
-
- # miscellaneous kernel traps
- .org TBR_TT_TRAP3
- .rept 124
- bra __entry_kernel_softprog_interrupt
- .long 0,0,0
- .endr
- .org TBR_TT_BREAK
- bra __entry_break
- .long 0,0,0
-
- .section .trap.fixup.kernel
- .org TBR_TT_TRAP0 >> 2
- .long __break_step_kernel_softprog_interrupt
- .long __break_step_kernel_softprog_interrupt
- .long __break_step_kernel_external_interrupt_virtual_reenable
- .rept 124
- .long __break_step_kernel_softprog_interrupt
- .endr
- .org TBR_TT_BREAK >> 2
- .long 0
-
- # miscellaneous debug mode entry points
- .section .trap.break
- .org TBR_TT_BREAK
- movsg bpcsr,gr30
- jmpl @(gr30,gr0)
-
- # miscellaneous vectors
- .section .trap.vector
- .org TBR_TT_TRAP0 >> 2
- .long system_call
- .rept 119
- .long __entry_unsupported_trap
- .endr
-
- # userspace atomic op emulation, traps 120-126
- .rept 7
- .long __entry_atomic_op
- .endr
-
- .org TBR_TT_BREAK >> 2
- .long __entry_debug_exception
diff --git a/arch/frv/kernel/entry.S b/arch/frv/kernel/entry.S
deleted file mode 100644
index dfcd263c0517..000000000000
--- a/arch/frv/kernel/entry.S
+++ /dev/null
@@ -1,1519 +0,0 @@
-/* entry.S: FR-V entry
- *
- * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved.
- * Written by David Howells (dhowells@redhat.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.
- *
- *
- * Entry to the kernel is "interesting":
- * (1) There are no stack pointers, not even for the kernel
- * (2) General Registers should not be clobbered
- * (3) There are no kernel-only data registers
- * (4) Since all addressing modes are wrt to a General Register, no global
- * variables can be reached
- *
- * We deal with this by declaring that we shall kill GR28 on entering the
- * kernel from userspace
- *
- * However, since break interrupts can interrupt the CPU even when PSR.ET==0,
- * they can't rely on GR28 to be anything useful, and so need to clobber a
- * separate register (GR31). Break interrupts are managed in break.S
- *
- * GR29 _is_ saved, and holds the current task pointer globally
- *
- */
-
-#include <linux/linkage.h>
-#include <asm/thread_info.h>
-#include <asm/setup.h>
-#include <asm/segment.h>
-#include <asm/ptrace.h>
-#include <asm/errno.h>
-#include <asm/cache.h>
-#include <asm/spr-regs.h>
-
-#define nr_syscalls ((syscall_table_size)/4)
-
- .section .text..entry
- .balign 4
-
-.macro LEDS val
-# sethi.p %hi(0xe1200004),gr30
-# setlo %lo(0xe1200004),gr30
-# setlos #~\val,gr31
-# st gr31,@(gr30,gr0)
-# sethi.p %hi(0xffc00100),gr30
-# setlo %lo(0xffc00100),gr30
-# sth gr0,@(gr30,gr0)
-# membar
-.endm
-
-.macro LEDS32
-# not gr31,gr31
-# sethi.p %hi(0xe1200004),gr30
-# setlo %lo(0xe1200004),gr30
-# st.p gr31,@(gr30,gr0)
-# srli gr31,#16,gr31
-# sethi.p %hi(0xffc00100),gr30
-# setlo %lo(0xffc00100),gr30
-# sth gr31,@(gr30,gr0)
-# membar
-.endm
-
-###############################################################################
-#
-# entry point for External interrupts received whilst executing userspace code
-#
-###############################################################################
- .globl __entry_uspace_external_interrupt
- .type __entry_uspace_external_interrupt,@function
-__entry_uspace_external_interrupt:
- LEDS 0x6200
- sethi.p %hi(__kernel_frame0_ptr),gr28
- setlo %lo(__kernel_frame0_ptr),gr28
- ldi @(gr28,#0),gr28
-
- # handle h/w single-step through exceptions
- sti gr0,@(gr28,#REG__STATUS)
-
- .globl __entry_uspace_external_interrupt_reentry
-__entry_uspace_external_interrupt_reentry:
- LEDS 0x6201
-
- setlos #REG__END,gr30
- dcpl gr28,gr30,#0
-
- # finish building the exception frame
- sti sp, @(gr28,#REG_SP)
- stdi gr2, @(gr28,#REG_GR(2))
- stdi gr4, @(gr28,#REG_GR(4))
- stdi gr6, @(gr28,#REG_GR(6))
- stdi gr8, @(gr28,#REG_GR(8))
- stdi gr10,@(gr28,#REG_GR(10))
- stdi gr12,@(gr28,#REG_GR(12))
- stdi gr14,@(gr28,#REG_GR(14))
- stdi gr16,@(gr28,#REG_GR(16))
- stdi gr18,@(gr28,#REG_GR(18))
- stdi gr20,@(gr28,#REG_GR(20))
- stdi gr22,@(gr28,#REG_GR(22))
- stdi gr24,@(gr28,#REG_GR(24))
- stdi gr26,@(gr28,#REG_GR(26))
- sti gr0, @(gr28,#REG_GR(28))
- sti gr29,@(gr28,#REG_GR(29))
- stdi.p gr30,@(gr28,#REG_GR(30))
-
- # set up the kernel stack pointer
- ori gr28,0,sp
-
- movsg tbr ,gr20
- movsg psr ,gr22
- movsg pcsr,gr21
- movsg isr ,gr23
- movsg ccr ,gr24
- movsg cccr,gr25
- movsg lr ,gr26
- movsg lcr ,gr27
-
- setlos.p #-1,gr4
- andi gr22,#PSR_PS,gr5 /* try to rebuild original PSR value */
- andi.p gr22,#~(PSR_PS|PSR_S),gr6
- slli gr5,#1,gr5
- or gr6,gr5,gr5
- andi gr5,#~PSR_ET,gr5
-
- sti gr20,@(gr28,#REG_TBR)
- sti gr21,@(gr28,#REG_PC)
- sti gr5 ,@(gr28,#REG_PSR)
- sti gr23,@(gr28,#REG_ISR)
- stdi gr24,@(gr28,#REG_CCR)
- stdi gr26,@(gr28,#REG_LR)
- sti gr4 ,@(gr28,#REG_SYSCALLNO)
-
- movsg iacc0h,gr4
- movsg iacc0l,gr5
- stdi gr4,@(gr28,#REG_IACC0)
-
- movsg gner0,gr4
- movsg gner1,gr5
- stdi.p gr4,@(gr28,#REG_GNER0)
-
- # interrupts start off fully disabled in the interrupt handler
- subcc gr0,gr0,gr0,icc2 /* set Z and clear C */
-
- # set up kernel global registers
- sethi.p %hi(__kernel_current_task),gr5
- setlo %lo(__kernel_current_task),gr5
- sethi.p %hi(_gp),gr16
- setlo %lo(_gp),gr16
- ldi @(gr5,#0),gr29
- ldi.p @(gr29,#4),gr15 ; __current_thread_info = current->thread_info
-
- # make sure we (the kernel) get div-zero and misalignment exceptions
- setlos #ISR_EDE|ISR_DTT_DIVBYZERO|ISR_EMAM_EXCEPTION,gr5
- movgs gr5,isr
-
- # switch to the kernel trap table
- sethi.p %hi(__entry_kerneltrap_table),gr6
- setlo %lo(__entry_kerneltrap_table),gr6
- movgs gr6,tbr
-
- # set the return address
- sethi.p %hi(__entry_return_from_user_interrupt),gr4
- setlo %lo(__entry_return_from_user_interrupt),gr4
- movgs gr4,lr
-
- # raise the minimum interrupt priority to 15 (NMI only) and enable exceptions
- movsg psr,gr4
-
- ori gr4,#PSR_PIL_14,gr4
- movgs gr4,psr
- ori gr4,#PSR_PIL_14|PSR_ET,gr4
- movgs gr4,psr
-
- LEDS 0x6202
- bra do_IRQ
-
- .size __entry_uspace_external_interrupt,.-__entry_uspace_external_interrupt
-
-###############################################################################
-#
-# entry point for External interrupts received whilst executing kernel code
-# - on arriving here, the following registers should already be set up:
-# GR15 - current thread_info struct pointer
-# GR16 - kernel GP-REL pointer
-# GR29 - current task struct pointer
-# TBR - kernel trap vector table
-# ISR - kernel's preferred integer controls
-#
-###############################################################################
- .globl __entry_kernel_external_interrupt
- .type __entry_kernel_external_interrupt,@function
-__entry_kernel_external_interrupt:
- LEDS 0x6210
-// sub sp,gr15,gr31
-// LEDS32
-
- # set up the stack pointer
- or.p sp,gr0,gr30
- subi sp,#REG__END,sp
- sti gr30,@(sp,#REG_SP)
-
- # handle h/w single-step through exceptions
- sti gr0,@(sp,#REG__STATUS)
-
- .globl __entry_kernel_external_interrupt_reentry
-__entry_kernel_external_interrupt_reentry:
- LEDS 0x6211
-
- # set up the exception frame
- setlos #REG__END,gr30
- dcpl sp,gr30,#0
-
- sti.p gr28,@(sp,#REG_GR(28))
- ori sp,0,gr28
-
- # finish building the exception frame
- stdi gr2,@(gr28,#REG_GR(2))
- stdi gr4,@(gr28,#REG_GR(4))
- stdi gr6,@(gr28,#REG_GR(6))
- stdi gr8,@(gr28,#REG_GR(8))
- stdi gr10,@(gr28,#REG_GR(10))
- stdi gr12,@(gr28,#REG_GR(12))
- stdi gr14,@(gr28,#REG_GR(14))
- stdi gr16,@(gr28,#REG_GR(16))
- stdi gr18,@(gr28,#REG_GR(18))
- stdi gr20,@(gr28,#REG_GR(20))
- stdi gr22,@(gr28,#REG_GR(22))
- stdi gr24,@(gr28,#REG_GR(24))
- stdi gr26,@(gr28,#REG_GR(26))
- sti gr29,@(gr28,#REG_GR(29))
- stdi.p gr30,@(gr28,#REG_GR(30))
-
- # note virtual interrupts will be fully enabled upon return
- subicc gr0,#1,gr0,icc2 /* clear Z, set C */
-
- movsg tbr ,gr20
- movsg psr ,gr22
- movsg pcsr,gr21
- movsg isr ,gr23
- movsg ccr ,gr24
- movsg cccr,gr25
- movsg lr ,gr26
- movsg lcr ,gr27
-
- setlos.p #-1,gr4
- andi gr22,#PSR_PS,gr5 /* try to rebuild original PSR value */
- andi.p gr22,#~(PSR_PS|PSR_S),gr6
- slli gr5,#1,gr5
- or gr6,gr5,gr5
- andi.p gr5,#~PSR_ET,gr5
-
- # set CCCR.CC3 to Undefined to abort atomic-modify completion inside the kernel
- # - for an explanation of how it works, see: Documentation/frv/atomic-ops.txt
- andi gr25,#~0xc0,gr25
-
- sti gr20,@(gr28,#REG_TBR)
- sti gr21,@(gr28,#REG_PC)
- sti gr5 ,@(gr28,#REG_PSR)
- sti gr23,@(gr28,#REG_ISR)
- stdi gr24,@(gr28,#REG_CCR)
- stdi gr26,@(gr28,#REG_LR)
- sti gr4 ,@(gr28,#REG_SYSCALLNO)
-
- movsg iacc0h,gr4
- movsg iacc0l,gr5
- stdi gr4,@(gr28,#REG_IACC0)
-
- movsg gner0,gr4
- movsg gner1,gr5
- stdi.p gr4,@(gr28,#REG_GNER0)
-
- # interrupts start off fully disabled in the interrupt handler
- subcc gr0,gr0,gr0,icc2 /* set Z and clear C */
-
- # set the return address
- sethi.p %hi(__entry_return_from_kernel_interrupt),gr4
- setlo %lo(__entry_return_from_kernel_interrupt),gr4
- movgs gr4,lr
-
- # clear power-saving mode flags
- movsg hsr0,gr4
- andi gr4,#~HSR0_PDM,gr4
- movgs gr4,hsr0
-
- # raise the minimum interrupt priority to 15 (NMI only) and enable exceptions
- movsg psr,gr4
- ori gr4,#PSR_PIL_14,gr4
- movgs gr4,psr
- ori gr4,#PSR_ET,gr4
- movgs gr4,psr
-
- LEDS 0x6212
- bra do_IRQ
-
- .size __entry_kernel_external_interrupt,.-__entry_kernel_external_interrupt
-
-###############################################################################
-#
-# deal with interrupts that were actually virtually disabled
-# - we need to really disable them, flag the fact and return immediately
-# - if you change this, you must alter break.S also
-#
-###############################################################################
- .balign L1_CACHE_BYTES
- .globl __entry_kernel_external_interrupt_virtually_disabled
- .type __entry_kernel_external_interrupt_virtually_disabled,@function
-__entry_kernel_external_interrupt_virtually_disabled:
- movsg psr,gr30
- andi gr30,#~PSR_PIL,gr30
- ori gr30,#PSR_PIL_14,gr30 ; debugging interrupts only
- movgs gr30,psr
- subcc gr0,gr0,gr0,icc2 ; leave Z set, clear C
- rett #0
-
- .size __entry_kernel_external_interrupt_virtually_disabled,.-__entry_kernel_external_interrupt_virtually_disabled
-
-###############################################################################
-#
-# deal with re-enablement of interrupts that were pending when virtually re-enabled
-# - set ICC2.C, re-enable the real interrupts and return
-# - we can clear ICC2.Z because we shouldn't be here if it's not 0 [due to TIHI]
-# - if you change this, you must alter break.S also
-#
-###############################################################################
- .balign L1_CACHE_BYTES
- .globl __entry_kernel_external_interrupt_virtual_reenable
- .type __entry_kernel_external_interrupt_virtual_reenable,@function
-__entry_kernel_external_interrupt_virtual_reenable:
- movsg psr,gr30
- andi gr30,#~PSR_PIL,gr30 ; re-enable interrupts
- movgs gr30,psr
- subicc gr0,#1,gr0,icc2 ; clear Z, set C
- rett #0
-
- .size __entry_kernel_external_interrupt_virtual_reenable,.-__entry_kernel_external_interrupt_virtual_reenable
-
-###############################################################################
-#
-# entry point for Software and Progam interrupts generated whilst executing userspace code
-#
-###############################################################################
- .globl __entry_uspace_softprog_interrupt
- .type __entry_uspace_softprog_interrupt,@function
- .globl __entry_uspace_handle_mmu_fault
-__entry_uspace_softprog_interrupt:
- LEDS 0x6000
-#ifdef CONFIG_MMU
- movsg ear0,gr28
-__entry_uspace_handle_mmu_fault:
- movgs gr28,scr2
-#endif
- sethi.p %hi(__kernel_frame0_ptr),gr28
- setlo %lo(__kernel_frame0_ptr),gr28
- ldi @(gr28,#0),gr28
-
- # handle h/w single-step through exceptions
- sti gr0,@(gr28,#REG__STATUS)
-
- .globl __entry_uspace_softprog_interrupt_reentry
-__entry_uspace_softprog_interrupt_reentry:
- LEDS 0x6001
-
- setlos #REG__END,gr30
- dcpl gr28,gr30,#0
-
- # set up the kernel stack pointer
- sti.p sp,@(gr28,#REG_SP)
- ori gr28,0,sp
- sti gr0,@(gr28,#REG_GR(28))
-
- stdi gr20,@(gr28,#REG_GR(20))
- stdi gr22,@(gr28,#REG_GR(22))
-
- movsg tbr,gr20
- movsg pcsr,gr21
- movsg psr,gr22
-
- sethi.p %hi(__entry_return_from_user_exception),gr23
- setlo %lo(__entry_return_from_user_exception),gr23
-
- bra __entry_common
-
- .size __entry_uspace_softprog_interrupt,.-__entry_uspace_softprog_interrupt
-
- # single-stepping was disabled on entry to a TLB handler that then faulted
-#ifdef CONFIG_MMU
- .globl __entry_uspace_handle_mmu_fault_sstep
-__entry_uspace_handle_mmu_fault_sstep:
- movgs gr28,scr2
- sethi.p %hi(__kernel_frame0_ptr),gr28
- setlo %lo(__kernel_frame0_ptr),gr28
- ldi @(gr28,#0),gr28
-
- # flag single-step re-enablement
- sti gr0,@(gr28,#REG__STATUS)
- bra __entry_uspace_softprog_interrupt_reentry
-#endif
-
-
-###############################################################################
-#
-# entry point for Software and Progam interrupts generated whilst executing kernel code
-#
-###############################################################################
- .globl __entry_kernel_softprog_interrupt
- .type __entry_kernel_softprog_interrupt,@function
-__entry_kernel_softprog_interrupt:
- LEDS 0x6004
-
-#ifdef CONFIG_MMU
- movsg ear0,gr30
- movgs gr30,scr2
-#endif
-
- .globl __entry_kernel_handle_mmu_fault
-__entry_kernel_handle_mmu_fault:
- # set up the stack pointer
- subi sp,#REG__END,sp
- sti sp,@(sp,#REG_SP)
- sti sp,@(sp,#REG_SP-4)
- andi sp,#~7,sp
-
- # handle h/w single-step through exceptions
- sti gr0,@(sp,#REG__STATUS)
-
- .globl __entry_kernel_softprog_interrupt_reentry
-__entry_kernel_softprog_interrupt_reentry:
- LEDS 0x6005
-
- setlos #REG__END,gr30
- dcpl sp,gr30,#0
-
- # set up the exception frame
- sti.p gr28,@(sp,#REG_GR(28))
- ori sp,0,gr28
-
- stdi gr20,@(gr28,#REG_GR(20))
- stdi gr22,@(gr28,#REG_GR(22))
-
- ldi @(sp,#REG_SP),gr22 /* reconstruct the old SP */
- addi gr22,#REG__END,gr22
- sti gr22,@(sp,#REG_SP)
-
- # set CCCR.CC3 to Undefined to abort atomic-modify completion inside the kernel
- # - for an explanation of how it works, see: Documentation/frv/atomic-ops.txt
- movsg cccr,gr20
- andi gr20,#~0xc0,gr20
- movgs gr20,cccr
-
- movsg tbr,gr20
- movsg pcsr,gr21
- movsg psr,gr22
-
- sethi.p %hi(__entry_return_from_kernel_exception),gr23
- setlo %lo(__entry_return_from_kernel_exception),gr23
- bra __entry_common
-
- .size __entry_kernel_softprog_interrupt,.-__entry_kernel_softprog_interrupt
-
- # single-stepping was disabled on entry to a TLB handler that then faulted
-#ifdef CONFIG_MMU
- .globl __entry_kernel_handle_mmu_fault_sstep
-__entry_kernel_handle_mmu_fault_sstep:
- # set up the stack pointer
- subi sp,#REG__END,sp
- sti sp,@(sp,#REG_SP)
- sti sp,@(sp,#REG_SP-4)
- andi sp,#~7,sp
-
- # flag single-step re-enablement
- sethi #REG__STATUS_STEP,gr30
- sti gr30,@(sp,#REG__STATUS)
- bra __entry_kernel_softprog_interrupt_reentry
-#endif
-
-
-###############################################################################
-#
-# the rest of the kernel entry point code
-# - on arriving here, the following registers should be set up:
-# GR1 - kernel stack pointer
-# GR7 - syscall number (trap 0 only)
-# GR8-13 - syscall args (trap 0 only)
-# GR20 - saved TBR
-# GR21 - saved PC
-# GR22 - saved PSR
-# GR23 - return handler address
-# GR28 - exception frame on stack
-# SCR2 - saved EAR0 where applicable (clobbered by ICI & ICEF insns on FR451)
-# PSR - PSR.S 1, PSR.ET 0
-#
-###############################################################################
- .globl __entry_common
- .type __entry_common,@function
-__entry_common:
- LEDS 0x6008
-
- # finish building the exception frame
- stdi gr2,@(gr28,#REG_GR(2))
- stdi gr4,@(gr28,#REG_GR(4))
- stdi gr6,@(gr28,#REG_GR(6))
- stdi gr8,@(gr28,#REG_GR(8))
- stdi gr10,@(gr28,#REG_GR(10))
- stdi gr12,@(gr28,#REG_GR(12))
- stdi gr14,@(gr28,#REG_GR(14))
- stdi gr16,@(gr28,#REG_GR(16))
- stdi gr18,@(gr28,#REG_GR(18))
- stdi gr24,@(gr28,#REG_GR(24))
- stdi gr26,@(gr28,#REG_GR(26))
- sti gr29,@(gr28,#REG_GR(29))
- stdi gr30,@(gr28,#REG_GR(30))
-
- movsg lcr ,gr27
- movsg lr ,gr26
- movgs gr23,lr
- movsg cccr,gr25
- movsg ccr ,gr24
- movsg isr ,gr23
-
- setlos.p #-1,gr4
- andi gr22,#PSR_PS,gr5 /* try to rebuild original PSR value */
- andi.p gr22,#~(PSR_PS|PSR_S),gr6
- slli gr5,#1,gr5
- or gr6,gr5,gr5
- andi gr5,#~PSR_ET,gr5
-
- sti gr20,@(gr28,#REG_TBR)
- sti gr21,@(gr28,#REG_PC)
- sti gr5 ,@(gr28,#REG_PSR)
- sti gr23,@(gr28,#REG_ISR)
- stdi gr24,@(gr28,#REG_CCR)
- stdi gr26,@(gr28,#REG_LR)
- sti gr4 ,@(gr28,#REG_SYSCALLNO)
-
- movsg iacc0h,gr4
- movsg iacc0l,gr5
- stdi gr4,@(gr28,#REG_IACC0)
-
- movsg gner0,gr4
- movsg gner1,gr5
- stdi.p gr4,@(gr28,#REG_GNER0)
-
- # set up virtual interrupt disablement
- subicc gr0,#1,gr0,icc2 /* clear Z flag, set C flag */
-
- # set up kernel global registers
- sethi.p %hi(__kernel_current_task),gr5
- setlo %lo(__kernel_current_task),gr5
- sethi.p %hi(_gp),gr16
- setlo %lo(_gp),gr16
- ldi @(gr5,#0),gr29
- ldi @(gr29,#4),gr15 ; __current_thread_info = current->thread_info
-
- # switch to the kernel trap table
- sethi.p %hi(__entry_kerneltrap_table),gr6
- setlo %lo(__entry_kerneltrap_table),gr6
- movgs gr6,tbr
-
- # make sure we (the kernel) get div-zero and misalignment exceptions
- setlos #ISR_EDE|ISR_DTT_DIVBYZERO|ISR_EMAM_EXCEPTION,gr5
- movgs gr5,isr
-
- # clear power-saving mode flags
- movsg hsr0,gr4
- andi gr4,#~HSR0_PDM,gr4
- movgs gr4,hsr0
-
- # multiplex again using old TBR as a guide
- setlos.p #TBR_TT,gr3
- sethi %hi(__entry_vector_table),gr6
- and.p gr20,gr3,gr5
- setlo %lo(__entry_vector_table),gr6
- srli gr5,#2,gr5
- ld @(gr5,gr6),gr5
-
- LEDS 0x6009
- jmpl @(gr5,gr0)
-
-
- .size __entry_common,.-__entry_common
-
-###############################################################################
-#
-# handle instruction MMU fault
-#
-###############################################################################
-#ifdef CONFIG_MMU
- .globl __entry_insn_mmu_fault
-__entry_insn_mmu_fault:
- LEDS 0x6010
- setlos #0,gr8
- movsg esr0,gr9
- movsg scr2,gr10
-
- # now that we've accessed the exception regs, we can enable exceptions
- movsg psr,gr4
- ori gr4,#PSR_ET,gr4
- movgs gr4,psr
-
- sethi.p %hi(do_page_fault),gr5
- setlo %lo(do_page_fault),gr5
- jmpl @(gr5,gr0) ; call do_page_fault(0,esr0,ear0)
-#endif
-
-
-###############################################################################
-#
-# handle instruction access error
-#
-###############################################################################
- .globl __entry_insn_access_error
-__entry_insn_access_error:
- LEDS 0x6011
- sethi.p %hi(insn_access_error),gr5
- setlo %lo(insn_access_error),gr5
- movsg esfr1,gr8
- movsg epcr0,gr9
- movsg esr0,gr10
-
- # now that we've accessed the exception regs, we can enable exceptions
- movsg psr,gr4
- ori gr4,#PSR_ET,gr4
- movgs gr4,psr
- jmpl @(gr5,gr0) ; call insn_access_error(esfr1,epcr0,esr0)
-
-###############################################################################
-#
-# handle various instructions of dubious legality
-#
-###############################################################################
- .globl __entry_unsupported_trap
- .globl __entry_illegal_instruction
- .globl __entry_privileged_instruction
- .globl __entry_debug_exception
-__entry_unsupported_trap:
- subi gr21,#4,gr21
- sti gr21,@(gr28,#REG_PC)
-__entry_illegal_instruction:
-__entry_privileged_instruction:
-__entry_debug_exception:
- LEDS 0x6012
- sethi.p %hi(illegal_instruction),gr5
- setlo %lo(illegal_instruction),gr5
- movsg esfr1,gr8
- movsg epcr0,gr9
- movsg esr0,gr10
-
- # now that we've accessed the exception regs, we can enable exceptions
- movsg psr,gr4
- ori gr4,#PSR_ET,gr4
- movgs gr4,psr
- jmpl @(gr5,gr0) ; call ill_insn(esfr1,epcr0,esr0)
-
-###############################################################################
-#
-# handle atomic operation emulation for userspace
-#
-###############################################################################
- .globl __entry_atomic_op
-__entry_atomic_op:
- LEDS 0x6012
- sethi.p %hi(atomic_operation),gr5
- setlo %lo(atomic_operation),gr5
- movsg esfr1,gr8
- movsg epcr0,gr9
- movsg esr0,gr10
-
- # now that we've accessed the exception regs, we can enable exceptions
- movsg psr,gr4
- ori gr4,#PSR_ET,gr4
- movgs gr4,psr
- jmpl @(gr5,gr0) ; call atomic_operation(esfr1,epcr0,esr0)
-
-###############################################################################
-#
-# handle media exception
-#
-###############################################################################
- .globl __entry_media_exception
-__entry_media_exception:
- LEDS 0x6013
- sethi.p %hi(media_exception),gr5
- setlo %lo(media_exception),gr5
- movsg msr0,gr8
- movsg msr1,gr9
-
- # now that we've accessed the exception regs, we can enable exceptions
- movsg psr,gr4
- ori gr4,#PSR_ET,gr4
- movgs gr4,psr
- jmpl @(gr5,gr0) ; call media_excep(msr0,msr1)
-
-###############################################################################
-#
-# handle data MMU fault
-# handle data DAT fault (write-protect exception)
-#
-###############################################################################
-#ifdef CONFIG_MMU
- .globl __entry_data_mmu_fault
-__entry_data_mmu_fault:
- .globl __entry_data_dat_fault
-__entry_data_dat_fault:
- LEDS 0x6014
- setlos #1,gr8
- movsg esr0,gr9
- movsg scr2,gr10 ; saved EAR0
-
- # now that we've accessed the exception regs, we can enable exceptions
- movsg psr,gr4
- ori gr4,#PSR_ET,gr4
- movgs gr4,psr
-
- sethi.p %hi(do_page_fault),gr5
- setlo %lo(do_page_fault),gr5
- jmpl @(gr5,gr0) ; call do_page_fault(1,esr0,ear0)
-#endif
-
-###############################################################################
-#
-# handle data and instruction access exceptions
-#
-###############################################################################
- .globl __entry_insn_access_exception
- .globl __entry_data_access_exception
-__entry_insn_access_exception:
-__entry_data_access_exception:
- LEDS 0x6016
- sethi.p %hi(memory_access_exception),gr5
- setlo %lo(memory_access_exception),gr5
- movsg esr0,gr8
- movsg scr2,gr9 ; saved EAR0
- movsg epcr0,gr10
-
- # now that we've accessed the exception regs, we can enable exceptions
- movsg psr,gr4
- ori gr4,#PSR_ET,gr4
- movgs gr4,psr
- jmpl @(gr5,gr0) ; call memory_access_error(esr0,ear0,epcr0)
-
-###############################################################################
-#
-# handle data access error
-#
-###############################################################################
- .globl __entry_data_access_error
-__entry_data_access_error:
- LEDS 0x6016
- sethi.p %hi(data_access_error),gr5
- setlo %lo(data_access_error),gr5
- movsg esfr1,gr8
- movsg esr15,gr9
- movsg ear15,gr10
-
- # now that we've accessed the exception regs, we can enable exceptions
- movsg psr,gr4
- ori gr4,#PSR_ET,gr4
- movgs gr4,psr
- jmpl @(gr5,gr0) ; call data_access_error(esfr1,esr15,ear15)
-
-###############################################################################
-#
-# handle data store error
-#
-###############################################################################
- .globl __entry_data_store_error
-__entry_data_store_error:
- LEDS 0x6017
- sethi.p %hi(data_store_error),gr5
- setlo %lo(data_store_error),gr5
- movsg esfr1,gr8
- movsg esr14,gr9
-
- # now that we've accessed the exception regs, we can enable exceptions
- movsg psr,gr4
- ori gr4,#PSR_ET,gr4
- movgs gr4,psr
- jmpl @(gr5,gr0) ; call data_store_error(esfr1,esr14)
-
-###############################################################################
-#
-# handle division exception
-#
-###############################################################################
- .globl __entry_division_exception
-__entry_division_exception:
- LEDS 0x6018
- sethi.p %hi(division_exception),gr5
- setlo %lo(division_exception),gr5
- movsg esfr1,gr8
- movsg esr0,gr9
- movsg isr,gr10
-
- # now that we've accessed the exception regs, we can enable exceptions
- movsg psr,gr4
- ori gr4,#PSR_ET,gr4
- movgs gr4,psr
- jmpl @(gr5,gr0) ; call div_excep(esfr1,esr0,isr)
-
-###############################################################################
-#
-# handle compound exception
-#
-###############################################################################
- .globl __entry_compound_exception
-__entry_compound_exception:
- LEDS 0x6019
- sethi.p %hi(compound_exception),gr5
- setlo %lo(compound_exception),gr5
- movsg esfr1,gr8
- movsg esr0,gr9
- movsg esr14,gr10
- movsg esr15,gr11
- movsg msr0,gr12
- movsg msr1,gr13
-
- # now that we've accessed the exception regs, we can enable exceptions
- movsg psr,gr4
- ori gr4,#PSR_ET,gr4
- movgs gr4,psr
- jmpl @(gr5,gr0) ; call comp_excep(esfr1,esr0,esr14,esr15,msr0,msr1)
-
-###############################################################################
-#
-# handle interrupts and NMIs
-#
-###############################################################################
- .globl __entry_do_IRQ
-__entry_do_IRQ:
- LEDS 0x6020
-
- # we can enable exceptions
- movsg psr,gr4
- ori gr4,#PSR_ET,gr4
- movgs gr4,psr
- bra do_IRQ
-
- .globl __entry_do_NMI
-__entry_do_NMI:
- LEDS 0x6021
-
- # we can enable exceptions
- movsg psr,gr4
- ori gr4,#PSR_ET,gr4
- movgs gr4,psr
- bra do_NMI
-
-###############################################################################
-#
-# the return path for a newly forked child process
-# - __switch_to() saved the old current pointer in GR8 for us
-#
-###############################################################################
- .globl ret_from_fork
-ret_from_fork:
- LEDS 0x6100
- call schedule_tail
-
- # fork & co. return 0 to child
- setlos.p #0,gr8
- bra __syscall_exit
-
- .globl ret_from_kernel_thread
-ret_from_kernel_thread:
- lddi.p @(gr28,#REG_GR(8)),gr20
- call schedule_tail
- calll.p @(gr21,gr0)
- or gr20,gr20,gr8
- bra __syscall_exit
-
-###################################################################################################
-#
-# Return to user mode is not as complex as all this looks,
-# but we want the default path for a system call return to
-# go as quickly as possible which is why some of this is
-# less clear than it otherwise should be.
-#
-###################################################################################################
- .balign L1_CACHE_BYTES
- .globl system_call
-system_call:
- LEDS 0x6101
- movsg psr,gr4 ; enable exceptions
- ori gr4,#PSR_ET,gr4
- movgs gr4,psr
-
- sti gr7,@(gr28,#REG_SYSCALLNO)
- sti.p gr8,@(gr28,#REG_ORIG_GR8)
-
- subicc gr7,#nr_syscalls,gr0,icc0
- bnc icc0,#0,__syscall_badsys
-
- ldi @(gr15,#TI_FLAGS),gr4
- andicc gr4,#_TIF_SYSCALL_TRACE,gr0,icc0
- bne icc0,#0,__syscall_trace_entry
-
-__syscall_call:
- slli.p gr7,#2,gr7
- sethi %hi(sys_call_table),gr5
- setlo %lo(sys_call_table),gr5
- ld @(gr5,gr7),gr4
- calll @(gr4,gr0)
-
-
-###############################################################################
-#
-# return to interrupted process
-#
-###############################################################################
-__syscall_exit:
- LEDS 0x6300
-
- # keep current PSR in GR23
- movsg psr,gr23
-
- ldi @(gr28,#REG_PSR),gr22
-
- sti.p gr8,@(gr28,#REG_GR(8)) ; save return value
-
- # rebuild saved psr - execve will change it for init/main.c
- srli gr22,#1,gr5
- andi.p gr22,#~PSR_PS,gr22
- andi gr5,#PSR_PS,gr5
- or gr5,gr22,gr22
- ori.p gr22,#PSR_S,gr22
-
- # make sure we don't miss an interrupt setting need_resched or sigpending between
- # sampling and the RETT
- ori gr23,#PSR_PIL_14,gr23
- movgs gr23,psr
-
- ldi @(gr15,#TI_FLAGS),gr4
- andicc gr4,#_TIF_ALLWORK_MASK,gr0,icc0
- bne icc0,#0,__syscall_exit_work
-
- # restore all registers and return
-__entry_return_direct:
- LEDS 0x6301
-
- andi gr22,#~PSR_ET,gr22
- movgs gr22,psr
-
- ldi @(gr28,#REG_ISR),gr23
- lddi @(gr28,#REG_CCR),gr24
- lddi @(gr28,#REG_LR) ,gr26
- ldi @(gr28,#REG_PC) ,gr21
- ldi @(gr28,#REG_TBR),gr20
-
- movgs gr20,tbr
- movgs gr21,pcsr
- movgs gr23,isr
- movgs gr24,ccr
- movgs gr25,cccr
- movgs gr26,lr
- movgs gr27,lcr
-
- lddi @(gr28,#REG_GNER0),gr4
- movgs gr4,gner0
- movgs gr5,gner1
-
- lddi @(gr28,#REG_IACC0),gr4
- movgs gr4,iacc0h
- movgs gr5,iacc0l
-
- lddi @(gr28,#REG_GR(4)) ,gr4
- lddi @(gr28,#REG_GR(6)) ,gr6
- lddi @(gr28,#REG_GR(8)) ,gr8
- lddi @(gr28,#REG_GR(10)),gr10
- lddi @(gr28,#REG_GR(12)),gr12
- lddi @(gr28,#REG_GR(14)),gr14
- lddi @(gr28,#REG_GR(16)),gr16
- lddi @(gr28,#REG_GR(18)),gr18
- lddi @(gr28,#REG_GR(20)),gr20
- lddi @(gr28,#REG_GR(22)),gr22
- lddi @(gr28,#REG_GR(24)),gr24
- lddi @(gr28,#REG_GR(26)),gr26
- ldi @(gr28,#REG_GR(29)),gr29
- lddi @(gr28,#REG_GR(30)),gr30
-
- # check to see if a debugging return is required
- LEDS 0x67f0
- movsg ccr,gr2
- ldi @(gr28,#REG__STATUS),gr3
- andicc gr3,#REG__STATUS_STEP,gr0,icc0
- bne icc0,#0,__entry_return_singlestep
- movgs gr2,ccr
-
- ldi @(gr28,#REG_SP) ,sp
- lddi @(gr28,#REG_GR(2)) ,gr2
- ldi @(gr28,#REG_GR(28)),gr28
-
- LEDS 0x67fe
-// movsg pcsr,gr31
-// LEDS32
-
-#if 0
- # store the current frame in the workram on the FR451
- movgs gr28,scr2
- sethi.p %hi(0xfe800000),gr28
- setlo %lo(0xfe800000),gr28
-
- stdi gr2,@(gr28,#REG_GR(2))
- stdi gr4,@(gr28,#REG_GR(4))
- stdi gr6,@(gr28,#REG_GR(6))
- stdi gr8,@(gr28,#REG_GR(8))
- stdi gr10,@(gr28,#REG_GR(10))
- stdi gr12,@(gr28,#REG_GR(12))
- stdi gr14,@(gr28,#REG_GR(14))
- stdi gr16,@(gr28,#REG_GR(16))
- stdi gr18,@(gr28,#REG_GR(18))
- stdi gr24,@(gr28,#REG_GR(24))
- stdi gr26,@(gr28,#REG_GR(26))
- sti gr29,@(gr28,#REG_GR(29))
- stdi gr30,@(gr28,#REG_GR(30))
-
- movsg tbr ,gr30
- sti gr30,@(gr28,#REG_TBR)
- movsg pcsr,gr30
- sti gr30,@(gr28,#REG_PC)
- movsg psr ,gr30
- sti gr30,@(gr28,#REG_PSR)
- movsg isr ,gr30
- sti gr30,@(gr28,#REG_ISR)
- movsg ccr ,gr30
- movsg cccr,gr31
- stdi gr30,@(gr28,#REG_CCR)
- movsg lr ,gr30
- movsg lcr ,gr31
- stdi gr30,@(gr28,#REG_LR)
- sti gr0 ,@(gr28,#REG_SYSCALLNO)
- movsg scr2,gr28
-#endif
-
- rett #0
-
- # return via break.S
-__entry_return_singlestep:
- movgs gr2,ccr
- lddi @(gr28,#REG_GR(2)) ,gr2
- ldi @(gr28,#REG_SP) ,sp
- ldi @(gr28,#REG_GR(28)),gr28
- LEDS 0x67ff
- break
- .globl __entry_return_singlestep_breaks_here
-__entry_return_singlestep_breaks_here:
- nop
-
-
-###############################################################################
-#
-# return to a process interrupted in kernel space
-# - we need to consider preemption if that is enabled
-#
-###############################################################################
- .balign L1_CACHE_BYTES
-__entry_return_from_kernel_exception:
- LEDS 0x6302
- movsg psr,gr23
- ori gr23,#PSR_PIL_14,gr23
- movgs gr23,psr
- bra __entry_return_direct
-
- .balign L1_CACHE_BYTES
-__entry_return_from_kernel_interrupt:
- LEDS 0x6303
- movsg psr,gr23
- ori gr23,#PSR_PIL_14,gr23
- movgs gr23,psr
-
-#ifdef CONFIG_PREEMPT
- ldi @(gr15,#TI_PRE_COUNT),gr5
- subicc gr5,#0,gr0,icc0
- beq icc0,#0,__entry_return_direct
-
- subcc gr0,gr0,gr0,icc2 /* set Z and clear C */
- call preempt_schedule_irq
-#endif
- bra __entry_return_direct
-
-
-###############################################################################
-#
-# perform work that needs to be done immediately before resumption
-#
-###############################################################################
- .globl __entry_return_from_user_exception
- .balign L1_CACHE_BYTES
-__entry_return_from_user_exception:
- LEDS 0x6501
-
-__entry_resume_userspace:
- # make sure we don't miss an interrupt setting need_resched or sigpending between
- # sampling and the RETT
- movsg psr,gr23
- ori gr23,#PSR_PIL_14,gr23
- movgs gr23,psr
-
-__entry_return_from_user_interrupt:
- LEDS 0x6402
- ldi @(gr15,#TI_FLAGS),gr4
- andicc gr4,#_TIF_WORK_MASK,gr0,icc0
- beq icc0,#1,__entry_return_direct
-
-__entry_work_pending:
- LEDS 0x6404
- andicc gr4,#_TIF_NEED_RESCHED,gr0,icc0
- beq icc0,#1,__entry_work_notifysig
-
-__entry_work_resched:
- LEDS 0x6408
- movsg psr,gr23
- andi gr23,#~PSR_PIL,gr23
- movgs gr23,psr
- call schedule
- movsg psr,gr23
- ori gr23,#PSR_PIL_14,gr23
- movgs gr23,psr
-
- LEDS 0x6401
- ldi @(gr15,#TI_FLAGS),gr4
- andicc gr4,#_TIF_WORK_MASK,gr0,icc0
- beq icc0,#1,__entry_return_direct
- andicc gr4,#_TIF_NEED_RESCHED,gr0,icc0
- bne icc0,#1,__entry_work_resched
-
-__entry_work_notifysig:
- LEDS 0x6410
- ori.p gr4,#0,gr8
- call do_notify_resume
- bra __entry_resume_userspace
-
- # perform syscall entry tracing
-__syscall_trace_entry:
- LEDS 0x6320
- call syscall_trace_entry
-
- lddi.p @(gr28,#REG_GR(8)) ,gr8
- ori gr8,#0,gr7 ; syscall_trace_entry() returned new syscallno
- lddi @(gr28,#REG_GR(10)),gr10
- lddi.p @(gr28,#REG_GR(12)),gr12
-
- subicc gr7,#nr_syscalls,gr0,icc0
- bnc icc0,#0,__syscall_badsys
- bra __syscall_call
-
- # perform syscall exit tracing
-__syscall_exit_work:
- LEDS 0x6340
- andicc gr22,#PSR_PS,gr0,icc1 ; don't handle on return to kernel mode
- andicc.p gr4,#_TIF_SYSCALL_TRACE,gr0,icc0
- bne icc1,#0,__entry_return_direct
- beq icc0,#1,__entry_work_pending
-
- movsg psr,gr23
- andi gr23,#~PSR_PIL,gr23 ; could let syscall_trace_exit() call schedule()
- movgs gr23,psr
-
- call syscall_trace_exit
- bra __entry_resume_userspace
-
-__syscall_badsys:
- LEDS 0x6380
- setlos #-ENOSYS,gr8
- sti gr8,@(gr28,#REG_GR(8)) ; save return value
- bra __entry_resume_userspace
-
-
-###############################################################################
-#
-# syscall vector table
-#
-###############################################################################
- .section .rodata
-ALIGN
- .globl sys_call_table
-sys_call_table:
- .long sys_restart_syscall /* 0 - old "setup()" system call, used for restarting */
- .long sys_exit
- .long sys_fork
- .long sys_read
- .long sys_write
- .long sys_open /* 5 */
- .long sys_close
- .long sys_waitpid
- .long sys_creat
- .long sys_link
- .long sys_unlink /* 10 */
- .long sys_execve
- .long sys_chdir
- .long sys_time
- .long sys_mknod
- .long sys_chmod /* 15 */
- .long sys_lchown16
- .long sys_ni_syscall /* old break syscall holder */
- .long sys_stat
- .long sys_lseek
- .long sys_getpid /* 20 */
- .long sys_mount
- .long sys_oldumount
- .long sys_setuid16
- .long sys_getuid16
- .long sys_ni_syscall // sys_stime /* 25 */
- .long sys_ptrace
- .long sys_alarm
- .long sys_fstat
- .long sys_pause
- .long sys_utime /* 30 */
- .long sys_ni_syscall /* old stty syscall holder */
- .long sys_ni_syscall /* old gtty syscall holder */
- .long sys_access
- .long sys_nice
- .long sys_ni_syscall /* 35 */ /* old ftime syscall holder */
- .long sys_sync
- .long sys_kill
- .long sys_rename
- .long sys_mkdir
- .long sys_rmdir /* 40 */
- .long sys_dup
- .long sys_pipe
- .long sys_times
- .long sys_ni_syscall /* old prof syscall holder */
- .long sys_brk /* 45 */
- .long sys_setgid16
- .long sys_getgid16
- .long sys_ni_syscall // sys_signal
- .long sys_geteuid16
- .long sys_getegid16 /* 50 */
- .long sys_acct
- .long sys_umount /* recycled never used phys( */
- .long sys_ni_syscall /* old lock syscall holder */
- .long sys_ioctl
- .long sys_fcntl /* 55 */
- .long sys_ni_syscall /* old mpx syscall holder */
- .long sys_setpgid
- .long sys_ni_syscall /* old ulimit syscall holder */
- .long sys_ni_syscall /* old old uname syscall */
- .long sys_umask /* 60 */
- .long sys_chroot
- .long sys_ustat
- .long sys_dup2
- .long sys_getppid
- .long sys_getpgrp /* 65 */
- .long sys_setsid
- .long sys_sigaction
- .long sys_ni_syscall // sys_sgetmask
- .long sys_ni_syscall // sys_ssetmask
- .long sys_setreuid16 /* 70 */
- .long sys_setregid16
- .long sys_sigsuspend
- .long sys_ni_syscall // sys_sigpending
- .long sys_sethostname
- .long sys_setrlimit /* 75 */
- .long sys_ni_syscall // sys_old_getrlimit
- .long sys_getrusage
- .long sys_gettimeofday
- .long sys_settimeofday
- .long sys_getgroups16 /* 80 */
- .long sys_setgroups16
- .long sys_ni_syscall /* old_select slot */
- .long sys_symlink
- .long sys_lstat
- .long sys_readlink /* 85 */
- .long sys_uselib
- .long sys_swapon
- .long sys_reboot
- .long sys_ni_syscall // old_readdir
- .long sys_ni_syscall /* 90 */ /* old_mmap slot */
- .long sys_munmap
- .long sys_truncate
- .long sys_ftruncate
- .long sys_fchmod
- .long sys_fchown16 /* 95 */
- .long sys_getpriority
- .long sys_setpriority
- .long sys_ni_syscall /* old profil syscall holder */
- .long sys_statfs
- .long sys_fstatfs /* 100 */
- .long sys_ni_syscall /* ioperm for i386 */
- .long sys_socketcall
- .long sys_syslog
- .long sys_setitimer
- .long sys_getitimer /* 105 */
- .long sys_newstat
- .long sys_newlstat
- .long sys_newfstat
- .long sys_ni_syscall /* obsolete olduname( syscall */
- .long sys_ni_syscall /* iopl for i386 */ /* 110 */
- .long sys_vhangup
- .long sys_ni_syscall /* obsolete idle( syscall */
- .long sys_ni_syscall /* vm86old for i386 */
- .long sys_wait4
- .long sys_swapoff /* 115 */
- .long sys_sysinfo
- .long sys_ipc
- .long sys_fsync
- .long sys_sigreturn
- .long sys_clone /* 120 */
- .long sys_setdomainname
- .long sys_newuname
- .long sys_ni_syscall /* old "cacheflush" */
- .long sys_adjtimex
- .long sys_mprotect /* 125 */
- .long sys_sigprocmask
- .long sys_ni_syscall /* old "create_module" */
- .long sys_init_module
- .long sys_delete_module
- .long sys_ni_syscall /* old "get_kernel_syms" */
- .long sys_quotactl
- .long sys_getpgid
- .long sys_fchdir
- .long sys_bdflush
- .long sys_sysfs /* 135 */
- .long sys_personality
- .long sys_ni_syscall /* for afs_syscall */
- .long sys_setfsuid16
- .long sys_setfsgid16
- .long sys_llseek /* 140 */
- .long sys_getdents
- .long sys_select
- .long sys_flock
- .long sys_msync
- .long sys_readv /* 145 */
- .long sys_writev
- .long sys_getsid
- .long sys_fdatasync
- .long sys_sysctl
- .long sys_mlock /* 150 */
- .long sys_munlock
- .long sys_mlockall
- .long sys_munlockall
- .long sys_sched_setparam
- .long sys_sched_getparam /* 155 */
- .long sys_sched_setscheduler
- .long sys_sched_getscheduler
- .long sys_sched_yield
- .long sys_sched_get_priority_max
- .long sys_sched_get_priority_min /* 160 */
- .long sys_sched_rr_get_interval
- .long sys_nanosleep
- .long sys_mremap
- .long sys_setresuid16
- .long sys_getresuid16 /* 165 */
- .long sys_ni_syscall /* for vm86 */
- .long sys_ni_syscall /* Old sys_query_module */
- .long sys_poll
- .long sys_ni_syscall /* Old nfsservctl */
- .long sys_setresgid16 /* 170 */
- .long sys_getresgid16
- .long sys_prctl
- .long sys_rt_sigreturn
- .long sys_rt_sigaction
- .long sys_rt_sigprocmask /* 175 */
- .long sys_rt_sigpending
- .long sys_rt_sigtimedwait
- .long sys_rt_sigqueueinfo
- .long sys_rt_sigsuspend
- .long sys_pread64 /* 180 */
- .long sys_pwrite64
- .long sys_chown16
- .long sys_getcwd
- .long sys_capget
- .long sys_capset /* 185 */
- .long sys_sigaltstack
- .long sys_sendfile
- .long sys_ni_syscall /* streams1 */
- .long sys_ni_syscall /* streams2 */
- .long sys_vfork /* 190 */
- .long sys_getrlimit
- .long sys_mmap2
- .long sys_truncate64
- .long sys_ftruncate64
- .long sys_stat64 /* 195 */
- .long sys_lstat64
- .long sys_fstat64
- .long sys_lchown
- .long sys_getuid
- .long sys_getgid /* 200 */
- .long sys_geteuid
- .long sys_getegid
- .long sys_setreuid
- .long sys_setregid
- .long sys_getgroups /* 205 */
- .long sys_setgroups
- .long sys_fchown
- .long sys_setresuid
- .long sys_getresuid
- .long sys_setresgid /* 210 */
- .long sys_getresgid
- .long sys_chown
- .long sys_setuid
- .long sys_setgid
- .long sys_setfsuid /* 215 */
- .long sys_setfsgid
- .long sys_pivot_root
- .long sys_mincore
- .long sys_madvise
- .long sys_getdents64 /* 220 */
- .long sys_fcntl64
- .long sys_ni_syscall /* reserved for TUX */
- .long sys_ni_syscall /* Reserved for Security */
- .long sys_gettid
- .long sys_readahead /* 225 */
- .long sys_setxattr
- .long sys_lsetxattr
- .long sys_fsetxattr
- .long sys_getxattr
- .long sys_lgetxattr /* 230 */
- .long sys_fgetxattr
- .long sys_listxattr
- .long sys_llistxattr
- .long sys_flistxattr
- .long sys_removexattr /* 235 */
- .long sys_lremovexattr
- .long sys_fremovexattr
- .long sys_tkill
- .long sys_sendfile64
- .long sys_futex /* 240 */
- .long sys_sched_setaffinity
- .long sys_sched_getaffinity
- .long sys_ni_syscall //sys_set_thread_area
- .long sys_ni_syscall //sys_get_thread_area
- .long sys_io_setup /* 245 */
- .long sys_io_destroy
- .long sys_io_getevents
- .long sys_io_submit
- .long sys_io_cancel
- .long sys_fadvise64 /* 250 */
- .long sys_ni_syscall
- .long sys_exit_group
- .long sys_lookup_dcookie
- .long sys_epoll_create
- .long sys_epoll_ctl /* 255 */
- .long sys_epoll_wait
- .long sys_remap_file_pages
- .long sys_set_tid_address
- .long sys_timer_create
- .long sys_timer_settime /* 260 */
- .long sys_timer_gettime
- .long sys_timer_getoverrun
- .long sys_timer_delete
- .long sys_clock_settime
- .long sys_clock_gettime /* 265 */
- .long sys_clock_getres
- .long sys_clock_nanosleep
- .long sys_statfs64
- .long sys_fstatfs64
- .long sys_tgkill /* 270 */
- .long sys_utimes
- .long sys_fadvise64_64
- .long sys_ni_syscall /* sys_vserver */
- .long sys_mbind
- .long sys_get_mempolicy
- .long sys_set_mempolicy
- .long sys_mq_open
- .long sys_mq_unlink
- .long sys_mq_timedsend
- .long sys_mq_timedreceive /* 280 */
- .long sys_mq_notify
- .long sys_mq_getsetattr
- .long sys_ni_syscall /* reserved for kexec */
- .long sys_waitid
- .long sys_ni_syscall /* 285 */ /* available */
- .long sys_add_key
- .long sys_request_key
- .long sys_keyctl
- .long sys_ioprio_set
- .long sys_ioprio_get /* 290 */
- .long sys_inotify_init
- .long sys_inotify_add_watch
- .long sys_inotify_rm_watch
- .long sys_migrate_pages
- .long sys_openat /* 295 */
- .long sys_mkdirat
- .long sys_mknodat
- .long sys_fchownat
- .long sys_futimesat
- .long sys_fstatat64 /* 300 */
- .long sys_unlinkat
- .long sys_renameat
- .long sys_linkat
- .long sys_symlinkat
- .long sys_readlinkat /* 305 */
- .long sys_fchmodat
- .long sys_faccessat
- .long sys_pselect6
- .long sys_ppoll
- .long sys_unshare /* 310 */
- .long sys_set_robust_list
- .long sys_get_robust_list
- .long sys_splice
- .long sys_sync_file_range
- .long sys_tee /* 315 */
- .long sys_vmsplice
- .long sys_move_pages
- .long sys_getcpu
- .long sys_epoll_pwait
- .long sys_utimensat /* 320 */
- .long sys_signalfd
- .long sys_timerfd_create
- .long sys_eventfd
- .long sys_fallocate
- .long sys_timerfd_settime /* 325 */
- .long sys_timerfd_gettime
- .long sys_signalfd4
- .long sys_eventfd2
- .long sys_epoll_create1
- .long sys_dup3 /* 330 */
- .long sys_pipe2
- .long sys_inotify_init1
- .long sys_preadv
- .long sys_pwritev
- .long sys_rt_tgsigqueueinfo /* 335 */
- .long sys_perf_event_open
- .long sys_setns
-
-syscall_table_size = (. - sys_call_table)
diff --git a/arch/frv/kernel/frv_ksyms.c b/arch/frv/kernel/frv_ksyms.c
deleted file mode 100644
index 6ea430d58149..000000000000
--- a/arch/frv/kernel/frv_ksyms.c
+++ /dev/null
@@ -1,109 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-#include <linux/module.h>
-#include <linux/linkage.h>
-#include <linux/sched.h>
-#include <linux/string.h>
-#include <linux/mm.h>
-#include <linux/user.h>
-#include <linux/elfcore.h>
-#include <linux/in6.h>
-#include <linux/interrupt.h>
-
-#include <asm/setup.h>
-#include <asm/pgalloc.h>
-#include <asm/irq.h>
-#include <asm/io.h>
-#include <asm/checksum.h>
-#include <asm/hardirq.h>
-#include <asm/cacheflush.h>
-
-extern long __memcpy_user(void *dst, const void *src, size_t count);
-extern long __memset_user(void *dst, const void *src, size_t count);
-
-/* platform dependent support */
-
-EXPORT_SYMBOL(__ioremap);
-EXPORT_SYMBOL(iounmap);
-
-EXPORT_SYMBOL(ip_fast_csum);
-
-#if 0
-EXPORT_SYMBOL(local_irq_count);
-EXPORT_SYMBOL(local_bh_count);
-#endif
-
-EXPORT_SYMBOL(__res_bus_clock_speed_HZ);
-EXPORT_SYMBOL(__page_offset);
-EXPORT_SYMBOL(__memcpy_user);
-EXPORT_SYMBOL(__memset_user);
-EXPORT_SYMBOL(frv_dcache_writeback);
-EXPORT_SYMBOL(frv_cache_invalidate);
-EXPORT_SYMBOL(frv_icache_invalidate);
-EXPORT_SYMBOL(frv_cache_wback_inv);
-
-#ifndef CONFIG_MMU
-EXPORT_SYMBOL(memory_start);
-EXPORT_SYMBOL(memory_end);
-#endif
-
-EXPORT_SYMBOL(__debug_bug_trap);
-
-/* The following are special because they're not called
- explicitly (the C compiler generates them). Fortunately,
- their interface isn't gonna change any time soon now, so
- it's OK to leave it out of version control. */
-EXPORT_SYMBOL(memcpy);
-EXPORT_SYMBOL(memset);
-
-EXPORT_SYMBOL(__outsl_ns);
-EXPORT_SYMBOL(__insl_ns);
-
-#ifdef CONFIG_FRV_OUTOFLINE_ATOMIC_OPS
-EXPORT_SYMBOL(__xchg_32);
-EXPORT_SYMBOL(__cmpxchg_32);
-#endif
-EXPORT_SYMBOL(atomic64_add_return);
-EXPORT_SYMBOL(atomic64_sub_return);
-EXPORT_SYMBOL(__xchg_64);
-EXPORT_SYMBOL(__cmpxchg_64);
-
-EXPORT_SYMBOL(__debug_bug_printk);
-EXPORT_SYMBOL(__delay_loops_MHz);
-
-/*
- * libgcc functions - functions that are used internally by the
- * compiler... (prototypes are not correct though, but that
- * doesn't really matter since they're not versioned).
- */
-extern void __gcc_bcmp(void);
-extern void __ashldi3(void);
-extern void __ashrdi3(void);
-extern void __cmpdi2(void);
-extern void __divdi3(void);
-extern void __lshrdi3(void);
-extern void __moddi3(void);
-extern void __muldi3(void);
-extern void __mulll(void);
-extern void __umulll(void);
-extern void __negdi2(void);
-extern void __ucmpdi2(void);
-extern void __udivdi3(void);
-extern void __udivmoddi4(void);
-extern void __umoddi3(void);
-
- /* gcc lib functions */
-//EXPORT_SYMBOL(__gcc_bcmp);
-EXPORT_SYMBOL(__ashldi3);
-EXPORT_SYMBOL(__ashrdi3);
-//EXPORT_SYMBOL(__cmpdi2);
-//EXPORT_SYMBOL(__divdi3);
-EXPORT_SYMBOL(__lshrdi3);
-//EXPORT_SYMBOL(__moddi3);
-EXPORT_SYMBOL(__muldi3);
-EXPORT_SYMBOL(__mulll);
-EXPORT_SYMBOL(__umulll);
-EXPORT_SYMBOL(__negdi2);
-EXPORT_SYMBOL(__ucmpdi2);
-//EXPORT_SYMBOL(__udivdi3);
-//EXPORT_SYMBOL(__udivmoddi4);
-//EXPORT_SYMBOL(__umoddi3);
diff --git a/arch/frv/kernel/futex.c b/arch/frv/kernel/futex.c
deleted file mode 100644
index 37f7b2bf7f73..000000000000
--- a/arch/frv/kernel/futex.c
+++ /dev/null
@@ -1,223 +0,0 @@
-/* futex.c: futex operations
- *
- * Copyright (C) 2005 Red Hat, Inc. All Rights Reserved.
- * Written by David Howells (dhowells@redhat.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.
- */
-
-#include <linux/futex.h>
-#include <linux/uaccess.h>
-#include <asm/futex.h>
-#include <asm/errno.h>
-
-/*
- * the various futex operations; MMU fault checking is ignored under no-MMU
- * conditions
- */
-static inline int atomic_futex_op_xchg_set(int oparg, u32 __user *uaddr, int *_oldval)
-{
- int oldval, ret;
-
- asm("0: \n"
- " orcc gr0,gr0,gr0,icc3 \n" /* set ICC3.Z */
- " ckeq icc3,cc7 \n"
- "1: ld.p %M0,%1 \n" /* LD.P/ORCR must be atomic */
- " orcr cc7,cc7,cc3 \n" /* set CC3 to true */
- "2: cst.p %3,%M0 ,cc3,#1 \n"
- " corcc gr29,gr29,gr0 ,cc3,#1 \n" /* clear ICC3.Z if store happens */
- " beq icc3,#0,0b \n"
- " setlos 0,%2 \n"
- "3: \n"
- ".subsection 2 \n"
- "4: setlos %5,%2 \n"
- " bra 3b \n"
- ".previous \n"
- ".section __ex_table,\"a\" \n"
- " .balign 8 \n"
- " .long 1b,4b \n"
- " .long 2b,4b \n"
- ".previous"
- : "+U"(*uaddr), "=&r"(oldval), "=&r"(ret), "=r"(oparg)
- : "3"(oparg), "i"(-EFAULT)
- : "memory", "cc7", "cc3", "icc3"
- );
-
- *_oldval = oldval;
- return ret;
-}
-
-static inline int atomic_futex_op_xchg_add(int oparg, u32 __user *uaddr, int *_oldval)
-{
- int oldval, ret;
-
- asm("0: \n"
- " orcc gr0,gr0,gr0,icc3 \n" /* set ICC3.Z */
- " ckeq icc3,cc7 \n"
- "1: ld.p %M0,%1 \n" /* LD.P/ORCR must be atomic */
- " orcr cc7,cc7,cc3 \n" /* set CC3 to true */
- " add %1,%3,%3 \n"
- "2: cst.p %3,%M0 ,cc3,#1 \n"
- " corcc gr29,gr29,gr0 ,cc3,#1 \n" /* clear ICC3.Z if store happens */
- " beq icc3,#0,0b \n"
- " setlos 0,%2 \n"
- "3: \n"
- ".subsection 2 \n"
- "4: setlos %5,%2 \n"
- " bra 3b \n"
- ".previous \n"
- ".section __ex_table,\"a\" \n"
- " .balign 8 \n"
- " .long 1b,4b \n"
- " .long 2b,4b \n"
- ".previous"
- : "+U"(*uaddr), "=&r"(oldval), "=&r"(ret), "=r"(oparg)
- : "3"(oparg), "i"(-EFAULT)
- : "memory", "cc7", "cc3", "icc3"
- );
-
- *_oldval = oldval;
- return ret;
-}
-
-static inline int atomic_futex_op_xchg_or(int oparg, u32 __user *uaddr, int *_oldval)
-{
- int oldval, ret;
-
- asm("0: \n"
- " orcc gr0,gr0,gr0,icc3 \n" /* set ICC3.Z */
- " ckeq icc3,cc7 \n"
- "1: ld.p %M0,%1 \n" /* LD.P/ORCR must be atomic */
- " orcr cc7,cc7,cc3 \n" /* set CC3 to true */
- " or %1,%3,%3 \n"
- "2: cst.p %3,%M0 ,cc3,#1 \n"
- " corcc gr29,gr29,gr0 ,cc3,#1 \n" /* clear ICC3.Z if store happens */
- " beq icc3,#0,0b \n"
- " setlos 0,%2 \n"
- "3: \n"
- ".subsection 2 \n"
- "4: setlos %5,%2 \n"
- " bra 3b \n"
- ".previous \n"
- ".section __ex_table,\"a\" \n"
- " .balign 8 \n"
- " .long 1b,4b \n"
- " .long 2b,4b \n"
- ".previous"
- : "+U"(*uaddr), "=&r"(oldval), "=&r"(ret), "=r"(oparg)
- : "3"(oparg), "i"(-EFAULT)
- : "memory", "cc7", "cc3", "icc3"
- );
-
- *_oldval = oldval;
- return ret;
-}
-
-static inline int atomic_futex_op_xchg_and(int oparg, u32 __user *uaddr, int *_oldval)
-{
- int oldval, ret;
-
- asm("0: \n"
- " orcc gr0,gr0,gr0,icc3 \n" /* set ICC3.Z */
- " ckeq icc3,cc7 \n"
- "1: ld.p %M0,%1 \n" /* LD.P/ORCR must be atomic */
- " orcr cc7,cc7,cc3 \n" /* set CC3 to true */
- " and %1,%3,%3 \n"
- "2: cst.p %3,%M0 ,cc3,#1 \n"
- " corcc gr29,gr29,gr0 ,cc3,#1 \n" /* clear ICC3.Z if store happens */
- " beq icc3,#0,0b \n"
- " setlos 0,%2 \n"
- "3: \n"
- ".subsection 2 \n"
- "4: setlos %5,%2 \n"
- " bra 3b \n"
- ".previous \n"
- ".section __ex_table,\"a\" \n"
- " .balign 8 \n"
- " .long 1b,4b \n"
- " .long 2b,4b \n"
- ".previous"
- : "+U"(*uaddr), "=&r"(oldval), "=&r"(ret), "=r"(oparg)
- : "3"(oparg), "i"(-EFAULT)
- : "memory", "cc7", "cc3", "icc3"
- );
-
- *_oldval = oldval;
- return ret;
-}
-
-static inline int atomic_futex_op_xchg_xor(int oparg, u32 __user *uaddr, int *_oldval)
-{
- int oldval, ret;
-
- asm("0: \n"
- " orcc gr0,gr0,gr0,icc3 \n" /* set ICC3.Z */
- " ckeq icc3,cc7 \n"
- "1: ld.p %M0,%1 \n" /* LD.P/ORCR must be atomic */
- " orcr cc7,cc7,cc3 \n" /* set CC3 to true */
- " xor %1,%3,%3 \n"
- "2: cst.p %3,%M0 ,cc3,#1 \n"
- " corcc gr29,gr29,gr0 ,cc3,#1 \n" /* clear ICC3.Z if store happens */
- " beq icc3,#0,0b \n"
- " setlos 0,%2 \n"
- "3: \n"
- ".subsection 2 \n"
- "4: setlos %5,%2 \n"
- " bra 3b \n"
- ".previous \n"
- ".section __ex_table,\"a\" \n"
- " .balign 8 \n"
- " .long 1b,4b \n"
- " .long 2b,4b \n"
- ".previous"
- : "+U"(*uaddr), "=&r"(oldval), "=&r"(ret), "=r"(oparg)
- : "3"(oparg), "i"(-EFAULT)
- : "memory", "cc7", "cc3", "icc3"
- );
-
- *_oldval = oldval;
- return ret;
-}
-
-/*****************************************************************************/
-/*
- * do the futex operations
- */
-int arch_futex_atomic_op_inuser(int op, int oparg, int *oval, u32 __user *uaddr)
-{
- int oldval = 0, ret;
-
- pagefault_disable();
-
- switch (op) {
- case FUTEX_OP_SET:
- ret = atomic_futex_op_xchg_set(oparg, uaddr, &oldval);
- break;
- case FUTEX_OP_ADD:
- ret = atomic_futex_op_xchg_add(oparg, uaddr, &oldval);
- break;
- case FUTEX_OP_OR:
- ret = atomic_futex_op_xchg_or(oparg, uaddr, &oldval);
- break;
- case FUTEX_OP_ANDN:
- ret = atomic_futex_op_xchg_and(~oparg, uaddr, &oldval);
- break;
- case FUTEX_OP_XOR:
- ret = atomic_futex_op_xchg_xor(oparg, uaddr, &oldval);
- break;
- default:
- ret = -ENOSYS;
- break;
- }
-
- pagefault_enable();
-
- if (!ret)
- *oval = oldval;
-
- return ret;
-
-} /* end arch_futex_atomic_op_inuser() */
diff --git a/arch/frv/kernel/gdb-io.c b/arch/frv/kernel/gdb-io.c
deleted file mode 100644
index 0707d35079ba..000000000000
--- a/arch/frv/kernel/gdb-io.c
+++ /dev/null
@@ -1,215 +0,0 @@
-/* gdb-io.c: FR403 GDB stub I/O
- *
- * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved.
- * Written by David Howells (dhowells@redhat.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.
- */
-
-#include <linux/string.h>
-#include <linux/kernel.h>
-#include <linux/signal.h>
-#include <linux/sched.h>
-#include <linux/mm.h>
-#include <linux/console.h>
-#include <linux/init.h>
-#include <linux/serial_reg.h>
-
-#include <asm/pgtable.h>
-#include <asm/irc-regs.h>
-#include <asm/timer-regs.h>
-#include <asm/gdb-stub.h>
-#include "gdb-io.h"
-
-#ifdef CONFIG_GDBSTUB_UART0
-#define __UART(X) (*(volatile uint8_t *)(UART0_BASE + (UART_##X)))
-#define __UART_IRR_NMI 0xff0f0000
-#else /* CONFIG_GDBSTUB_UART1 */
-#define __UART(X) (*(volatile uint8_t *)(UART1_BASE + (UART_##X)))
-#define __UART_IRR_NMI 0xfff00000
-#endif
-
-#define LSR_WAIT_FOR(STATE) \
-do { \
- gdbstub_do_rx(); \
-} while (!(__UART(LSR) & UART_LSR_##STATE))
-
-#define FLOWCTL_QUERY(LINE) ({ __UART(MSR) & UART_MSR_##LINE; })
-#define FLOWCTL_CLEAR(LINE) do { __UART(MCR) &= ~UART_MCR_##LINE; mb(); } while (0)
-#define FLOWCTL_SET(LINE) do { __UART(MCR) |= UART_MCR_##LINE; mb(); } while (0)
-
-#define FLOWCTL_WAIT_FOR(LINE) \
-do { \
- gdbstub_do_rx(); \
-} while(!FLOWCTL_QUERY(LINE))
-
-/*****************************************************************************/
-/*
- * initialise the GDB stub
- * - called with PSR.ET==0, so can't incur external interrupts
- */
-void gdbstub_io_init(void)
-{
- /* set up the serial port */
- __UART(LCR) = UART_LCR_WLEN8; /* 1N8 */
- __UART(FCR) =
- UART_FCR_ENABLE_FIFO |
- UART_FCR_CLEAR_RCVR |
- UART_FCR_CLEAR_XMIT |
- UART_FCR_TRIGGER_1;
-
- FLOWCTL_CLEAR(DTR);
- FLOWCTL_SET(RTS);
-
-// gdbstub_set_baud(115200);
-
- /* we want to get serial receive interrupts */
- __UART(IER) = UART_IER_RDI | UART_IER_RLSI;
- mb();
-
- __set_IRR(6, __UART_IRR_NMI); /* map ERRs and UARTx to NMI */
-
-} /* end gdbstub_io_init() */
-
-/*****************************************************************************/
-/*
- * set up the GDB stub serial port baud rate timers
- */
-void gdbstub_set_baud(unsigned baud)
-{
- unsigned value, high, low;
- u8 lcr;
-
- /* work out the divisor to give us the nearest higher baud rate */
- value = __serial_clock_speed_HZ / 16 / baud;
-
- /* determine the baud rate range */
- high = __serial_clock_speed_HZ / 16 / value;
- low = __serial_clock_speed_HZ / 16 / (value + 1);
-
- /* pick the nearest bound */
- if (low + (high - low) / 2 > baud)
- value++;
-
- lcr = __UART(LCR);
- __UART(LCR) |= UART_LCR_DLAB;
- mb();
- __UART(DLL) = value & 0xff;
- __UART(DLM) = (value >> 8) & 0xff;
- mb();
- __UART(LCR) = lcr;
- mb();
-
-} /* end gdbstub_set_baud() */
-
-/*****************************************************************************/
-/*
- * receive characters into the receive FIFO
- */
-void gdbstub_do_rx(void)
-{
- unsigned ix, nix;
-
- ix = gdbstub_rx_inp;
-
- while (__UART(LSR) & UART_LSR_DR) {
- nix = (ix + 2) & 0xfff;
- if (nix == gdbstub_rx_outp)
- break;
-
- gdbstub_rx_buffer[ix++] = __UART(LSR);
- gdbstub_rx_buffer[ix++] = __UART(RX);
- ix = nix;
- }
-
- gdbstub_rx_inp = ix;
-
- __clr_RC(15);
- __clr_IRL();
-
-} /* end gdbstub_do_rx() */
-
-/*****************************************************************************/
-/*
- * wait for a character to come from the debugger
- */
-int gdbstub_rx_char(unsigned char *_ch, int nonblock)
-{
- unsigned ix;
- u8 ch, st;
-
- *_ch = 0xff;
-
- if (gdbstub_rx_unget) {
- *_ch = gdbstub_rx_unget;
- gdbstub_rx_unget = 0;
- return 0;
- }
-
- try_again:
- gdbstub_do_rx();
-
- /* pull chars out of the buffer */
- ix = gdbstub_rx_outp;
- if (ix == gdbstub_rx_inp) {
- if (nonblock)
- return -EAGAIN;
- //watchdog_alert_counter = 0;
- goto try_again;
- }
-
- st = gdbstub_rx_buffer[ix++];
- ch = gdbstub_rx_buffer[ix++];
- gdbstub_rx_outp = ix & 0x00000fff;
-
- if (st & UART_LSR_BI) {
- gdbstub_proto("### GDB Rx Break Detected ###\n");
- return -EINTR;
- }
- else if (st & (UART_LSR_FE|UART_LSR_OE|UART_LSR_PE)) {
- gdbstub_io("### GDB Rx Error (st=%02x) ###\n",st);
- return -EIO;
- }
- else {
- gdbstub_io("### GDB Rx %02x (st=%02x) ###\n",ch,st);
- *_ch = ch & 0x7f;
- return 0;
- }
-
-} /* end gdbstub_rx_char() */
-
-/*****************************************************************************/
-/*
- * send a character to the debugger
- */
-void gdbstub_tx_char(unsigned char ch)
-{
- FLOWCTL_SET(DTR);
- LSR_WAIT_FOR(THRE);
-// FLOWCTL_WAIT_FOR(CTS);
-
- if (ch == 0x0a) {
- __UART(TX) = 0x0d;
- mb();
- LSR_WAIT_FOR(THRE);
-// FLOWCTL_WAIT_FOR(CTS);
- }
- __UART(TX) = ch;
- mb();
-
- FLOWCTL_CLEAR(DTR);
-} /* end gdbstub_tx_char() */
-
-/*****************************************************************************/
-/*
- * send a character to the debugger
- */
-void gdbstub_tx_flush(void)
-{
- LSR_WAIT_FOR(TEMT);
- LSR_WAIT_FOR(THRE);
- FLOWCTL_CLEAR(DTR);
-} /* end gdbstub_tx_flush() */
diff --git a/arch/frv/kernel/gdb-io.h b/arch/frv/kernel/gdb-io.h
deleted file mode 100644
index 138714bacc40..000000000000
--- a/arch/frv/kernel/gdb-io.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* gdb-io.h: FR403 GDB I/O port defs
- *
- * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved.
- * Written by David Howells (dhowells@redhat.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.
- */
-
-#ifndef _GDB_IO_H
-#define _GDB_IO_H
-
-#include <asm/serial-regs.h>
-
-#undef UART_RX
-#undef UART_TX
-#undef UART_DLL
-#undef UART_DLM
-#undef UART_IER
-#undef UART_IIR
-#undef UART_FCR
-#undef UART_LCR
-#undef UART_MCR
-#undef UART_LSR
-#undef UART_MSR
-#undef UART_SCR
-
-#define UART_RX 0*8 /* In: Receive buffer (DLAB=0) */
-#define UART_TX 0*8 /* Out: Transmit buffer (DLAB=0) */
-#define UART_DLL 0*8 /* Out: Divisor Latch Low (DLAB=1) */
-#define UART_DLM 1*8 /* Out: Divisor Latch High (DLAB=1) */
-#define UART_IER 1*8 /* Out: Interrupt Enable Register */
-#define UART_IIR 2*8 /* In: Interrupt ID Register */
-#define UART_FCR 2*8 /* Out: FIFO Control Register */
-#define UART_LCR 3*8 /* Out: Line Control Register */
-#define UART_MCR 4*8 /* Out: Modem Control Register */
-#define UART_LSR 5*8 /* In: Line Status Register */
-#define UART_MSR 6*8 /* In: Modem Status Register */
-#define UART_SCR 7*8 /* I/O: Scratch Register */
-
-#define UART_LCR_DLAB 0x80 /* Divisor latch access bit */
-#define UART_LCR_SBC 0x40 /* Set break control */
-#define UART_LCR_SPAR 0x20 /* Stick parity (?) */
-#define UART_LCR_EPAR 0x10 /* Even parity select */
-#define UART_LCR_PARITY 0x08 /* Parity Enable */
-#define UART_LCR_STOP 0x04 /* Stop bits: 0=1 stop bit, 1= 2 stop bits */
-#define UART_LCR_WLEN5 0x00 /* Wordlength: 5 bits */
-#define UART_LCR_WLEN6 0x01 /* Wordlength: 6 bits */
-#define UART_LCR_WLEN7 0x02 /* Wordlength: 7 bits */
-#define UART_LCR_WLEN8 0x03 /* Wordlength: 8 bits */
-
-
-#endif /* _GDB_IO_H */
diff --git a/arch/frv/kernel/gdb-stub.c b/arch/frv/kernel/gdb-stub.c
deleted file mode 100644
index bbe78b0bffec..000000000000
--- a/arch/frv/kernel/gdb-stub.c
+++ /dev/null
@@ -1,2149 +0,0 @@
-/* gdb-stub.c: FRV GDB stub
- *
- * Copyright (C) 2003,4 Red Hat, Inc. All Rights Reserved.
- * Written by David Howells (dhowells@redhat.com)
- * - Derived from Linux/MIPS version, Copyright (C) 1995 Andreas Busse
- *
- * 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.
- */
-
-/*
- * To enable debugger support, two things need to happen. One, a
- * call to set_debug_traps() is necessary in order to allow any breakpoints
- * or error conditions to be properly intercepted and reported to gdb.
- * Two, a breakpoint needs to be generated to begin communication. This
- * is most easily accomplished by a call to breakpoint(). Breakpoint()
- * simulates a breakpoint by executing a BREAK instruction.
- *
- *
- * The following gdb commands are supported:
- *
- * command function Return value
- *
- * g return the value of the CPU registers hex data or ENN
- * G set the value of the CPU registers OK or ENN
- *
- * mAA..AA,LLLL Read LLLL bytes at address AA..AA hex data or ENN
- * MAA..AA,LLLL: Write LLLL bytes at address AA.AA OK or ENN
- *
- * c Resume at current address SNN ( signal NN)
- * cAA..AA Continue at address AA..AA SNN
- *
- * s Step one instruction SNN
- * sAA..AA Step one instruction from AA..AA SNN
- *
- * k kill
- *
- * ? What was the last sigval ? SNN (signal NN)
- *
- * bBB..BB Set baud rate to BB..BB OK or BNN, then sets
- * baud rate
- *
- * All commands and responses are sent with a packet which includes a
- * checksum. A packet consists of
- *
- * $<packet info>#<checksum>.
- *
- * where
- * <packet info> :: <characters representing the command or response>
- * <checksum> :: < two hex digits computed as modulo 256 sum of <packetinfo>>
- *
- * When a packet is received, it is first acknowledged with either '+' or '-'.
- * '+' indicates a successful transfer. '-' indicates a failed transfer.
- *
- * Example:
- *
- * Host: Reply:
- * $m0,10#2a +$00010203040506070809101112131415#42
- *
- *
- * ==============
- * MORE EXAMPLES:
- * ==============
- *
- * For reference -- the following are the steps that one
- * company took (RidgeRun Inc) to get remote gdb debugging
- * going. In this scenario the host machine was a PC and the
- * target platform was a Galileo EVB64120A MIPS evaluation
- * board.
- *
- * Step 1:
- * First download gdb-5.0.tar.gz from the internet.
- * and then build/install the package.
- *
- * Example:
- * $ tar zxf gdb-5.0.tar.gz
- * $ cd gdb-5.0
- * $ ./configure --target=frv-elf-gdb
- * $ make
- * $ frv-elf-gdb
- *
- * Step 2:
- * Configure linux for remote debugging and build it.
- *
- * Example:
- * $ cd ~/linux
- * $ make menuconfig <go to "Kernel Hacking" and turn on remote debugging>
- * $ make vmlinux
- *
- * Step 3:
- * Download the kernel to the remote target and start
- * the kernel running. It will promptly halt and wait
- * for the host gdb session to connect. It does this
- * since the "Kernel Hacking" option has defined
- * CONFIG_REMOTE_DEBUG which in turn enables your calls
- * to:
- * set_debug_traps();
- * breakpoint();
- *
- * Step 4:
- * Start the gdb session on the host.
- *
- * Example:
- * $ frv-elf-gdb vmlinux
- * (gdb) set remotebaud 115200
- * (gdb) target remote /dev/ttyS1
- * ...at this point you are connected to
- * the remote target and can use gdb
- * in the normal fasion. Setting
- * breakpoints, single stepping,
- * printing variables, etc.
- *
- */
-
-#include <linux/string.h>
-#include <linux/kernel.h>
-#include <linux/signal.h>
-#include <linux/sched.h>
-#include <linux/mm.h>
-#include <linux/console.h>
-#include <linux/init.h>
-#include <linux/slab.h>
-#include <linux/nmi.h>
-
-#include <asm/asm-offsets.h>
-#include <asm/pgtable.h>
-#include <asm/gdb-stub.h>
-
-#define LEDS(x) do { /* *(u32*)0xe1200004 = ~(x); mb(); */ } while(0)
-
-#undef GDBSTUB_DEBUG_PROTOCOL
-
-extern void debug_to_serial(const char *p, int n);
-extern void gdbstub_console_write(struct console *co, const char *p, unsigned n);
-
-extern volatile uint32_t __break_error_detect[3]; /* ESFR1, ESR15, EAR15 */
-
-struct __debug_amr {
- unsigned long L, P;
-} __attribute__((aligned(8)));
-
-struct __debug_mmu {
- struct {
- unsigned long hsr0, pcsr, esr0, ear0, epcr0;
-#ifdef CONFIG_MMU
- unsigned long tplr, tppr, tpxr, cxnr;
-#endif
- } regs;
-
- struct __debug_amr iamr[16];
- struct __debug_amr damr[16];
-
-#ifdef CONFIG_MMU
- struct __debug_amr tlb[64*2];
-#endif
-};
-
-static struct __debug_mmu __debug_mmu;
-
-/*
- * BUFMAX defines the maximum number of characters in inbound/outbound buffers
- * at least NUMREGBYTES*2 are needed for register packets
- */
-#define BUFMAX 2048
-
-#define BREAK_INSN 0x801000c0 /* use "break" as bkpt */
-
-static const char gdbstub_banner[] = "Linux/FR-V GDB Stub (c) RedHat 2003\n";
-
-volatile u8 gdbstub_rx_buffer[PAGE_SIZE] __attribute__((aligned(PAGE_SIZE)));
-volatile u32 gdbstub_rx_inp = 0;
-volatile u32 gdbstub_rx_outp = 0;
-volatile u8 gdbstub_rx_overflow = 0;
-u8 gdbstub_rx_unget = 0;
-
-/* set with GDB whilst running to permit step through exceptions */
-extern volatile u32 __attribute__((section(".bss"))) gdbstub_trace_through_exceptions;
-
-static char input_buffer[BUFMAX];
-static char output_buffer[BUFMAX];
-
-static const char *regnames[] = {
- "PSR ", "ISR ", "CCR ", "CCCR",
- "LR ", "LCR ", "PC ", "_stt",
- "sys ", "GR8*", "GNE0", "GNE1",
- "IACH", "IACL",
- "TBR ", "SP ", "FP ", "GR3 ",
- "GR4 ", "GR5 ", "GR6 ", "GR7 ",
- "GR8 ", "GR9 ", "GR10", "GR11",
- "GR12", "GR13", "GR14", "GR15",
- "GR16", "GR17", "GR18", "GR19",
- "GR20", "GR21", "GR22", "GR23",
- "GR24", "GR25", "GR26", "GR27",
- "EFRM", "CURR", "GR30", "BFRM"
-};
-
-struct gdbstub_bkpt {
- unsigned long addr; /* address of breakpoint */
- unsigned len; /* size of breakpoint */
- uint32_t originsns[7]; /* original instructions */
-};
-
-static struct gdbstub_bkpt gdbstub_bkpts[256];
-
-/*
- * local prototypes
- */
-
-static void gdbstub_recv_packet(char *buffer);
-static int gdbstub_send_packet(char *buffer);
-static int gdbstub_compute_signal(unsigned long tbr);
-static int hex(unsigned char ch);
-static int hexToInt(char **ptr, unsigned long *intValue);
-static unsigned char *mem2hex(const void *mem, char *buf, int count, int may_fault);
-static char *hex2mem(const char *buf, void *_mem, int count);
-
-/*
- * Convert ch from a hex digit to an int
- */
-static int hex(unsigned char ch)
-{
- if (ch >= 'a' && ch <= 'f')
- return ch-'a'+10;
- if (ch >= '0' && ch <= '9')
- return ch-'0';
- if (ch >= 'A' && ch <= 'F')
- return ch-'A'+10;
- return -1;
-}
-
-void gdbstub_printk(const char *fmt, ...)
-{
- static char buf[1024];
- va_list args;
- int len;
-
- /* Emit the output into the temporary buffer */
- va_start(args, fmt);
- len = vsnprintf(buf, sizeof(buf), fmt, args);
- va_end(args);
- debug_to_serial(buf, len);
-}
-
-static inline char *gdbstub_strcpy(char *dst, const char *src)
-{
- int loop = 0;
- while ((dst[loop] = src[loop]))
- loop++;
- return dst;
-}
-
-static void gdbstub_purge_cache(void)
-{
- asm volatile(" dcef @(gr0,gr0),#1 \n"
- " icei @(gr0,gr0),#1 \n"
- " membar \n"
- " bar \n"
- );
-}
-
-/*****************************************************************************/
-/*
- * scan for the sequence $<data>#<checksum>
- */
-static void gdbstub_recv_packet(char *buffer)
-{
- unsigned char checksum;
- unsigned char xmitcsum;
- unsigned char ch;
- int count, i, ret, error;
-
- for (;;) {
- /* wait around for the start character, ignore all other characters */
- do {
- gdbstub_rx_char(&ch, 0);
- } while (ch != '$');
-
- checksum = 0;
- xmitcsum = -1;
- count = 0;
- error = 0;
-
- /* now, read until a # or end of buffer is found */
- while (count < BUFMAX) {
- ret = gdbstub_rx_char(&ch, 0);
- if (ret < 0)
- error = ret;
-
- if (ch == '#')
- break;
- checksum += ch;
- buffer[count] = ch;
- count++;
- }
-
- if (error == -EIO) {
- gdbstub_proto("### GDB Rx Error - Skipping packet ###\n");
- gdbstub_proto("### GDB Tx NAK\n");
- gdbstub_tx_char('-');
- continue;
- }
-
- if (count >= BUFMAX || error)
- continue;
-
- buffer[count] = 0;
-
- /* read the checksum */
- ret = gdbstub_rx_char(&ch, 0);
- if (ret < 0)
- error = ret;
- xmitcsum = hex(ch) << 4;
-
- ret = gdbstub_rx_char(&ch, 0);
- if (ret < 0)
- error = ret;
- xmitcsum |= hex(ch);
-
- if (error) {
- if (error == -EIO)
- gdbstub_proto("### GDB Rx Error - Skipping packet\n");
- gdbstub_proto("### GDB Tx NAK\n");
- gdbstub_tx_char('-');
- continue;
- }
-
- /* check the checksum */
- if (checksum != xmitcsum) {
- gdbstub_proto("### GDB Tx NAK\n");
- gdbstub_tx_char('-'); /* failed checksum */
- continue;
- }
-
- gdbstub_proto("### GDB Rx '$%s#%02x' ###\n", buffer, checksum);
- gdbstub_proto("### GDB Tx ACK\n");
- gdbstub_tx_char('+'); /* successful transfer */
-
- /* if a sequence char is present, reply the sequence ID */
- if (buffer[2] == ':') {
- gdbstub_tx_char(buffer[0]);
- gdbstub_tx_char(buffer[1]);
-
- /* remove sequence chars from buffer */
- count = 0;
- while (buffer[count]) count++;
- for (i=3; i <= count; i++)
- buffer[i - 3] = buffer[i];
- }
-
- break;
- }
-} /* end gdbstub_recv_packet() */
-
-/*****************************************************************************/
-/*
- * send the packet in buffer.
- * - return 0 if successfully ACK'd
- * - return 1 if abandoned due to new incoming packet
- */
-static int gdbstub_send_packet(char *buffer)
-{
- unsigned char checksum;
- int count;
- unsigned char ch;
-
- /* $<packet info>#<checksum> */
- gdbstub_proto("### GDB Tx '%s' ###\n", buffer);
-
- do {
- gdbstub_tx_char('$');
- checksum = 0;
- count = 0;
-
- while ((ch = buffer[count]) != 0) {
- gdbstub_tx_char(ch);
- checksum += ch;
- count += 1;
- }
-
- gdbstub_tx_char('#');
- gdbstub_tx_char(hex_asc_hi(checksum));
- gdbstub_tx_char(hex_asc_lo(checksum));
-
- } while (gdbstub_rx_char(&ch,0),
-#ifdef GDBSTUB_DEBUG_PROTOCOL
- ch=='-' && (gdbstub_proto("### GDB Rx NAK\n"),0),
- ch!='-' && ch!='+' && (gdbstub_proto("### GDB Rx ??? %02x\n",ch),0),
-#endif
- ch!='+' && ch!='$');
-
- if (ch=='+') {
- gdbstub_proto("### GDB Rx ACK\n");
- return 0;
- }
-
- gdbstub_proto("### GDB Tx Abandoned\n");
- gdbstub_rx_unget = ch;
- return 1;
-} /* end gdbstub_send_packet() */
-
-/*
- * While we find nice hex chars, build an int.
- * Return number of chars processed.
- */
-static int hexToInt(char **ptr, unsigned long *_value)
-{
- int count = 0, ch;
-
- *_value = 0;
- while (**ptr) {
- ch = hex(**ptr);
- if (ch < 0)
- break;
-
- *_value = (*_value << 4) | ((uint8_t) ch & 0xf);
- count++;
-
- (*ptr)++;
- }
-
- return count;
-}
-
-/*****************************************************************************/
-/*
- * probe an address to see whether it maps to anything
- */
-static inline int gdbstub_addr_probe(const void *vaddr)
-{
-#ifdef CONFIG_MMU
- unsigned long paddr;
-
- asm("lrad %1,%0,#1,#0,#0" : "=r"(paddr) : "r"(vaddr));
- if (!(paddr & xAMPRx_V))
- return 0;
-#endif
-
- return 1;
-} /* end gdbstub_addr_probe() */
-
-#ifdef CONFIG_MMU
-static unsigned long __saved_dampr, __saved_damlr;
-
-static inline unsigned long gdbstub_virt_to_pte(unsigned long vaddr)
-{
- pgd_t *pgd;
- pud_t *pud;
- pmd_t *pmd;
- pte_t *pte;
- unsigned long val, dampr5;
-
- pgd = (pgd_t *) __get_DAMLR(3) + pgd_index(vaddr);
- pud = pud_offset(pgd, vaddr);
- pmd = pmd_offset(pud, vaddr);
-
- if (pmd_bad(*pmd) || !pmd_present(*pmd))
- return 0;
-
- /* make sure dampr5 maps to the correct pmd */
- dampr5 = __get_DAMPR(5);
- val = pmd_val(*pmd);
- __set_DAMPR(5, val | xAMPRx_L | xAMPRx_SS_16Kb | xAMPRx_S | xAMPRx_C | xAMPRx_V);
-
- /* now its safe to access pmd */
- pte = (pte_t *)__get_DAMLR(5) + __pte_index(vaddr);
- if (pte_present(*pte))
- val = pte_val(*pte);
- else
- val = 0;
-
- /* restore original dampr5 */
- __set_DAMPR(5, dampr5);
-
- return val;
-}
-#endif
-
-static inline int gdbstub_addr_map(const void *vaddr)
-{
-#ifdef CONFIG_MMU
- unsigned long pte;
-
- __saved_dampr = __get_DAMPR(2);
- __saved_damlr = __get_DAMLR(2);
-#endif
- if (gdbstub_addr_probe(vaddr))
- return 1;
-#ifdef CONFIG_MMU
- pte = gdbstub_virt_to_pte((unsigned long) vaddr);
- if (pte) {
- __set_DAMPR(2, pte);
- __set_DAMLR(2, (unsigned long) vaddr & PAGE_MASK);
- return 1;
- }
-#endif
- return 0;
-}
-
-static inline void gdbstub_addr_unmap(void)
-{
-#ifdef CONFIG_MMU
- __set_DAMPR(2, __saved_dampr);
- __set_DAMLR(2, __saved_damlr);
-#endif
-}
-
-/*
- * access potentially dodgy memory through a potentially dodgy pointer
- */
-static inline int gdbstub_read_dword(const void *addr, uint32_t *_res)
-{
- unsigned long brr;
- uint32_t res;
-
- if (!gdbstub_addr_map(addr))
- return 0;
-
- asm volatile(" movgs gr0,brr \n"
- " ld%I2 %M2,%0 \n"
- " movsg brr,%1 \n"
- : "=r"(res), "=r"(brr)
- : "m"(*(uint32_t *) addr));
- *_res = res;
- gdbstub_addr_unmap();
- return likely(!brr);
-}
-
-static inline int gdbstub_write_dword(void *addr, uint32_t val)
-{
- unsigned long brr;
-
- if (!gdbstub_addr_map(addr))
- return 0;
-
- asm volatile(" movgs gr0,brr \n"
- " st%I2 %1,%M2 \n"
- " movsg brr,%0 \n"
- : "=r"(brr)
- : "r"(val), "m"(*(uint32_t *) addr));
- gdbstub_addr_unmap();
- return likely(!brr);
-}
-
-static inline int gdbstub_read_word(const void *addr, uint16_t *_res)
-{
- unsigned long brr;
- uint16_t res;
-
- if (!gdbstub_addr_map(addr))
- return 0;
-
- asm volatile(" movgs gr0,brr \n"
- " lduh%I2 %M2,%0 \n"
- " movsg brr,%1 \n"
- : "=r"(res), "=r"(brr)
- : "m"(*(uint16_t *) addr));
- *_res = res;
- gdbstub_addr_unmap();
- return likely(!brr);
-}
-
-static inline int gdbstub_write_word(void *addr, uint16_t val)
-{
- unsigned long brr;
-
- if (!gdbstub_addr_map(addr))
- return 0;
-
- asm volatile(" movgs gr0,brr \n"
- " sth%I2 %1,%M2 \n"
- " movsg brr,%0 \n"
- : "=r"(brr)
- : "r"(val), "m"(*(uint16_t *) addr));
- gdbstub_addr_unmap();
- return likely(!brr);
-}
-
-static inline int gdbstub_read_byte(const void *addr, uint8_t *_res)
-{
- unsigned long brr;
- uint8_t res;
-
- if (!gdbstub_addr_map(addr))
- return 0;
-
- asm volatile(" movgs gr0,brr \n"
- " ldub%I2 %M2,%0 \n"
- " movsg brr,%1 \n"
- : "=r"(res), "=r"(brr)
- : "m"(*(uint8_t *) addr));
- *_res = res;
- gdbstub_addr_unmap();
- return likely(!brr);
-}
-
-static inline int gdbstub_write_byte(void *addr, uint8_t val)
-{
- unsigned long brr;
-
- if (!gdbstub_addr_map(addr))
- return 0;
-
- asm volatile(" movgs gr0,brr \n"
- " stb%I2 %1,%M2 \n"
- " movsg brr,%0 \n"
- : "=r"(brr)
- : "r"(val), "m"(*(uint8_t *) addr));
- gdbstub_addr_unmap();
- return likely(!brr);
-}
-
-static void __gdbstub_console_write(struct console *co, const char *p, unsigned n)
-{
- char outbuf[26];
- int qty;
-
- outbuf[0] = 'O';
-
- while (n > 0) {
- qty = 1;
-
- while (n > 0 && qty < 20) {
- mem2hex(p, outbuf + qty, 2, 0);
- qty += 2;
- if (*p == 0x0a) {
- outbuf[qty++] = '0';
- outbuf[qty++] = 'd';
- }
- p++;
- n--;
- }
-
- outbuf[qty] = 0;
- gdbstub_send_packet(outbuf);
- }
-}
-
-#if 0
-void debug_to_serial(const char *p, int n)
-{
- gdbstub_console_write(NULL,p,n);
-}
-#endif
-
-#ifdef CONFIG_GDB_CONSOLE
-
-static struct console gdbstub_console = {
- .name = "gdb",
- .write = gdbstub_console_write, /* in break.S */
- .flags = CON_PRINTBUFFER,
- .index = -1,
-};
-
-#endif
-
-/*****************************************************************************/
-/*
- * Convert the memory pointed to by mem into hex, placing result in buf.
- * - if successful, return a pointer to the last char put in buf (NUL)
- * - in case of mem fault, return NULL
- * may_fault is non-zero if we are reading from arbitrary memory, but is currently
- * not used.
- */
-static unsigned char *mem2hex(const void *_mem, char *buf, int count, int may_fault)
-{
- const uint8_t *mem = _mem;
- uint8_t ch[4] __attribute__((aligned(4)));
-
- if ((uint32_t)mem&1 && count>=1) {
- if (!gdbstub_read_byte(mem,ch))
- return NULL;
- buf = hex_byte_pack(buf, ch[0]);
- mem++;
- count--;
- }
-
- if ((uint32_t)mem&3 && count>=2) {
- if (!gdbstub_read_word(mem,(uint16_t *)ch))
- return NULL;
- buf = hex_byte_pack(buf, ch[0]);
- buf = hex_byte_pack(buf, ch[1]);
- mem += 2;
- count -= 2;
- }
-
- while (count>=4) {
- if (!gdbstub_read_dword(mem,(uint32_t *)ch))
- return NULL;
- buf = hex_byte_pack(buf, ch[0]);
- buf = hex_byte_pack(buf, ch[1]);
- buf = hex_byte_pack(buf, ch[2]);
- buf = hex_byte_pack(buf, ch[3]);
- mem += 4;
- count -= 4;
- }
-
- if (count>=2) {
- if (!gdbstub_read_word(mem,(uint16_t *)ch))
- return NULL;
- buf = hex_byte_pack(buf, ch[0]);
- buf = hex_byte_pack(buf, ch[1]);
- mem += 2;
- count -= 2;
- }
-
- if (count>=1) {
- if (!gdbstub_read_byte(mem,ch))
- return NULL;
- buf = hex_byte_pack(buf, ch[0]);
- }
-
- *buf = 0;
-
- return buf;
-} /* end mem2hex() */
-
-/*****************************************************************************/
-/*
- * convert the hex array pointed to by buf into binary to be placed in mem
- * return a pointer to the character AFTER the last byte of buffer consumed
- */
-static char *hex2mem(const char *buf, void *_mem, int count)
-{
- uint8_t *mem = _mem;
- union {
- uint32_t l;
- uint16_t w;
- uint8_t b[4];
- } ch;
-
- if ((u32)mem&1 && count>=1) {
- ch.b[0] = hex(*buf++) << 4;
- ch.b[0] |= hex(*buf++);
- if (!gdbstub_write_byte(mem,ch.b[0]))
- return NULL;
- mem++;
- count--;
- }
-
- if ((u32)mem&3 && count>=2) {
- ch.b[0] = hex(*buf++) << 4;
- ch.b[0] |= hex(*buf++);
- ch.b[1] = hex(*buf++) << 4;
- ch.b[1] |= hex(*buf++);
- if (!gdbstub_write_word(mem,ch.w))
- return NULL;
- mem += 2;
- count -= 2;
- }
-
- while (count>=4) {
- ch.b[0] = hex(*buf++) << 4;
- ch.b[0] |= hex(*buf++);
- ch.b[1] = hex(*buf++) << 4;
- ch.b[1] |= hex(*buf++);
- ch.b[2] = hex(*buf++) << 4;
- ch.b[2] |= hex(*buf++);
- ch.b[3] = hex(*buf++) << 4;
- ch.b[3] |= hex(*buf++);
- if (!gdbstub_write_dword(mem,ch.l))
- return NULL;
- mem += 4;
- count -= 4;
- }
-
- if (count>=2) {
- ch.b[0] = hex(*buf++) << 4;
- ch.b[0] |= hex(*buf++);
- ch.b[1] = hex(*buf++) << 4;
- ch.b[1] |= hex(*buf++);
- if (!gdbstub_write_word(mem,ch.w))
- return NULL;
- mem += 2;
- count -= 2;
- }
-
- if (count>=1) {
- ch.b[0] = hex(*buf++) << 4;
- ch.b[0] |= hex(*buf++);
- if (!gdbstub_write_byte(mem,ch.b[0]))
- return NULL;
- }
-
- return (char *) buf;
-} /* end hex2mem() */
-
-/*****************************************************************************/
-/*
- * This table contains the mapping between FRV TBR.TT exception codes,
- * and signals, which are primarily what GDB understands. It also
- * indicates which hardware traps we need to commandeer when
- * initializing the stub.
- */
-static const struct brr_to_sig_map {
- unsigned long brr_mask; /* BRR bitmask */
- unsigned long tbr_tt; /* TBR.TT code (in BRR.EBTT) */
- unsigned int signo; /* Signal that we map this into */
-} brr_to_sig_map[] = {
- { BRR_EB, TBR_TT_INSTR_ACC_ERROR, SIGSEGV },
- { BRR_EB, TBR_TT_ILLEGAL_INSTR, SIGILL },
- { BRR_EB, TBR_TT_PRIV_INSTR, SIGILL },
- { BRR_EB, TBR_TT_MP_EXCEPTION, SIGFPE },
- { BRR_EB, TBR_TT_DATA_ACC_ERROR, SIGSEGV },
- { BRR_EB, TBR_TT_DATA_STR_ERROR, SIGSEGV },
- { BRR_EB, TBR_TT_DIVISION_EXCEP, SIGFPE },
- { BRR_EB, TBR_TT_COMPOUND_EXCEP, SIGSEGV },
- { BRR_EB, TBR_TT_INTERRUPT_13, SIGALRM }, /* watchdog */
- { BRR_EB, TBR_TT_INTERRUPT_14, SIGINT }, /* GDB serial */
- { BRR_EB, TBR_TT_INTERRUPT_15, SIGQUIT }, /* NMI */
- { BRR_CB, 0, SIGUSR1 },
- { BRR_TB, 0, SIGUSR2 },
- { BRR_DBNEx, 0, SIGTRAP },
- { BRR_DBx, 0, SIGTRAP }, /* h/w watchpoint */
- { BRR_IBx, 0, SIGTRAP }, /* h/w breakpoint */
- { BRR_CBB, 0, SIGTRAP },
- { BRR_SB, 0, SIGTRAP },
- { BRR_ST, 0, SIGTRAP }, /* single step */
- { 0, 0, SIGHUP } /* default */
-};
-
-/*****************************************************************************/
-/*
- * convert the FRV BRR register contents into a UNIX signal number
- */
-static inline int gdbstub_compute_signal(unsigned long brr)
-{
- const struct brr_to_sig_map *map;
- unsigned long tbr = (brr & BRR_EBTT) >> 12;
-
- for (map = brr_to_sig_map; map->brr_mask; map++)
- if (map->brr_mask & brr)
- if (!map->tbr_tt || map->tbr_tt == tbr)
- break;
-
- return map->signo;
-} /* end gdbstub_compute_signal() */
-
-/*****************************************************************************/
-/*
- * set a software breakpoint or a hardware breakpoint or watchpoint
- */
-static int gdbstub_set_breakpoint(unsigned long type, unsigned long addr, unsigned long len)
-{
- unsigned long tmp;
- int bkpt, loop, xloop;
-
- union {
- struct {
- unsigned long mask0, mask1;
- };
- uint8_t bytes[8];
- } dbmr;
-
- //gdbstub_printk("setbkpt(%ld,%08lx,%ld)\n", type, addr, len);
-
- switch (type) {
- /* set software breakpoint */
- case 0:
- if (addr & 3 || len > 7*4)
- return -EINVAL;
-
- for (bkpt = 255; bkpt >= 0; bkpt--)
- if (!gdbstub_bkpts[bkpt].addr)
- break;
- if (bkpt < 0)
- return -ENOSPC;
-
- for (loop = 0; loop < len/4; loop++)
- if (!gdbstub_read_dword(&((uint32_t *) addr)[loop],
- &gdbstub_bkpts[bkpt].originsns[loop]))
- return -EFAULT;
-
- for (loop = 0; loop < len/4; loop++)
- if (!gdbstub_write_dword(&((uint32_t *) addr)[loop],
- BREAK_INSN)
- ) {
- /* need to undo the changes if possible */
- for (xloop = 0; xloop < loop; xloop++)
- gdbstub_write_dword(&((uint32_t *) addr)[xloop],
- gdbstub_bkpts[bkpt].originsns[xloop]);
- return -EFAULT;
- }
-
- gdbstub_bkpts[bkpt].addr = addr;
- gdbstub_bkpts[bkpt].len = len;
-
-#if 0
- gdbstub_printk("Set BKPT[%02x]: %08lx #%d {%04x, %04x} -> { %04x, %04x }\n",
- bkpt,
- gdbstub_bkpts[bkpt].addr,
- gdbstub_bkpts[bkpt].len,
- gdbstub_bkpts[bkpt].originsns[0],
- gdbstub_bkpts[bkpt].originsns[1],
- ((uint32_t *) addr)[0],
- ((uint32_t *) addr)[1]
- );
-#endif
- return 0;
-
- /* set hardware breakpoint */
- case 1:
- if (addr & 3 || len != 4)
- return -EINVAL;
-
- if (!(__debug_regs->dcr & DCR_IBE0)) {
- //gdbstub_printk("set h/w break 0: %08lx\n", addr);
- __debug_regs->dcr |= DCR_IBE0;
- __debug_regs->ibar[0] = addr;
- asm volatile("movgs %0,ibar0" : : "r"(addr));
- return 0;
- }
-
- if (!(__debug_regs->dcr & DCR_IBE1)) {
- //gdbstub_printk("set h/w break 1: %08lx\n", addr);
- __debug_regs->dcr |= DCR_IBE1;
- __debug_regs->ibar[1] = addr;
- asm volatile("movgs %0,ibar1" : : "r"(addr));
- return 0;
- }
-
- if (!(__debug_regs->dcr & DCR_IBE2)) {
- //gdbstub_printk("set h/w break 2: %08lx\n", addr);
- __debug_regs->dcr |= DCR_IBE2;
- __debug_regs->ibar[2] = addr;
- asm volatile("movgs %0,ibar2" : : "r"(addr));
- return 0;
- }
-
- if (!(__debug_regs->dcr & DCR_IBE3)) {
- //gdbstub_printk("set h/w break 3: %08lx\n", addr);
- __debug_regs->dcr |= DCR_IBE3;
- __debug_regs->ibar[3] = addr;
- asm volatile("movgs %0,ibar3" : : "r"(addr));
- return 0;
- }
-
- return -ENOSPC;
-
- /* set data read/write/access watchpoint */
- case 2:
- case 3:
- case 4:
- if ((addr & ~7) != ((addr + len - 1) & ~7))
- return -EINVAL;
-
- tmp = addr & 7;
-
- memset(dbmr.bytes, 0xff, sizeof(dbmr.bytes));
- for (loop = 0; loop < len; loop++)
- dbmr.bytes[tmp + loop] = 0;
-
- addr &= ~7;
-
- if (!(__debug_regs->dcr & (DCR_DRBE0|DCR_DWBE0))) {
- //gdbstub_printk("set h/w watchpoint 0 type %ld: %08lx\n", type, addr);
- tmp = type==2 ? DCR_DWBE0 : type==3 ? DCR_DRBE0 : DCR_DRBE0|DCR_DWBE0;
-
- __debug_regs->dcr |= tmp;
- __debug_regs->dbar[0] = addr;
- __debug_regs->dbmr[0][0] = dbmr.mask0;
- __debug_regs->dbmr[0][1] = dbmr.mask1;
- __debug_regs->dbdr[0][0] = 0;
- __debug_regs->dbdr[0][1] = 0;
-
- asm volatile(" movgs %0,dbar0 \n"
- " movgs %1,dbmr00 \n"
- " movgs %2,dbmr01 \n"
- " movgs gr0,dbdr00 \n"
- " movgs gr0,dbdr01 \n"
- : : "r"(addr), "r"(dbmr.mask0), "r"(dbmr.mask1));
- return 0;
- }
-
- if (!(__debug_regs->dcr & (DCR_DRBE1|DCR_DWBE1))) {
- //gdbstub_printk("set h/w watchpoint 1 type %ld: %08lx\n", type, addr);
- tmp = type==2 ? DCR_DWBE1 : type==3 ? DCR_DRBE1 : DCR_DRBE1|DCR_DWBE1;
-
- __debug_regs->dcr |= tmp;
- __debug_regs->dbar[1] = addr;
- __debug_regs->dbmr[1][0] = dbmr.mask0;
- __debug_regs->dbmr[1][1] = dbmr.mask1;
- __debug_regs->dbdr[1][0] = 0;
- __debug_regs->dbdr[1][1] = 0;
-
- asm volatile(" movgs %0,dbar1 \n"
- " movgs %1,dbmr10 \n"
- " movgs %2,dbmr11 \n"
- " movgs gr0,dbdr10 \n"
- " movgs gr0,dbdr11 \n"
- : : "r"(addr), "r"(dbmr.mask0), "r"(dbmr.mask1));
- return 0;
- }
-
- return -ENOSPC;
-
- default:
- return -EINVAL;
- }
-
-} /* end gdbstub_set_breakpoint() */
-
-/*****************************************************************************/
-/*
- * clear a breakpoint or watchpoint
- */
-int gdbstub_clear_breakpoint(unsigned long type, unsigned long addr, unsigned long len)
-{
- unsigned long tmp;
- int bkpt, loop;
-
- union {
- struct {
- unsigned long mask0, mask1;
- };
- uint8_t bytes[8];
- } dbmr;
-
- //gdbstub_printk("clearbkpt(%ld,%08lx,%ld)\n", type, addr, len);
-
- switch (type) {
- /* clear software breakpoint */
- case 0:
- for (bkpt = 255; bkpt >= 0; bkpt--)
- if (gdbstub_bkpts[bkpt].addr == addr && gdbstub_bkpts[bkpt].len == len)
- break;
- if (bkpt < 0)
- return -ENOENT;
-
- gdbstub_bkpts[bkpt].addr = 0;
-
- for (loop = 0; loop < len/4; loop++)
- if (!gdbstub_write_dword(&((uint32_t *) addr)[loop],
- gdbstub_bkpts[bkpt].originsns[loop]))
- return -EFAULT;
- return 0;
-
- /* clear hardware breakpoint */
- case 1:
- if (addr & 3 || len != 4)
- return -EINVAL;
-
-#define __get_ibar(X) ({ unsigned long x; asm volatile("movsg ibar"#X",%0" : "=r"(x)); x; })
-
- if (__debug_regs->dcr & DCR_IBE0 && __get_ibar(0) == addr) {
- //gdbstub_printk("clear h/w break 0: %08lx\n", addr);
- __debug_regs->dcr &= ~DCR_IBE0;
- __debug_regs->ibar[0] = 0;
- asm volatile("movgs gr0,ibar0");
- return 0;
- }
-
- if (__debug_regs->dcr & DCR_IBE1 && __get_ibar(1) == addr) {
- //gdbstub_printk("clear h/w break 1: %08lx\n", addr);
- __debug_regs->dcr &= ~DCR_IBE1;
- __debug_regs->ibar[1] = 0;
- asm volatile("movgs gr0,ibar1");
- return 0;
- }
-
- if (__debug_regs->dcr & DCR_IBE2 && __get_ibar(2) == addr) {
- //gdbstub_printk("clear h/w break 2: %08lx\n", addr);
- __debug_regs->dcr &= ~DCR_IBE2;
- __debug_regs->ibar[2] = 0;
- asm volatile("movgs gr0,ibar2");
- return 0;
- }
-
- if (__debug_regs->dcr & DCR_IBE3 && __get_ibar(3) == addr) {
- //gdbstub_printk("clear h/w break 3: %08lx\n", addr);
- __debug_regs->dcr &= ~DCR_IBE3;
- __debug_regs->ibar[3] = 0;
- asm volatile("movgs gr0,ibar3");
- return 0;
- }
-
- return -EINVAL;
-
- /* clear data read/write/access watchpoint */
- case 2:
- case 3:
- case 4:
- if ((addr & ~7) != ((addr + len - 1) & ~7))
- return -EINVAL;
-
- tmp = addr & 7;
-
- memset(dbmr.bytes, 0xff, sizeof(dbmr.bytes));
- for (loop = 0; loop < len; loop++)
- dbmr.bytes[tmp + loop] = 0;
-
- addr &= ~7;
-
-#define __get_dbar(X) ({ unsigned long x; asm volatile("movsg dbar"#X",%0" : "=r"(x)); x; })
-#define __get_dbmr0(X) ({ unsigned long x; asm volatile("movsg dbmr"#X"0,%0" : "=r"(x)); x; })
-#define __get_dbmr1(X) ({ unsigned long x; asm volatile("movsg dbmr"#X"1,%0" : "=r"(x)); x; })
-
- /* consider DBAR 0 */
- tmp = type==2 ? DCR_DWBE0 : type==3 ? DCR_DRBE0 : DCR_DRBE0|DCR_DWBE0;
-
- if ((__debug_regs->dcr & (DCR_DRBE0|DCR_DWBE0)) != tmp ||
- __get_dbar(0) != addr ||
- __get_dbmr0(0) != dbmr.mask0 ||
- __get_dbmr1(0) != dbmr.mask1)
- goto skip_dbar0;
-
- //gdbstub_printk("clear h/w watchpoint 0 type %ld: %08lx\n", type, addr);
- __debug_regs->dcr &= ~(DCR_DRBE0|DCR_DWBE0);
- __debug_regs->dbar[0] = 0;
- __debug_regs->dbmr[0][0] = 0;
- __debug_regs->dbmr[0][1] = 0;
- __debug_regs->dbdr[0][0] = 0;
- __debug_regs->dbdr[0][1] = 0;
-
- asm volatile(" movgs gr0,dbar0 \n"
- " movgs gr0,dbmr00 \n"
- " movgs gr0,dbmr01 \n"
- " movgs gr0,dbdr00 \n"
- " movgs gr0,dbdr01 \n");
- return 0;
-
- skip_dbar0:
- /* consider DBAR 0 */
- tmp = type==2 ? DCR_DWBE1 : type==3 ? DCR_DRBE1 : DCR_DRBE1|DCR_DWBE1;
-
- if ((__debug_regs->dcr & (DCR_DRBE1|DCR_DWBE1)) != tmp ||
- __get_dbar(1) != addr ||
- __get_dbmr0(1) != dbmr.mask0 ||
- __get_dbmr1(1) != dbmr.mask1)
- goto skip_dbar1;
-
- //gdbstub_printk("clear h/w watchpoint 1 type %ld: %08lx\n", type, addr);
- __debug_regs->dcr &= ~(DCR_DRBE1|DCR_DWBE1);
- __debug_regs->dbar[1] = 0;
- __debug_regs->dbmr[1][0] = 0;
- __debug_regs->dbmr[1][1] = 0;
- __debug_regs->dbdr[1][0] = 0;
- __debug_regs->dbdr[1][1] = 0;
-
- asm volatile(" movgs gr0,dbar1 \n"
- " movgs gr0,dbmr10 \n"
- " movgs gr0,dbmr11 \n"
- " movgs gr0,dbdr10 \n"
- " movgs gr0,dbdr11 \n");
- return 0;
-
- skip_dbar1:
- return -ENOSPC;
-
- default:
- return -EINVAL;
- }
-} /* end gdbstub_clear_breakpoint() */
-
-/*****************************************************************************/
-/*
- * check a for an internal software breakpoint, and wind the PC back if necessary
- */
-static void gdbstub_check_breakpoint(void)
-{
- unsigned long addr = __debug_frame->pc - 4;
- int bkpt;
-
- for (bkpt = 255; bkpt >= 0; bkpt--)
- if (gdbstub_bkpts[bkpt].addr == addr)
- break;
- if (bkpt >= 0)
- __debug_frame->pc = addr;
-
- //gdbstub_printk("alter pc [%d] %08lx\n", bkpt, __debug_frame->pc);
-
-} /* end gdbstub_check_breakpoint() */
-
-/*****************************************************************************/
-/*
- *
- */
-static void __maybe_unused gdbstub_show_regs(void)
-{
- unsigned long *reg;
- int loop;
-
- gdbstub_printk("\n");
-
- gdbstub_printk("Frame: @%p [%s]\n",
- __debug_frame,
- __debug_frame->psr & PSR_S ? "kernel" : "user");
-
- reg = (unsigned long *) __debug_frame;
- for (loop = 0; loop < NR_PT_REGS; loop++) {
- printk("%s %08lx", regnames[loop + 0], reg[loop + 0]);
-
- if (loop == NR_PT_REGS - 1 || loop % 5 == 4)
- printk("\n");
- else
- printk(" | ");
- }
-
- gdbstub_printk("Process %s (pid: %d)\n", current->comm, current->pid);
-} /* end gdbstub_show_regs() */
-
-/*****************************************************************************/
-/*
- * dump debugging regs
- */
-static void __maybe_unused gdbstub_dump_debugregs(void)
-{
- gdbstub_printk("DCR %08lx ", __debug_status.dcr);
- gdbstub_printk("BRR %08lx\n", __debug_status.brr);
-
- gdbstub_printk("IBAR0 %08lx ", __get_ibar(0));
- gdbstub_printk("IBAR1 %08lx ", __get_ibar(1));
- gdbstub_printk("IBAR2 %08lx ", __get_ibar(2));
- gdbstub_printk("IBAR3 %08lx\n", __get_ibar(3));
-
- gdbstub_printk("DBAR0 %08lx ", __get_dbar(0));
- gdbstub_printk("DBMR00 %08lx ", __get_dbmr0(0));
- gdbstub_printk("DBMR01 %08lx\n", __get_dbmr1(0));
-
- gdbstub_printk("DBAR1 %08lx ", __get_dbar(1));
- gdbstub_printk("DBMR10 %08lx ", __get_dbmr0(1));
- gdbstub_printk("DBMR11 %08lx\n", __get_dbmr1(1));
-
- gdbstub_printk("\n");
-} /* end gdbstub_dump_debugregs() */
-
-/*****************************************************************************/
-/*
- * dump the MMU state into a structure so that it can be accessed with GDB
- */
-void gdbstub_get_mmu_state(void)
-{
- asm volatile("movsg hsr0,%0" : "=r"(__debug_mmu.regs.hsr0));
- asm volatile("movsg pcsr,%0" : "=r"(__debug_mmu.regs.pcsr));
- asm volatile("movsg esr0,%0" : "=r"(__debug_mmu.regs.esr0));
- asm volatile("movsg ear0,%0" : "=r"(__debug_mmu.regs.ear0));
- asm volatile("movsg epcr0,%0" : "=r"(__debug_mmu.regs.epcr0));
-
- /* read the protection / SAT registers */
- __debug_mmu.iamr[0].L = __get_IAMLR(0);
- __debug_mmu.iamr[0].P = __get_IAMPR(0);
- __debug_mmu.iamr[1].L = __get_IAMLR(1);
- __debug_mmu.iamr[1].P = __get_IAMPR(1);
- __debug_mmu.iamr[2].L = __get_IAMLR(2);
- __debug_mmu.iamr[2].P = __get_IAMPR(2);
- __debug_mmu.iamr[3].L = __get_IAMLR(3);
- __debug_mmu.iamr[3].P = __get_IAMPR(3);
- __debug_mmu.iamr[4].L = __get_IAMLR(4);
- __debug_mmu.iamr[4].P = __get_IAMPR(4);
- __debug_mmu.iamr[5].L = __get_IAMLR(5);
- __debug_mmu.iamr[5].P = __get_IAMPR(5);
- __debug_mmu.iamr[6].L = __get_IAMLR(6);
- __debug_mmu.iamr[6].P = __get_IAMPR(6);
- __debug_mmu.iamr[7].L = __get_IAMLR(7);
- __debug_mmu.iamr[7].P = __get_IAMPR(7);
- __debug_mmu.iamr[8].L = __get_IAMLR(8);
- __debug_mmu.iamr[8].P = __get_IAMPR(8);
- __debug_mmu.iamr[9].L = __get_IAMLR(9);
- __debug_mmu.iamr[9].P = __get_IAMPR(9);
- __debug_mmu.iamr[10].L = __get_IAMLR(10);
- __debug_mmu.iamr[10].P = __get_IAMPR(10);
- __debug_mmu.iamr[11].L = __get_IAMLR(11);
- __debug_mmu.iamr[11].P = __get_IAMPR(11);
- __debug_mmu.iamr[12].L = __get_IAMLR(12);
- __debug_mmu.iamr[12].P = __get_IAMPR(12);
- __debug_mmu.iamr[13].L = __get_IAMLR(13);
- __debug_mmu.iamr[13].P = __get_IAMPR(13);
- __debug_mmu.iamr[14].L = __get_IAMLR(14);
- __debug_mmu.iamr[14].P = __get_IAMPR(14);
- __debug_mmu.iamr[15].L = __get_IAMLR(15);
- __debug_mmu.iamr[15].P = __get_IAMPR(15);
-
- __debug_mmu.damr[0].L = __get_DAMLR(0);
- __debug_mmu.damr[0].P = __get_DAMPR(0);
- __debug_mmu.damr[1].L = __get_DAMLR(1);
- __debug_mmu.damr[1].P = __get_DAMPR(1);
- __debug_mmu.damr[2].L = __get_DAMLR(2);
- __debug_mmu.damr[2].P = __get_DAMPR(2);
- __debug_mmu.damr[3].L = __get_DAMLR(3);
- __debug_mmu.damr[3].P = __get_DAMPR(3);
- __debug_mmu.damr[4].L = __get_DAMLR(4);
- __debug_mmu.damr[4].P = __get_DAMPR(4);
- __debug_mmu.damr[5].L = __get_DAMLR(5);
- __debug_mmu.damr[5].P = __get_DAMPR(5);
- __debug_mmu.damr[6].L = __get_DAMLR(6);
- __debug_mmu.damr[6].P = __get_DAMPR(6);
- __debug_mmu.damr[7].L = __get_DAMLR(7);
- __debug_mmu.damr[7].P = __get_DAMPR(7);
- __debug_mmu.damr[8].L = __get_DAMLR(8);
- __debug_mmu.damr[8].P = __get_DAMPR(8);
- __debug_mmu.damr[9].L = __get_DAMLR(9);
- __debug_mmu.damr[9].P = __get_DAMPR(9);
- __debug_mmu.damr[10].L = __get_DAMLR(10);
- __debug_mmu.damr[10].P = __get_DAMPR(10);
- __debug_mmu.damr[11].L = __get_DAMLR(11);
- __debug_mmu.damr[11].P = __get_DAMPR(11);
- __debug_mmu.damr[12].L = __get_DAMLR(12);
- __debug_mmu.damr[12].P = __get_DAMPR(12);
- __debug_mmu.damr[13].L = __get_DAMLR(13);
- __debug_mmu.damr[13].P = __get_DAMPR(13);
- __debug_mmu.damr[14].L = __get_DAMLR(14);
- __debug_mmu.damr[14].P = __get_DAMPR(14);
- __debug_mmu.damr[15].L = __get_DAMLR(15);
- __debug_mmu.damr[15].P = __get_DAMPR(15);
-
-#ifdef CONFIG_MMU
- do {
- /* read the DAT entries from the TLB */
- struct __debug_amr *p;
- int loop;
-
- asm volatile("movsg tplr,%0" : "=r"(__debug_mmu.regs.tplr));
- asm volatile("movsg tppr,%0" : "=r"(__debug_mmu.regs.tppr));
- asm volatile("movsg tpxr,%0" : "=r"(__debug_mmu.regs.tpxr));
- asm volatile("movsg cxnr,%0" : "=r"(__debug_mmu.regs.cxnr));
-
- p = __debug_mmu.tlb;
-
- /* way 0 */
- asm volatile("movgs %0,tpxr" :: "r"(0 << TPXR_WAY_SHIFT));
- for (loop = 0; loop < 64; loop++) {
- asm volatile("tlbpr %0,gr0,#1,#0" :: "r"(loop << PAGE_SHIFT));
- asm volatile("movsg tplr,%0" : "=r"(p->L));
- asm volatile("movsg tppr,%0" : "=r"(p->P));
- p++;
- }
-
- /* way 1 */
- asm volatile("movgs %0,tpxr" :: "r"(1 << TPXR_WAY_SHIFT));
- for (loop = 0; loop < 64; loop++) {
- asm volatile("tlbpr %0,gr0,#1,#0" :: "r"(loop << PAGE_SHIFT));
- asm volatile("movsg tplr,%0" : "=r"(p->L));
- asm volatile("movsg tppr,%0" : "=r"(p->P));
- p++;
- }
-
- asm volatile("movgs %0,tplr" :: "r"(__debug_mmu.regs.tplr));
- asm volatile("movgs %0,tppr" :: "r"(__debug_mmu.regs.tppr));
- asm volatile("movgs %0,tpxr" :: "r"(__debug_mmu.regs.tpxr));
- } while(0);
-#endif
-
-} /* end gdbstub_get_mmu_state() */
-
-/*
- * handle general query commands of the form 'qXXXXX'
- */
-static void gdbstub_handle_query(void)
-{
- if (strcmp(input_buffer, "qAttached") == 0) {
- /* return current thread ID */
- sprintf(output_buffer, "1");
- return;
- }
-
- if (strcmp(input_buffer, "qC") == 0) {
- /* return current thread ID */
- sprintf(output_buffer, "QC 0");
- return;
- }
-
- if (strcmp(input_buffer, "qOffsets") == 0) {
- /* return relocation offset of text and data segments */
- sprintf(output_buffer, "Text=0;Data=0;Bss=0");
- return;
- }
-
- if (strcmp(input_buffer, "qSymbol::") == 0) {
- sprintf(output_buffer, "OK");
- return;
- }
-
- if (strcmp(input_buffer, "qSupported") == 0) {
- /* query of supported features */
- sprintf(output_buffer, "PacketSize=%u;ReverseContinue-;ReverseStep-",
- sizeof(input_buffer));
- return;
- }
-
- gdbstub_strcpy(output_buffer,"E01");
-}
-
-/*****************************************************************************/
-/*
- * handle event interception and GDB remote protocol processing
- * - on entry:
- * PSR.ET==0, PSR.S==1 and the CPU is in debug mode
- * __debug_frame points to the saved registers
- * __frame points to the kernel mode exception frame, if it was in kernel
- * mode when the break happened
- */
-void gdbstub(int sigval)
-{
- unsigned long addr, length, loop, dbar, temp, temp2, temp3;
- uint32_t zero;
- char *ptr;
- int flush_cache = 0;
-
- LEDS(0x5000);
-
- if (sigval < 0) {
-#ifndef CONFIG_GDBSTUB_IMMEDIATE
- /* return immediately if GDB immediate activation option not set */
- return;
-#else
- sigval = SIGINT;
-#endif
- }
-
- save_user_regs(&__debug_frame0->uc);
-
-#if 0
- gdbstub_printk("--> gdbstub() %08x %p %08x %08x\n",
- __debug_frame->pc,
- __debug_frame,
- __debug_regs->brr,
- __debug_regs->bpsr);
-// gdbstub_show_regs();
-#endif
-
- LEDS(0x5001);
-
- /* if we were interrupted by input on the serial gdbstub serial port,
- * restore the context prior to the interrupt so that we return to that
- * directly
- */
- temp = (unsigned long) __entry_kerneltrap_table;
- temp2 = (unsigned long) __entry_usertrap_table;
- temp3 = __debug_frame->pc & ~15;
-
- if (temp3 == temp + TBR_TT_INTERRUPT_15 ||
- temp3 == temp2 + TBR_TT_INTERRUPT_15
- ) {
- asm volatile("movsg pcsr,%0" : "=r"(__debug_frame->pc));
- __debug_frame->psr |= PSR_ET;
- __debug_frame->psr &= ~PSR_S;
- if (__debug_frame->psr & PSR_PS)
- __debug_frame->psr |= PSR_S;
- __debug_status.brr = (__debug_frame->tbr & TBR_TT) << 12;
- __debug_status.brr |= BRR_EB;
- sigval = SIGINT;
- }
-
- /* handle the decrement timer going off (FR451 only) */
- if (temp3 == temp + TBR_TT_DECREMENT_TIMER ||
- temp3 == temp2 + TBR_TT_DECREMENT_TIMER
- ) {
- asm volatile("movgs %0,timerd" :: "r"(10000000));
- asm volatile("movsg pcsr,%0" : "=r"(__debug_frame->pc));
- __debug_frame->psr |= PSR_ET;
- __debug_frame->psr &= ~PSR_S;
- if (__debug_frame->psr & PSR_PS)
- __debug_frame->psr |= PSR_S;
- __debug_status.brr = (__debug_frame->tbr & TBR_TT) << 12;
- __debug_status.brr |= BRR_EB;
- sigval = SIGXCPU;
- }
-
- LEDS(0x5002);
-
- /* after a BREAK insn, the PC lands on the far side of it */
- if (__debug_status.brr & BRR_SB)
- gdbstub_check_breakpoint();
-
- LEDS(0x5003);
-
- /* handle attempts to write console data via GDB "O" commands */
- if (__debug_frame->pc == (unsigned long) gdbstub_console_write + 4) {
- __gdbstub_console_write((struct console *) __debug_frame->gr8,
- (const char *) __debug_frame->gr9,
- (unsigned) __debug_frame->gr10);
- goto done;
- }
-
- if (gdbstub_rx_unget) {
- sigval = SIGINT;
- goto packet_waiting;
- }
-
- if (!sigval)
- sigval = gdbstub_compute_signal(__debug_status.brr);
-
- LEDS(0x5004);
-
- /* send a message to the debugger's user saying what happened if it may
- * not be clear cut (we can't map exceptions onto signals properly)
- */
- if (sigval != SIGINT && sigval != SIGTRAP && sigval != SIGILL) {
- static const char title[] = "Break ";
- static const char crlf[] = "\r\n";
- unsigned long brr = __debug_status.brr;
- char hx;
-
- ptr = output_buffer;
- *ptr++ = 'O';
- ptr = mem2hex(title, ptr, sizeof(title) - 1,0);
-
- hx = hex_asc_hi(brr >> 24);
- ptr = hex_byte_pack(ptr, hx);
- hx = hex_asc_lo(brr >> 24);
- ptr = hex_byte_pack(ptr, hx);
- hx = hex_asc_hi(brr >> 16);
- ptr = hex_byte_pack(ptr, hx);
- hx = hex_asc_lo(brr >> 16);
- ptr = hex_byte_pack(ptr, hx);
- hx = hex_asc_hi(brr >> 8);
- ptr = hex_byte_pack(ptr, hx);
- hx = hex_asc_lo(brr >> 8);
- ptr = hex_byte_pack(ptr, hx);
- hx = hex_asc_hi(brr);
- ptr = hex_byte_pack(ptr, hx);
- hx = hex_asc_lo(brr);
- ptr = hex_byte_pack(ptr, hx);
-
- ptr = mem2hex(crlf, ptr, sizeof(crlf) - 1, 0);
- *ptr = 0;
- gdbstub_send_packet(output_buffer); /* send it off... */
- }
-
- LEDS(0x5005);
-
- /* tell the debugger that an exception has occurred */
- ptr = output_buffer;
-
- /* Send trap type (converted to signal) */
- *ptr++ = 'T';
- ptr = hex_byte_pack(ptr, sigval);
-
- /* Send Error PC */
- ptr = hex_byte_pack(ptr, GDB_REG_PC);
- *ptr++ = ':';
- ptr = mem2hex(&__debug_frame->pc, ptr, 4, 0);
- *ptr++ = ';';
-
- /*
- * Send frame pointer
- */
- ptr = hex_byte_pack(ptr, GDB_REG_FP);
- *ptr++ = ':';
- ptr = mem2hex(&__debug_frame->fp, ptr, 4, 0);
- *ptr++ = ';';
-
- /*
- * Send stack pointer
- */
- ptr = hex_byte_pack(ptr, GDB_REG_SP);
- *ptr++ = ':';
- ptr = mem2hex(&__debug_frame->sp, ptr, 4, 0);
- *ptr++ = ';';
-
- *ptr++ = 0;
- gdbstub_send_packet(output_buffer); /* send it off... */
-
- LEDS(0x5006);
-
- packet_waiting:
- gdbstub_get_mmu_state();
-
- /* wait for input from remote GDB */
- while (1) {
- output_buffer[0] = 0;
-
- LEDS(0x5007);
- gdbstub_recv_packet(input_buffer);
- LEDS(0x5600 | input_buffer[0]);
-
- switch (input_buffer[0]) {
- /* request repeat of last signal number */
- case '?':
- output_buffer[0] = 'S';
- output_buffer[1] = hex_asc_hi(sigval);
- output_buffer[2] = hex_asc_lo(sigval);
- output_buffer[3] = 0;
- break;
-
- case 'd':
- /* toggle debug flag */
- break;
-
- /* return the value of the CPU registers
- * - GR0, GR1, GR2, GR3, GR4, GR5, GR6, GR7,
- * - GR8, GR9, GR10, GR11, GR12, GR13, GR14, GR15,
- * - GR16, GR17, GR18, GR19, GR20, GR21, GR22, GR23,
- * - GR24, GR25, GR26, GR27, GR28, GR29, GR30, GR31,
- * - GR32, GR33, GR34, GR35, GR36, GR37, GR38, GR39,
- * - GR40, GR41, GR42, GR43, GR44, GR45, GR46, GR47,
- * - GR48, GR49, GR50, GR51, GR52, GR53, GR54, GR55,
- * - GR56, GR57, GR58, GR59, GR60, GR61, GR62, GR63,
- * - FP0, FP1, FP2, FP3, FP4, FP5, FP6, FP7,
- * - FP8, FP9, FP10, FP11, FP12, FP13, FP14, FP15,
- * - FP16, FP17, FP18, FP19, FP20, FP21, FP22, FP23,
- * - FP24, FP25, FP26, FP27, FP28, FP29, FP30, FP31,
- * - FP32, FP33, FP34, FP35, FP36, FP37, FP38, FP39,
- * - FP40, FP41, FP42, FP43, FP44, FP45, FP46, FP47,
- * - FP48, FP49, FP50, FP51, FP52, FP53, FP54, FP55,
- * - FP56, FP57, FP58, FP59, FP60, FP61, FP62, FP63,
- * - PC, PSR, CCR, CCCR,
- * - _X132, _X133, _X134
- * - TBR, BRR, DBAR0, DBAR1, DBAR2, DBAR3,
- * - _X141, _X142, _X143, _X144,
- * - LR, LCR
- */
- case 'g':
- zero = 0;
- ptr = output_buffer;
-
- /* deal with GR0, GR1-GR27, GR28-GR31, GR32-GR63 */
- ptr = mem2hex(&zero, ptr, 4, 0);
-
- for (loop = 1; loop <= 27; loop++)
- ptr = mem2hex(&__debug_user_context->i.gr[loop], ptr, 4, 0);
- temp = (unsigned long) __frame;
- ptr = mem2hex(&temp, ptr, 4, 0);
- ptr = mem2hex(&__debug_user_context->i.gr[29], ptr, 4, 0);
- ptr = mem2hex(&__debug_user_context->i.gr[30], ptr, 4, 0);
-#ifdef CONFIG_MMU
- ptr = mem2hex(&__debug_user_context->i.gr[31], ptr, 4, 0);
-#else
- temp = (unsigned long) __debug_frame;
- ptr = mem2hex(&temp, ptr, 4, 0);
-#endif
-
- for (loop = 32; loop <= 63; loop++)
- ptr = mem2hex(&__debug_user_context->i.gr[loop], ptr, 4, 0);
-
- /* deal with FR0-FR63 */
- for (loop = 0; loop <= 63; loop++)
- ptr = mem2hex(&__debug_user_context->f.fr[loop], ptr, 4, 0);
-
- /* deal with special registers */
- ptr = mem2hex(&__debug_frame->pc, ptr, 4, 0);
- ptr = mem2hex(&__debug_frame->psr, ptr, 4, 0);
- ptr = mem2hex(&__debug_frame->ccr, ptr, 4, 0);
- ptr = mem2hex(&__debug_frame->cccr, ptr, 4, 0);
- ptr = mem2hex(&zero, ptr, 4, 0);
- ptr = mem2hex(&zero, ptr, 4, 0);
- ptr = mem2hex(&zero, ptr, 4, 0);
- ptr = mem2hex(&__debug_frame->tbr, ptr, 4, 0);
- ptr = mem2hex(&__debug_status.brr , ptr, 4, 0);
-
- asm volatile("movsg dbar0,%0" : "=r"(dbar));
- ptr = mem2hex(&dbar, ptr, 4, 0);
- asm volatile("movsg dbar1,%0" : "=r"(dbar));
- ptr = mem2hex(&dbar, ptr, 4, 0);
- asm volatile("movsg dbar2,%0" : "=r"(dbar));
- ptr = mem2hex(&dbar, ptr, 4, 0);
- asm volatile("movsg dbar3,%0" : "=r"(dbar));
- ptr = mem2hex(&dbar, ptr, 4, 0);
-
- asm volatile("movsg scr0,%0" : "=r"(dbar));
- ptr = mem2hex(&dbar, ptr, 4, 0);
- asm volatile("movsg scr1,%0" : "=r"(dbar));
- ptr = mem2hex(&dbar, ptr, 4, 0);
- asm volatile("movsg scr2,%0" : "=r"(dbar));
- ptr = mem2hex(&dbar, ptr, 4, 0);
- asm volatile("movsg scr3,%0" : "=r"(dbar));
- ptr = mem2hex(&dbar, ptr, 4, 0);
-
- ptr = mem2hex(&__debug_frame->lr, ptr, 4, 0);
- ptr = mem2hex(&__debug_frame->lcr, ptr, 4, 0);
-
- ptr = mem2hex(&__debug_frame->iacc0, ptr, 8, 0);
-
- ptr = mem2hex(&__debug_user_context->f.fsr[0], ptr, 4, 0);
-
- for (loop = 0; loop <= 7; loop++)
- ptr = mem2hex(&__debug_user_context->f.acc[loop], ptr, 4, 0);
-
- ptr = mem2hex(&__debug_user_context->f.accg, ptr, 8, 0);
-
- for (loop = 0; loop <= 1; loop++)
- ptr = mem2hex(&__debug_user_context->f.msr[loop], ptr, 4, 0);
-
- ptr = mem2hex(&__debug_frame->gner0, ptr, 4, 0);
- ptr = mem2hex(&__debug_frame->gner1, ptr, 4, 0);
-
- ptr = mem2hex(&__debug_user_context->f.fner[0], ptr, 4, 0);
- ptr = mem2hex(&__debug_user_context->f.fner[1], ptr, 4, 0);
-
- break;
-
- /* set the values of the CPU registers */
- case 'G':
- ptr = &input_buffer[1];
-
- /* deal with GR0, GR1-GR27, GR28-GR31, GR32-GR63 */
- ptr = hex2mem(ptr, &temp, 4);
-
- for (loop = 1; loop <= 27; loop++)
- ptr = hex2mem(ptr, &__debug_user_context->i.gr[loop], 4);
-
- ptr = hex2mem(ptr, &temp, 4);
- __frame = (struct pt_regs *) temp;
- ptr = hex2mem(ptr, &__debug_frame->gr29, 4);
- ptr = hex2mem(ptr, &__debug_frame->gr30, 4);
-#ifdef CONFIG_MMU
- ptr = hex2mem(ptr, &__debug_frame->gr31, 4);
-#else
- ptr = hex2mem(ptr, &temp, 4);
-#endif
-
- for (loop = 32; loop <= 63; loop++)
- ptr = hex2mem(ptr, &__debug_user_context->i.gr[loop], 4);
-
- /* deal with FR0-FR63 */
- for (loop = 0; loop <= 63; loop++)
- ptr = mem2hex(&__debug_user_context->f.fr[loop], ptr, 4, 0);
-
- /* deal with special registers */
- ptr = hex2mem(ptr, &__debug_frame->pc, 4);
- ptr = hex2mem(ptr, &__debug_frame->psr, 4);
- ptr = hex2mem(ptr, &__debug_frame->ccr, 4);
- ptr = hex2mem(ptr, &__debug_frame->cccr,4);
-
- for (loop = 132; loop <= 140; loop++)
- ptr = hex2mem(ptr, &temp, 4);
-
- ptr = hex2mem(ptr, &temp, 4);
- asm volatile("movgs %0,scr0" :: "r"(temp));
- ptr = hex2mem(ptr, &temp, 4);
- asm volatile("movgs %0,scr1" :: "r"(temp));
- ptr = hex2mem(ptr, &temp, 4);
- asm volatile("movgs %0,scr2" :: "r"(temp));
- ptr = hex2mem(ptr, &temp, 4);
- asm volatile("movgs %0,scr3" :: "r"(temp));
-
- ptr = hex2mem(ptr, &__debug_frame->lr, 4);
- ptr = hex2mem(ptr, &__debug_frame->lcr, 4);
-
- ptr = hex2mem(ptr, &__debug_frame->iacc0, 8);
-
- ptr = hex2mem(ptr, &__debug_user_context->f.fsr[0], 4);
-
- for (loop = 0; loop <= 7; loop++)
- ptr = hex2mem(ptr, &__debug_user_context->f.acc[loop], 4);
-
- ptr = hex2mem(ptr, &__debug_user_context->f.accg, 8);
-
- for (loop = 0; loop <= 1; loop++)
- ptr = hex2mem(ptr, &__debug_user_context->f.msr[loop], 4);
-
- ptr = hex2mem(ptr, &__debug_frame->gner0, 4);
- ptr = hex2mem(ptr, &__debug_frame->gner1, 4);
-
- ptr = hex2mem(ptr, &__debug_user_context->f.fner[0], 4);
- ptr = hex2mem(ptr, &__debug_user_context->f.fner[1], 4);
-
- gdbstub_strcpy(output_buffer,"OK");
- break;
-
- /* mAA..AA,LLLL Read LLLL bytes at address AA..AA */
- case 'm':
- ptr = &input_buffer[1];
-
- if (hexToInt(&ptr, &addr) &&
- *ptr++ == ',' &&
- hexToInt(&ptr, &length)
- ) {
- if (mem2hex((char *)addr, output_buffer, length, 1))
- break;
- gdbstub_strcpy (output_buffer, "E03");
- }
- else {
- gdbstub_strcpy(output_buffer,"E01");
- }
- break;
-
- /* MAA..AA,LLLL: Write LLLL bytes at address AA.AA return OK */
- case 'M':
- ptr = &input_buffer[1];
-
- if (hexToInt(&ptr, &addr) &&
- *ptr++ == ',' &&
- hexToInt(&ptr, &length) &&
- *ptr++ == ':'
- ) {
- if (hex2mem(ptr, (char *)addr, length)) {
- gdbstub_strcpy(output_buffer, "OK");
- }
- else {
- gdbstub_strcpy(output_buffer, "E03");
- }
- }
- else
- gdbstub_strcpy(output_buffer, "E02");
-
- flush_cache = 1;
- break;
-
- /* pNN: Read value of reg N and return it */
- case 'p':
- /* return no value, indicating that we don't support
- * this command and that gdb should use 'g' instead */
- break;
-
- /* PNN,=RRRRRRRR: Write value R to reg N return OK */
- case 'P':
- ptr = &input_buffer[1];
-
- if (!hexToInt(&ptr, &addr) ||
- *ptr++ != '=' ||
- !hexToInt(&ptr, &temp)
- ) {
- gdbstub_strcpy(output_buffer, "E01");
- break;
- }
-
- temp2 = 1;
- switch (addr) {
- case GDB_REG_GR(0):
- break;
- case GDB_REG_GR(1) ... GDB_REG_GR(63):
- __debug_user_context->i.gr[addr - GDB_REG_GR(0)] = temp;
- break;
- case GDB_REG_FR(0) ... GDB_REG_FR(63):
- __debug_user_context->f.fr[addr - GDB_REG_FR(0)] = temp;
- break;
- case GDB_REG_PC:
- __debug_user_context->i.pc = temp;
- break;
- case GDB_REG_PSR:
- __debug_user_context->i.psr = temp;
- break;
- case GDB_REG_CCR:
- __debug_user_context->i.ccr = temp;
- break;
- case GDB_REG_CCCR:
- __debug_user_context->i.cccr = temp;
- break;
- case GDB_REG_BRR:
- __debug_status.brr = temp;
- break;
- case GDB_REG_LR:
- __debug_user_context->i.lr = temp;
- break;
- case GDB_REG_LCR:
- __debug_user_context->i.lcr = temp;
- break;
- case GDB_REG_FSR0:
- __debug_user_context->f.fsr[0] = temp;
- break;
- case GDB_REG_ACC(0) ... GDB_REG_ACC(7):
- __debug_user_context->f.acc[addr - GDB_REG_ACC(0)] = temp;
- break;
- case GDB_REG_ACCG(0):
- *(uint32_t *) &__debug_user_context->f.accg[0] = temp;
- break;
- case GDB_REG_ACCG(4):
- *(uint32_t *) &__debug_user_context->f.accg[4] = temp;
- break;
- case GDB_REG_MSR(0) ... GDB_REG_MSR(1):
- __debug_user_context->f.msr[addr - GDB_REG_MSR(0)] = temp;
- break;
- case GDB_REG_GNER(0) ... GDB_REG_GNER(1):
- __debug_user_context->i.gner[addr - GDB_REG_GNER(0)] = temp;
- break;
- case GDB_REG_FNER(0) ... GDB_REG_FNER(1):
- __debug_user_context->f.fner[addr - GDB_REG_FNER(0)] = temp;
- break;
- default:
- temp2 = 0;
- break;
- }
-
- if (temp2) {
- gdbstub_strcpy(output_buffer, "OK");
- }
- else {
- gdbstub_strcpy(output_buffer, "E02");
- }
- break;
-
- /* cAA..AA Continue at address AA..AA(optional) */
- case 'c':
- /* try to read optional parameter, pc unchanged if no parm */
- ptr = &input_buffer[1];
- if (hexToInt(&ptr, &addr))
- __debug_frame->pc = addr;
- goto done;
-
- /* kill the program */
- case 'k' :
- goto done; /* just continue */
-
- /* detach */
- case 'D':
- gdbstub_strcpy(output_buffer, "OK");
- break;
-
- /* reset the whole machine (FIXME: system dependent) */
- case 'r':
- break;
-
-
- /* step to next instruction */
- case 's':
- __debug_regs->dcr |= DCR_SE;
- __debug_status.dcr |= DCR_SE;
- goto done;
-
- /* extended command */
- case 'v':
- if (strcmp(input_buffer, "vCont?") == 0) {
- output_buffer[0] = 0;
- break;
- }
- goto unsupported_cmd;
-
- /* set baud rate (bBB) */
- case 'b':
- ptr = &input_buffer[1];
- if (!hexToInt(&ptr, &temp)) {
- gdbstub_strcpy(output_buffer,"B01");
- break;
- }
-
- if (temp) {
- /* ack before changing speed */
- gdbstub_send_packet("OK");
- gdbstub_set_baud(temp);
- }
- break;
-
- /* set breakpoint */
- case 'Z':
- ptr = &input_buffer[1];
-
- if (!hexToInt(&ptr,&temp) || *ptr++ != ',' ||
- !hexToInt(&ptr,&addr) || *ptr++ != ',' ||
- !hexToInt(&ptr,&length)
- ) {
- gdbstub_strcpy(output_buffer,"E01");
- break;
- }
-
- if (temp >= 5) {
- gdbstub_strcpy(output_buffer,"E03");
- break;
- }
-
- if (gdbstub_set_breakpoint(temp, addr, length) < 0) {
- gdbstub_strcpy(output_buffer,"E03");
- break;
- }
-
- if (temp == 0)
- flush_cache = 1; /* soft bkpt by modified memory */
-
- gdbstub_strcpy(output_buffer,"OK");
- break;
-
- /* clear breakpoint */
- case 'z':
- ptr = &input_buffer[1];
-
- if (!hexToInt(&ptr,&temp) || *ptr++ != ',' ||
- !hexToInt(&ptr,&addr) || *ptr++ != ',' ||
- !hexToInt(&ptr,&length)
- ) {
- gdbstub_strcpy(output_buffer,"E01");
- break;
- }
-
- if (temp >= 5) {
- gdbstub_strcpy(output_buffer,"E03");
- break;
- }
-
- if (gdbstub_clear_breakpoint(temp, addr, length) < 0) {
- gdbstub_strcpy(output_buffer,"E03");
- break;
- }
-
- if (temp == 0)
- flush_cache = 1; /* soft bkpt by modified memory */
-
- gdbstub_strcpy(output_buffer,"OK");
- break;
-
- /* Thread-setting packet */
- case 'H':
- gdbstub_strcpy(output_buffer, "OK");
- break;
-
- case 'q':
- gdbstub_handle_query();
- break;
-
- default:
- unsupported_cmd:
- gdbstub_proto("### GDB Unsupported Cmd '%s'\n",input_buffer);
- gdbstub_strcpy(output_buffer,"E01");
- break;
- }
-
- /* reply to the request */
- LEDS(0x5009);
- gdbstub_send_packet(output_buffer);
- }
-
- done:
- restore_user_regs(&__debug_frame0->uc);
-
- //gdbstub_dump_debugregs();
- //gdbstub_printk("<-- gdbstub() %08x\n", __debug_frame->pc);
-
- /* need to flush the instruction cache before resuming, as we may have
- * deposited a breakpoint, and the icache probably has no way of
- * knowing that a data ref to some location may have changed something
- * that is in the instruction cache. NB: We flush both caches, just to
- * be sure...
- */
-
- /* note: flushing the icache will clobber EAR0 on the FR451 */
- if (flush_cache)
- gdbstub_purge_cache();
-
- LEDS(0x5666);
-
-} /* end gdbstub() */
-
-/*****************************************************************************/
-/*
- * initialise the GDB stub
- */
-void __init gdbstub_init(void)
-{
-#ifdef CONFIG_GDBSTUB_IMMEDIATE
- unsigned char ch;
- int ret;
-#endif
-
- gdbstub_printk("%s", gdbstub_banner);
-
- gdbstub_io_init();
-
- /* try to talk to GDB (or anyone insane enough to want to type GDB protocol by hand) */
- gdbstub_proto("### GDB Tx ACK\n");
- gdbstub_tx_char('+'); /* 'hello world' */
-
-#ifdef CONFIG_GDBSTUB_IMMEDIATE
- gdbstub_printk("GDB Stub waiting for packet\n");
-
- /*
- * In case GDB is started before us, ack any packets
- * (presumably "$?#xx") sitting there.
- */
- do { gdbstub_rx_char(&ch, 0); } while (ch != '$');
- do { gdbstub_rx_char(&ch, 0); } while (ch != '#');
- do { ret = gdbstub_rx_char(&ch, 0); } while (ret != 0); /* eat first csum byte */
- do { ret = gdbstub_rx_char(&ch, 0); } while (ret != 0); /* eat second csum byte */
-
- gdbstub_proto("### GDB Tx NAK\n");
- gdbstub_tx_char('-'); /* nak it */
-
-#else
- gdbstub_printk("GDB Stub set\n");
-#endif
-
-#if 0
- /* send banner */
- ptr = output_buffer;
- *ptr++ = 'O';
- ptr = mem2hex(gdbstub_banner, ptr, sizeof(gdbstub_banner) - 1, 0);
- gdbstub_send_packet(output_buffer);
-#endif
-#if defined(CONFIG_GDB_CONSOLE) && defined(CONFIG_GDBSTUB_IMMEDIATE)
- register_console(&gdbstub_console);
-#endif
-
-} /* end gdbstub_init() */
-
-/*****************************************************************************/
-/*
- * register the console at a more appropriate time
- */
-#if defined (CONFIG_GDB_CONSOLE) && !defined(CONFIG_GDBSTUB_IMMEDIATE)
-static int __init gdbstub_postinit(void)
-{
- printk("registering console\n");
- register_console(&gdbstub_console);
- return 0;
-} /* end gdbstub_postinit() */
-
-__initcall(gdbstub_postinit);
-#endif
-
-/*****************************************************************************/
-/*
- * send an exit message to GDB
- */
-void gdbstub_exit(int status)
-{
- unsigned char checksum;
- int count;
- unsigned char ch;
-
- sprintf(output_buffer,"W%02x",status&0xff);
-
- gdbstub_tx_char('$');
- checksum = 0;
- count = 0;
-
- while ((ch = output_buffer[count]) != 0) {
- gdbstub_tx_char(ch);
- checksum += ch;
- count += 1;
- }
-
- gdbstub_tx_char('#');
- gdbstub_tx_char(hex_asc_hi(checksum));
- gdbstub_tx_char(hex_asc_lo(checksum));
-
- /* make sure the output is flushed, or else RedBoot might clobber it */
- gdbstub_tx_char('-');
- gdbstub_tx_flush();
-
-} /* end gdbstub_exit() */
-
-/*****************************************************************************/
-/*
- * GDB wants to call malloc() and free() to allocate memory for calling kernel
- * functions directly from its command line
- */
-static void *malloc(size_t size) __maybe_unused;
-static void *malloc(size_t size)
-{
- return kmalloc(size, GFP_ATOMIC);
-}
-
-static void free(void *p) __maybe_unused;
-static void free(void *p)
-{
- kfree(p);
-}
-
-static uint32_t ___get_HSR0(void) __maybe_unused;
-static uint32_t ___get_HSR0(void)
-{
- return __get_HSR(0);
-}
-
-static uint32_t ___set_HSR0(uint32_t x) __maybe_unused;
-static uint32_t ___set_HSR0(uint32_t x)
-{
- __set_HSR(0, x);
- return __get_HSR(0);
-}
diff --git a/arch/frv/kernel/head-mmu-fr451.S b/arch/frv/kernel/head-mmu-fr451.S
deleted file mode 100644
index 98f87d586e59..000000000000
--- a/arch/frv/kernel/head-mmu-fr451.S
+++ /dev/null
@@ -1,374 +0,0 @@
-/* head-mmu-fr451.S: FR451 mmu-linux specific bits of initialisation
- *
- * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
- * Written by David Howells (dhowells@redhat.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.
- */
-
-#include <linux/init.h>
-#include <linux/threads.h>
-#include <linux/linkage.h>
-#include <asm/ptrace.h>
-#include <asm/page.h>
-#include <asm/mem-layout.h>
-#include <asm/spr-regs.h>
-#include <asm/mb86943a.h>
-#include "head.inc"
-
-
-#define __400_DBR0 0xfe000e00
-#define __400_DBR1 0xfe000e08
-#define __400_DBR2 0xfe000e10
-#define __400_DBR3 0xfe000e18
-#define __400_DAM0 0xfe000f00
-#define __400_DAM1 0xfe000f08
-#define __400_DAM2 0xfe000f10
-#define __400_DAM3 0xfe000f18
-#define __400_LGCR 0xfe000010
-#define __400_LCR 0xfe000100
-#define __400_LSBR 0xfe000c00
-
- __INIT
- .balign 4
-
-###############################################################################
-#
-# describe the position and layout of the SDRAM controller registers
-#
-# ENTRY: EXIT:
-# GR5 - cacheline size
-# GR11 - displacement of 2nd SDRAM addr reg from GR14
-# GR12 - displacement of 3rd SDRAM addr reg from GR14
-# GR13 - displacement of 4th SDRAM addr reg from GR14
-# GR14 - address of 1st SDRAM addr reg
-# GR15 - amount to shift address by to match SDRAM addr reg
-# GR26 &__head_reference [saved]
-# GR30 LED address [saved]
-# CC0 - T if DBR0 is present
-# CC1 - T if DBR1 is present
-# CC2 - T if DBR2 is present
-# CC3 - T if DBR3 is present
-#
-###############################################################################
- .globl __head_fr451_describe_sdram
-__head_fr451_describe_sdram:
- sethi.p %hi(__400_DBR0),gr14
- setlo %lo(__400_DBR0),gr14
- setlos.p #__400_DBR1-__400_DBR0,gr11
- setlos #__400_DBR2-__400_DBR0,gr12
- setlos.p #__400_DBR3-__400_DBR0,gr13
- setlos #32,gr5 ; cacheline size
- setlos.p #0,gr15 ; amount to shift addr reg by
- setlos #0x00ff,gr4
- movgs gr4,cccr ; extant DARS/DAMK regs
- bralr
-
-###############################################################################
-#
-# rearrange the bus controller registers
-#
-# ENTRY: EXIT:
-# GR26 &__head_reference [saved]
-# GR30 LED address revised LED address
-#
-###############################################################################
- .globl __head_fr451_set_busctl
-__head_fr451_set_busctl:
- sethi.p %hi(__400_LGCR),gr4
- setlo %lo(__400_LGCR),gr4
- sethi.p %hi(__400_LSBR),gr10
- setlo %lo(__400_LSBR),gr10
- sethi.p %hi(__400_LCR),gr11
- setlo %lo(__400_LCR),gr11
-
- # set the bus controller
- ldi @(gr4,#0),gr5
- ori gr5,#0xff,gr5 ; make sure all chip-selects are enabled
- sti gr5,@(gr4,#0)
-
- sethi.p %hi(__region_CS1),gr4
- setlo %lo(__region_CS1),gr4
- sethi.p %hi(__region_CS1_M),gr5
- setlo %lo(__region_CS1_M),gr5
- sethi.p %hi(__region_CS1_C),gr6
- setlo %lo(__region_CS1_C),gr6
- sti gr4,@(gr10,#1*0x08)
- sti gr5,@(gr10,#1*0x08+0x100)
- sti gr6,@(gr11,#1*0x08)
- sethi.p %hi(__region_CS2),gr4
- setlo %lo(__region_CS2),gr4
- sethi.p %hi(__region_CS2_M),gr5
- setlo %lo(__region_CS2_M),gr5
- sethi.p %hi(__region_CS2_C),gr6
- setlo %lo(__region_CS2_C),gr6
- sti gr4,@(gr10,#2*0x08)
- sti gr5,@(gr10,#2*0x08+0x100)
- sti gr6,@(gr11,#2*0x08)
- sethi.p %hi(__region_CS3),gr4
- setlo %lo(__region_CS3),gr4
- sethi.p %hi(__region_CS3_M),gr5
- setlo %lo(__region_CS3_M),gr5
- sethi.p %hi(__region_CS3_C),gr6
- setlo %lo(__region_CS3_C),gr6
- sti gr4,@(gr10,#3*0x08)
- sti gr5,@(gr10,#3*0x08+0x100)
- sti gr6,@(gr11,#3*0x08)
- sethi.p %hi(__region_CS4),gr4
- setlo %lo(__region_CS4),gr4
- sethi.p %hi(__region_CS4_M),gr5
- setlo %lo(__region_CS4_M),gr5
- sethi.p %hi(__region_CS4_C),gr6
- setlo %lo(__region_CS4_C),gr6
- sti gr4,@(gr10,#4*0x08)
- sti gr5,@(gr10,#4*0x08+0x100)
- sti gr6,@(gr11,#4*0x08)
- sethi.p %hi(__region_CS5),gr4
- setlo %lo(__region_CS5),gr4
- sethi.p %hi(__region_CS5_M),gr5
- setlo %lo(__region_CS5_M),gr5
- sethi.p %hi(__region_CS5_C),gr6
- setlo %lo(__region_CS5_C),gr6
- sti gr4,@(gr10,#5*0x08)
- sti gr5,@(gr10,#5*0x08+0x100)
- sti gr6,@(gr11,#5*0x08)
- sethi.p %hi(__region_CS6),gr4
- setlo %lo(__region_CS6),gr4
- sethi.p %hi(__region_CS6_M),gr5
- setlo %lo(__region_CS6_M),gr5
- sethi.p %hi(__region_CS6_C),gr6
- setlo %lo(__region_CS6_C),gr6
- sti gr4,@(gr10,#6*0x08)
- sti gr5,@(gr10,#6*0x08+0x100)
- sti gr6,@(gr11,#6*0x08)
- sethi.p %hi(__region_CS7),gr4
- setlo %lo(__region_CS7),gr4
- sethi.p %hi(__region_CS7_M),gr5
- setlo %lo(__region_CS7_M),gr5
- sethi.p %hi(__region_CS7_C),gr6
- setlo %lo(__region_CS7_C),gr6
- sti gr4,@(gr10,#7*0x08)
- sti gr5,@(gr10,#7*0x08+0x100)
- sti gr6,@(gr11,#7*0x08)
- membar
- bar
-
- # adjust LED bank address
-#ifdef CONFIG_MB93091_VDK
- sethi.p %hi(__region_CS2 + 0x01200004),gr30
- setlo %lo(__region_CS2 + 0x01200004),gr30
-#endif
- bralr
-
-###############################################################################
-#
-# determine the total SDRAM size
-#
-# ENTRY: EXIT:
-# GR25 - SDRAM size
-# GR26 &__head_reference [saved]
-# GR30 LED address [saved]
-#
-###############################################################################
- .globl __head_fr451_survey_sdram
-__head_fr451_survey_sdram:
- sethi.p %hi(__400_DAM0),gr11
- setlo %lo(__400_DAM0),gr11
- sethi.p %hi(__400_DBR0),gr12
- setlo %lo(__400_DBR0),gr12
-
- sethi.p %hi(0xfe000000),gr17 ; unused SDRAM DBR value
- setlo %lo(0xfe000000),gr17
- setlos #0,gr25
-
- ldi @(gr12,#0x00),gr4 ; DAR0
- subcc gr4,gr17,gr0,icc0
- beq icc0,#0,__head_no_DCS0
- ldi @(gr11,#0x00),gr6 ; DAM0: bits 31:20 match addr 31:20
- add gr25,gr6,gr25
- addi gr25,#1,gr25
-__head_no_DCS0:
-
- ldi @(gr12,#0x08),gr4 ; DAR1
- subcc gr4,gr17,gr0,icc0
- beq icc0,#0,__head_no_DCS1
- ldi @(gr11,#0x08),gr6 ; DAM1: bits 31:20 match addr 31:20
- add gr25,gr6,gr25
- addi gr25,#1,gr25
-__head_no_DCS1:
-
- ldi @(gr12,#0x10),gr4 ; DAR2
- subcc gr4,gr17,gr0,icc0
- beq icc0,#0,__head_no_DCS2
- ldi @(gr11,#0x10),gr6 ; DAM2: bits 31:20 match addr 31:20
- add gr25,gr6,gr25
- addi gr25,#1,gr25
-__head_no_DCS2:
-
- ldi @(gr12,#0x18),gr4 ; DAR3
- subcc gr4,gr17,gr0,icc0
- beq icc0,#0,__head_no_DCS3
- ldi @(gr11,#0x18),gr6 ; DAM3: bits 31:20 match addr 31:20
- add gr25,gr6,gr25
- addi gr25,#1,gr25
-__head_no_DCS3:
- bralr
-
-###############################################################################
-#
-# set the protection map with the I/DAMPR registers
-#
-# ENTRY: EXIT:
-# GR25 SDRAM size [saved]
-# GR26 &__head_reference [saved]
-# GR30 LED address [saved]
-#
-#
-# Using this map:
-# REGISTERS ADDRESS RANGE VIEW
-# =============== ====================== ===============================
-# IAMPR0/DAMPR0 0xC0000000-0xCFFFFFFF Cached kernel RAM Window
-# DAMPR11 0xE0000000-0xFFFFFFFF Uncached I/O
-#
-###############################################################################
- .globl __head_fr451_set_protection
-__head_fr451_set_protection:
- movsg lr,gr27
-
- # set the I/O region protection registers for FR451 in MMU mode
-#define PGPROT_IO xAMPRx_L|xAMPRx_M|xAMPRx_S_KERNEL|xAMPRx_C|xAMPRx_V
-
- sethi.p %hi(__region_IO),gr5
- setlo %lo(__region_IO),gr5
- setlos #PGPROT_IO|xAMPRx_SS_512Mb,gr4
- or gr4,gr5,gr4
- movgs gr5,damlr11 ; General I/O tile
- movgs gr4,dampr11
-
- # need to open a window onto at least part of the RAM for the kernel's use
- sethi.p %hi(__sdram_base),gr8
- setlo %lo(__sdram_base),gr8 ; physical address
- sethi.p %hi(__page_offset),gr9
- setlo %lo(__page_offset),gr9 ; virtual address
-
- setlos #xAMPRx_L|xAMPRx_M|xAMPRx_SS_256Mb|xAMPRx_S_KERNEL|xAMPRx_V,gr11
- or gr8,gr11,gr8
-
- movgs gr9,iamlr0 ; mapped from real address 0
- movgs gr8,iampr0 ; cached kernel memory at 0xC0000000
- movgs gr9,damlr0
- movgs gr8,dampr0
-
- # set a temporary mapping for the kernel running at address 0 until we've turned on the MMU
- sethi.p %hi(__sdram_base),gr9
- setlo %lo(__sdram_base),gr9 ; virtual address
-
- and.p gr4,gr11,gr4
- and gr5,gr11,gr5
- or.p gr4,gr11,gr4
- or gr5,gr11,gr5
-
- movgs gr9,iamlr1 ; mapped from real address 0
- movgs gr8,iampr1 ; cached kernel memory at 0x00000000
- movgs gr9,damlr1
- movgs gr8,dampr1
-
- # we use DAMR2-10 for kmap_atomic(), cache flush and TLB management
- # since the DAMLR regs are not going to change, we can set them now
- # also set up IAMLR2 to the same as DAMLR5
- sethi.p %hi(KMAP_ATOMIC_PRIMARY_FRAME),gr4
- setlo %lo(KMAP_ATOMIC_PRIMARY_FRAME),gr4
- sethi.p %hi(PAGE_SIZE),gr5
- setlo %lo(PAGE_SIZE),gr5
-
- movgs gr4,damlr2
- movgs gr4,iamlr2
- add gr4,gr5,gr4
- movgs gr4,damlr3
- add gr4,gr5,gr4
- movgs gr4,damlr4
- add gr4,gr5,gr4
- movgs gr4,damlr5
- add gr4,gr5,gr4
- movgs gr4,damlr6
- add gr4,gr5,gr4
- movgs gr4,damlr7
- add gr4,gr5,gr4
- movgs gr4,damlr8
- add gr4,gr5,gr4
- movgs gr4,damlr9
- add gr4,gr5,gr4
- movgs gr4,damlr10
-
- movgs gr0,dampr2
- movgs gr0,dampr4
- movgs gr0,dampr5
- movgs gr0,dampr6
- movgs gr0,dampr7
- movgs gr0,dampr8
- movgs gr0,dampr9
- movgs gr0,dampr10
-
- movgs gr0,iamlr3
- movgs gr0,iamlr4
- movgs gr0,iamlr5
- movgs gr0,iamlr6
- movgs gr0,iamlr7
-
- movgs gr0,iampr2
- movgs gr0,iampr3
- movgs gr0,iampr4
- movgs gr0,iampr5
- movgs gr0,iampr6
- movgs gr0,iampr7
-
- # start in TLB context 0 with the swapper's page tables
- movgs gr0,cxnr
-
- sethi.p %hi(swapper_pg_dir),gr4
- setlo %lo(swapper_pg_dir),gr4
- sethi.p %hi(__page_offset),gr5
- setlo %lo(__page_offset),gr5
- sub gr4,gr5,gr4
- movgs gr4,ttbr
- setlos #xAMPRx_L|xAMPRx_M|xAMPRx_SS_16Kb|xAMPRx_S|xAMPRx_C|xAMPRx_V,gr5
- or gr4,gr5,gr4
- movgs gr4,dampr3
-
- # the FR451 also has an extra trap base register
- movsg tbr,gr4
- movgs gr4,btbr
-
- LEDS 0x3300
- jmpl @(gr27,gr0)
-
-###############################################################################
-#
-# finish setting up the protection registers
-#
-###############################################################################
- .globl __head_fr451_finalise_protection
-__head_fr451_finalise_protection:
- # turn on the timers as appropriate
- movgs gr0,timerh
- movgs gr0,timerl
- movgs gr0,timerd
- movsg hsr0,gr4
- sethi.p %hi(HSR0_ETMI),gr5
- setlo %lo(HSR0_ETMI),gr5
- or gr4,gr5,gr4
- movgs gr4,hsr0
-
- # clear the TLB entry cache
- movgs gr0,iamlr1
- movgs gr0,iampr1
- movgs gr0,damlr1
- movgs gr0,dampr1
-
- # clear the PGE cache
- sethi.p %hi(__flush_tlb_all),gr4
- setlo %lo(__flush_tlb_all),gr4
- jmpl @(gr4,gr0)
diff --git a/arch/frv/kernel/head-uc-fr401.S b/arch/frv/kernel/head-uc-fr401.S
deleted file mode 100644
index 438643cfa38e..000000000000
--- a/arch/frv/kernel/head-uc-fr401.S
+++ /dev/null
@@ -1,311 +0,0 @@
-/* head-uc-fr401.S: FR401/3/5 uc-linux specific bits of initialisation
- *
- * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
- * Written by David Howells (dhowells@redhat.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.
- */
-
-#include <linux/init.h>
-#include <linux/threads.h>
-#include <linux/linkage.h>
-#include <asm/ptrace.h>
-#include <asm/page.h>
-#include <asm/spr-regs.h>
-#include <asm/mb86943a.h>
-#include "head.inc"
-
-
-#define __400_DBR0 0xfe000e00
-#define __400_DBR1 0xfe000e08
-#define __400_DBR2 0xfe000e10 /* not on FR401 */
-#define __400_DBR3 0xfe000e18 /* not on FR401 */
-#define __400_DAM0 0xfe000f00
-#define __400_DAM1 0xfe000f08
-#define __400_DAM2 0xfe000f10 /* not on FR401 */
-#define __400_DAM3 0xfe000f18 /* not on FR401 */
-#define __400_LGCR 0xfe000010
-#define __400_LCR 0xfe000100
-#define __400_LSBR 0xfe000c00
-
- __INIT
- .balign 4
-
-###############################################################################
-#
-# describe the position and layout of the SDRAM controller registers
-#
-# ENTRY: EXIT:
-# GR5 - cacheline size
-# GR11 - displacement of 2nd SDRAM addr reg from GR14
-# GR12 - displacement of 3rd SDRAM addr reg from GR14
-# GR13 - displacement of 4th SDRAM addr reg from GR14
-# GR14 - address of 1st SDRAM addr reg
-# GR15 - amount to shift address by to match SDRAM addr reg
-# GR26 &__head_reference [saved]
-# GR30 LED address [saved]
-# CC0 - T if DBR0 is present
-# CC1 - T if DBR1 is present
-# CC2 - T if DBR2 is present (not FR401/FR401A)
-# CC3 - T if DBR3 is present (not FR401/FR401A)
-#
-###############################################################################
- .globl __head_fr401_describe_sdram
-__head_fr401_describe_sdram:
- sethi.p %hi(__400_DBR0),gr14
- setlo %lo(__400_DBR0),gr14
- setlos.p #__400_DBR1-__400_DBR0,gr11
- setlos #__400_DBR2-__400_DBR0,gr12
- setlos.p #__400_DBR3-__400_DBR0,gr13
- setlos #32,gr5 ; cacheline size
- setlos.p #0,gr15 ; amount to shift addr reg by
-
- # specify which DBR regs are present
- setlos #0x00ff,gr4
- movgs gr4,cccr
- movsg psr,gr3 ; check for FR401/FR401A
- srli gr3,#25,gr3
- subicc gr3,#0x20>>1,gr0,icc0
- bnelr icc0,#1
- setlos #0x000f,gr4
- movgs gr4,cccr
- bralr
-
-###############################################################################
-#
-# rearrange the bus controller registers
-#
-# ENTRY: EXIT:
-# GR26 &__head_reference [saved]
-# GR30 LED address revised LED address
-#
-###############################################################################
- .globl __head_fr401_set_busctl
-__head_fr401_set_busctl:
- sethi.p %hi(__400_LGCR),gr4
- setlo %lo(__400_LGCR),gr4
- sethi.p %hi(__400_LSBR),gr10
- setlo %lo(__400_LSBR),gr10
- sethi.p %hi(__400_LCR),gr11
- setlo %lo(__400_LCR),gr11
-
- # set the bus controller
- ldi @(gr4,#0),gr5
- ori gr5,#0xff,gr5 ; make sure all chip-selects are enabled
- sti gr5,@(gr4,#0)
-
- sethi.p %hi(__region_CS1),gr4
- setlo %lo(__region_CS1),gr4
- sethi.p %hi(__region_CS1_M),gr5
- setlo %lo(__region_CS1_M),gr5
- sethi.p %hi(__region_CS1_C),gr6
- setlo %lo(__region_CS1_C),gr6
- sti gr4,@(gr10,#1*0x08)
- sti gr5,@(gr10,#1*0x08+0x100)
- sti gr6,@(gr11,#1*0x08)
- sethi.p %hi(__region_CS2),gr4
- setlo %lo(__region_CS2),gr4
- sethi.p %hi(__region_CS2_M),gr5
- setlo %lo(__region_CS2_M),gr5
- sethi.p %hi(__region_CS2_C),gr6
- setlo %lo(__region_CS2_C),gr6
- sti gr4,@(gr10,#2*0x08)
- sti gr5,@(gr10,#2*0x08+0x100)
- sti gr6,@(gr11,#2*0x08)
- sethi.p %hi(__region_CS3),gr4
- setlo %lo(__region_CS3),gr4
- sethi.p %hi(__region_CS3_M),gr5
- setlo %lo(__region_CS3_M),gr5
- sethi.p %hi(__region_CS3_C),gr6
- setlo %lo(__region_CS3_C),gr6
- sti gr4,@(gr10,#3*0x08)
- sti gr5,@(gr10,#3*0x08+0x100)
- sti gr6,@(gr11,#3*0x08)
- sethi.p %hi(__region_CS4),gr4
- setlo %lo(__region_CS4),gr4
- sethi.p %hi(__region_CS4_M),gr5
- setlo %lo(__region_CS4_M),gr5
- sethi.p %hi(__region_CS4_C),gr6
- setlo %lo(__region_CS4_C),gr6
- sti gr4,@(gr10,#4*0x08)
- sti gr5,@(gr10,#4*0x08+0x100)
- sti gr6,@(gr11,#4*0x08)
- sethi.p %hi(__region_CS5),gr4
- setlo %lo(__region_CS5),gr4
- sethi.p %hi(__region_CS5_M),gr5
- setlo %lo(__region_CS5_M),gr5
- sethi.p %hi(__region_CS5_C),gr6
- setlo %lo(__region_CS5_C),gr6
- sti gr4,@(gr10,#5*0x08)
- sti gr5,@(gr10,#5*0x08+0x100)
- sti gr6,@(gr11,#5*0x08)
- sethi.p %hi(__region_CS6),gr4
- setlo %lo(__region_CS6),gr4
- sethi.p %hi(__region_CS6_M),gr5
- setlo %lo(__region_CS6_M),gr5
- sethi.p %hi(__region_CS6_C),gr6
- setlo %lo(__region_CS6_C),gr6
- sti gr4,@(gr10,#6*0x08)
- sti gr5,@(gr10,#6*0x08+0x100)
- sti gr6,@(gr11,#6*0x08)
- sethi.p %hi(__region_CS7),gr4
- setlo %lo(__region_CS7),gr4
- sethi.p %hi(__region_CS7_M),gr5
- setlo %lo(__region_CS7_M),gr5
- sethi.p %hi(__region_CS7_C),gr6
- setlo %lo(__region_CS7_C),gr6
- sti gr4,@(gr10,#7*0x08)
- sti gr5,@(gr10,#7*0x08+0x100)
- sti gr6,@(gr11,#7*0x08)
- membar
- bar
-
- # adjust LED bank address
- sethi.p %hi(LED_ADDR - 0x20000000 +__region_CS2),gr30
- setlo %lo(LED_ADDR - 0x20000000 +__region_CS2),gr30
- bralr
-
-###############################################################################
-#
-# determine the total SDRAM size
-#
-# ENTRY: EXIT:
-# GR25 - SDRAM size
-# GR26 &__head_reference [saved]
-# GR30 LED address [saved]
-#
-###############################################################################
- .globl __head_fr401_survey_sdram
-__head_fr401_survey_sdram:
- sethi.p %hi(__400_DAM0),gr11
- setlo %lo(__400_DAM0),gr11
- sethi.p %hi(__400_DBR0),gr12
- setlo %lo(__400_DBR0),gr12
-
- sethi.p %hi(0xfe000000),gr17 ; unused SDRAM DBR value
- setlo %lo(0xfe000000),gr17
- setlos #0,gr25
-
- ldi @(gr12,#0x00),gr4 ; DAR0
- subcc gr4,gr17,gr0,icc0
- beq icc0,#0,__head_no_DCS0
- ldi @(gr11,#0x00),gr6 ; DAM0: bits 31:20 match addr 31:20
- add gr25,gr6,gr25
- addi gr25,#1,gr25
-__head_no_DCS0:
-
- ldi @(gr12,#0x08),gr4 ; DAR1
- subcc gr4,gr17,gr0,icc0
- beq icc0,#0,__head_no_DCS1
- ldi @(gr11,#0x08),gr6 ; DAM1: bits 31:20 match addr 31:20
- add gr25,gr6,gr25
- addi gr25,#1,gr25
-__head_no_DCS1:
-
- # FR401/FR401A does not have DCS2/3
- movsg psr,gr3
- srli gr3,#25,gr3
- subicc gr3,#0x20>>1,gr0,icc0
- beq icc0,#0,__head_no_DCS3
-
- ldi @(gr12,#0x10),gr4 ; DAR2
- subcc gr4,gr17,gr0,icc0
- beq icc0,#0,__head_no_DCS2
- ldi @(gr11,#0x10),gr6 ; DAM2: bits 31:20 match addr 31:20
- add gr25,gr6,gr25
- addi gr25,#1,gr25
-__head_no_DCS2:
-
- ldi @(gr12,#0x18),gr4 ; DAR3
- subcc gr4,gr17,gr0,icc0
- beq icc0,#0,__head_no_DCS3
- ldi @(gr11,#0x18),gr6 ; DAM3: bits 31:20 match addr 31:20
- add gr25,gr6,gr25
- addi gr25,#1,gr25
-__head_no_DCS3:
- bralr
-
-###############################################################################
-#
-# set the protection map with the I/DAMPR registers
-#
-# ENTRY: EXIT:
-# GR25 SDRAM size [saved]
-# GR26 &__head_reference [saved]
-# GR30 LED address [saved]
-#
-###############################################################################
- .globl __head_fr401_set_protection
-__head_fr401_set_protection:
- movsg lr,gr27
-
- # set the I/O region protection registers for FR401/3/5
- sethi.p %hi(__region_IO),gr5
- setlo %lo(__region_IO),gr5
- ori gr5,#xAMPRx_SS_512Mb|xAMPRx_S_KERNEL|xAMPRx_C|xAMPRx_V,gr5
- movgs gr0,iampr7
- movgs gr5,dampr7 ; General I/O tile
-
- # need to tile the remaining IAMPR/DAMPR registers to cover as much of the RAM as possible
- # - start with the highest numbered registers
- sethi.p %hi(__kernel_image_end),gr8
- setlo %lo(__kernel_image_end),gr8
- sethi.p %hi(32768),gr4 ; allow for a maximal allocator bitmap
- setlo %lo(32768),gr4
- add gr8,gr4,gr8
- sethi.p %hi(1024*2048-1),gr4 ; round up to nearest 2MiB
- setlo %lo(1024*2048-1),gr4
- add.p gr8,gr4,gr8
- not gr4,gr4
- and gr8,gr4,gr8
-
- sethi.p %hi(__page_offset),gr9
- setlo %lo(__page_offset),gr9
- add gr9,gr25,gr9
-
- # GR8 = base of uncovered RAM
- # GR9 = top of uncovered RAM
-
-#ifdef CONFIG_MB93093_PDK
- sethi.p %hi(__region_CS2),gr4
- setlo %lo(__region_CS2),gr4
- ori gr4,#xAMPRx_SS_1Mb|xAMPRx_S_KERNEL|xAMPRx_C|xAMPRx_V,gr4
- movgs gr4,dampr6
- movgs gr0,iampr6
-#else
- call __head_split_region
- movgs gr4,iampr6
- movgs gr5,dampr6
-#endif
- call __head_split_region
- movgs gr4,iampr5
- movgs gr5,dampr5
- call __head_split_region
- movgs gr4,iampr4
- movgs gr5,dampr4
- call __head_split_region
- movgs gr4,iampr3
- movgs gr5,dampr3
- call __head_split_region
- movgs gr4,iampr2
- movgs gr5,dampr2
- call __head_split_region
- movgs gr4,iampr1
- movgs gr5,dampr1
-
- # cover kernel core image with kernel-only segment
- sethi.p %hi(__page_offset),gr8
- setlo %lo(__page_offset),gr8
- call __head_split_region
-
-#ifdef CONFIG_PROTECT_KERNEL
- ori.p gr4,#xAMPRx_S_KERNEL,gr4
- ori gr5,#xAMPRx_S_KERNEL,gr5
-#endif
-
- movgs gr4,iampr0
- movgs gr5,dampr0
- jmpl @(gr27,gr0)
diff --git a/arch/frv/kernel/head-uc-fr451.S b/arch/frv/kernel/head-uc-fr451.S
deleted file mode 100644
index b2a76c4a1786..000000000000
--- a/arch/frv/kernel/head-uc-fr451.S
+++ /dev/null
@@ -1,174 +0,0 @@
-/* head-uc-fr451.S: FR451 uc-linux specific bits of initialisation
- *
- * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
- * Written by David Howells (dhowells@redhat.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.
- */
-
-#include <linux/init.h>
-#include <linux/threads.h>
-#include <linux/linkage.h>
-#include <asm/ptrace.h>
-#include <asm/page.h>
-#include <asm/spr-regs.h>
-#include <asm/mb86943a.h>
-#include "head.inc"
-
-
-#define __400_DBR0 0xfe000e00
-#define __400_DBR1 0xfe000e08
-#define __400_DBR2 0xfe000e10
-#define __400_DBR3 0xfe000e18
-#define __400_DAM0 0xfe000f00
-#define __400_DAM1 0xfe000f08
-#define __400_DAM2 0xfe000f10
-#define __400_DAM3 0xfe000f18
-#define __400_LGCR 0xfe000010
-#define __400_LCR 0xfe000100
-#define __400_LSBR 0xfe000c00
-
- __INIT
- .balign 4
-
-###############################################################################
-#
-# set the protection map with the I/DAMPR registers
-#
-# ENTRY: EXIT:
-# GR25 SDRAM size [saved]
-# GR26 &__head_reference [saved]
-# GR30 LED address [saved]
-#
-###############################################################################
- .globl __head_fr451_set_protection
-__head_fr451_set_protection:
- movsg lr,gr27
-
- movgs gr0,dampr10
- movgs gr0,damlr10
- movgs gr0,dampr9
- movgs gr0,damlr9
- movgs gr0,dampr8
- movgs gr0,damlr8
-
- # set the I/O region protection registers for FR401/3/5
- sethi.p %hi(__region_IO),gr5
- setlo %lo(__region_IO),gr5
- sethi.p %hi(0x1fffffff),gr7
- setlo %lo(0x1fffffff),gr7
- ori gr5,#xAMPRx_SS_512Mb|xAMPRx_S_KERNEL|xAMPRx_C|xAMPRx_V,gr5
- movgs gr5,dampr11 ; General I/O tile
- movgs gr7,damlr11
-
- # need to tile the remaining IAMPR/DAMPR registers to cover as much of the RAM as possible
- # - start with the highest numbered registers
- sethi.p %hi(__kernel_image_end),gr8
- setlo %lo(__kernel_image_end),gr8
- sethi.p %hi(32768),gr4 ; allow for a maximal allocator bitmap
- setlo %lo(32768),gr4
- add gr8,gr4,gr8
- sethi.p %hi(1024*2048-1),gr4 ; round up to nearest 2MiB
- setlo %lo(1024*2048-1),gr4
- add.p gr8,gr4,gr8
- not gr4,gr4
- and gr8,gr4,gr8
-
- sethi.p %hi(__page_offset),gr9
- setlo %lo(__page_offset),gr9
- add gr9,gr25,gr9
-
- sethi.p %hi(0xffffc000),gr11
- setlo %lo(0xffffc000),gr11
-
- # GR8 = base of uncovered RAM
- # GR9 = top of uncovered RAM
- # GR11 = xAMLR mask
- LEDS 0x3317
- call __head_split_region
- movgs gr4,iampr7
- movgs gr6,iamlr7
- movgs gr5,dampr7
- movgs gr7,damlr7
-
- LEDS 0x3316
- call __head_split_region
- movgs gr4,iampr6
- movgs gr6,iamlr6
- movgs gr5,dampr6
- movgs gr7,damlr6
-
- LEDS 0x3315
- call __head_split_region
- movgs gr4,iampr5
- movgs gr6,iamlr5
- movgs gr5,dampr5
- movgs gr7,damlr5
-
- LEDS 0x3314
- call __head_split_region
- movgs gr4,iampr4
- movgs gr6,iamlr4
- movgs gr5,dampr4
- movgs gr7,damlr4
-
- LEDS 0x3313
- call __head_split_region
- movgs gr4,iampr3
- movgs gr6,iamlr3
- movgs gr5,dampr3
- movgs gr7,damlr3
-
- LEDS 0x3312
- call __head_split_region
- movgs gr4,iampr2
- movgs gr6,iamlr2
- movgs gr5,dampr2
- movgs gr7,damlr2
-
- LEDS 0x3311
- call __head_split_region
- movgs gr4,iampr1
- movgs gr6,iamlr1
- movgs gr5,dampr1
- movgs gr7,damlr1
-
- # cover kernel core image with kernel-only segment
- LEDS 0x3310
- sethi.p %hi(__page_offset),gr8
- setlo %lo(__page_offset),gr8
- call __head_split_region
-
-#ifdef CONFIG_PROTECT_KERNEL
- ori.p gr4,#xAMPRx_S_KERNEL,gr4
- ori gr5,#xAMPRx_S_KERNEL,gr5
-#endif
-
- movgs gr4,iampr0
- movgs gr6,iamlr0
- movgs gr5,dampr0
- movgs gr7,damlr0
-
- # start in TLB context 0 with no page tables
- movgs gr0,cxnr
- movgs gr0,ttbr
-
- # the FR451 also has an extra trap base register
- movsg tbr,gr4
- movgs gr4,btbr
-
- # turn on the timers as appropriate
- movgs gr0,timerh
- movgs gr0,timerl
- movgs gr0,timerd
- movsg hsr0,gr4
- sethi.p %hi(HSR0_ETMI),gr5
- setlo %lo(HSR0_ETMI),gr5
- or gr4,gr5,gr4
- movgs gr4,hsr0
-
- LEDS 0x3300
- jmpl @(gr27,gr0)
diff --git a/arch/frv/kernel/head-uc-fr555.S b/arch/frv/kernel/head-uc-fr555.S
deleted file mode 100644
index 5497aaf34f77..000000000000
--- a/arch/frv/kernel/head-uc-fr555.S
+++ /dev/null
@@ -1,347 +0,0 @@
-/* head-uc-fr555.S: FR555 uc-linux specific bits of initialisation
- *
- * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
- * Written by David Howells (dhowells@redhat.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.
- */
-
-#include <linux/init.h>
-#include <linux/threads.h>
-#include <linux/linkage.h>
-#include <asm/ptrace.h>
-#include <asm/page.h>
-#include <asm/spr-regs.h>
-#include <asm/mb86943a.h>
-#include "head.inc"
-
-
-#define __551_DARS0 0xfeff0100
-#define __551_DARS1 0xfeff0104
-#define __551_DARS2 0xfeff0108
-#define __551_DARS3 0xfeff010c
-#define __551_DAMK0 0xfeff0110
-#define __551_DAMK1 0xfeff0114
-#define __551_DAMK2 0xfeff0118
-#define __551_DAMK3 0xfeff011c
-#define __551_LCR 0xfeff1100
-#define __551_LSBR 0xfeff1c00
-
- __INIT
- .balign 4
-
-###############################################################################
-#
-# describe the position and layout of the SDRAM controller registers
-#
-# ENTRY: EXIT:
-# GR5 - cacheline size
-# GR11 - displacement of 2nd SDRAM addr reg from GR14
-# GR12 - displacement of 3rd SDRAM addr reg from GR14
-# GR13 - displacement of 4th SDRAM addr reg from GR14
-# GR14 - address of 1st SDRAM addr reg
-# GR15 - amount to shift address by to match SDRAM addr reg
-# GR26 &__head_reference [saved]
-# GR30 LED address [saved]
-# CC0 - T if DARS0 is present
-# CC1 - T if DARS1 is present
-# CC2 - T if DARS2 is present
-# CC3 - T if DARS3 is present
-#
-###############################################################################
- .globl __head_fr555_describe_sdram
-__head_fr555_describe_sdram:
- sethi.p %hi(__551_DARS0),gr14
- setlo %lo(__551_DARS0),gr14
- setlos.p #__551_DARS1-__551_DARS0,gr11
- setlos #__551_DARS2-__551_DARS0,gr12
- setlos.p #__551_DARS3-__551_DARS0,gr13
- setlos #64,gr5 ; cacheline size
- setlos #20,gr15 ; amount to shift addr by
- setlos #0x00ff,gr4
- movgs gr4,cccr ; extant DARS/DAMK regs
- bralr
-
-###############################################################################
-#
-# rearrange the bus controller registers
-#
-# ENTRY: EXIT:
-# GR26 &__head_reference [saved]
-# GR30 LED address revised LED address
-#
-###############################################################################
- .globl __head_fr555_set_busctl
-__head_fr555_set_busctl:
- LEDS 0x100f
- sethi.p %hi(__551_LSBR),gr10
- setlo %lo(__551_LSBR),gr10
- sethi.p %hi(__551_LCR),gr11
- setlo %lo(__551_LCR),gr11
-
- # set the bus controller
- sethi.p %hi(__region_CS1),gr4
- setlo %lo(__region_CS1),gr4
- sethi.p %hi(__region_CS1_M),gr5
- setlo %lo(__region_CS1_M),gr5
- sethi.p %hi(__region_CS1_C),gr6
- setlo %lo(__region_CS1_C),gr6
- sti gr4,@(gr10,#1*0x08)
- sti gr5,@(gr10,#1*0x08+0x100)
- sti gr6,@(gr11,#1*0x08)
- sethi.p %hi(__region_CS2),gr4
- setlo %lo(__region_CS2),gr4
- sethi.p %hi(__region_CS2_M),gr5
- setlo %lo(__region_CS2_M),gr5
- sethi.p %hi(__region_CS2_C),gr6
- setlo %lo(__region_CS2_C),gr6
- sti gr4,@(gr10,#2*0x08)
- sti gr5,@(gr10,#2*0x08+0x100)
- sti gr6,@(gr11,#2*0x08)
- sethi.p %hi(__region_CS3),gr4
- setlo %lo(__region_CS3),gr4
- sethi.p %hi(__region_CS3_M),gr5
- setlo %lo(__region_CS3_M),gr5
- sethi.p %hi(__region_CS3_C),gr6
- setlo %lo(__region_CS3_C),gr6
- sti gr4,@(gr10,#3*0x08)
- sti gr5,@(gr10,#3*0x08+0x100)
- sti gr6,@(gr11,#3*0x08)
- sethi.p %hi(__region_CS4),gr4
- setlo %lo(__region_CS4),gr4
- sethi.p %hi(__region_CS4_M),gr5
- setlo %lo(__region_CS4_M),gr5
- sethi.p %hi(__region_CS4_C),gr6
- setlo %lo(__region_CS4_C),gr6
- sti gr4,@(gr10,#4*0x08)
- sti gr5,@(gr10,#4*0x08+0x100)
- sti gr6,@(gr11,#4*0x08)
- sethi.p %hi(__region_CS5),gr4
- setlo %lo(__region_CS5),gr4
- sethi.p %hi(__region_CS5_M),gr5
- setlo %lo(__region_CS5_M),gr5
- sethi.p %hi(__region_CS5_C),gr6
- setlo %lo(__region_CS5_C),gr6
- sti gr4,@(gr10,#5*0x08)
- sti gr5,@(gr10,#5*0x08+0x100)
- sti gr6,@(gr11,#5*0x08)
- sethi.p %hi(__region_CS6),gr4
- setlo %lo(__region_CS6),gr4
- sethi.p %hi(__region_CS6_M),gr5
- setlo %lo(__region_CS6_M),gr5
- sethi.p %hi(__region_CS6_C),gr6
- setlo %lo(__region_CS6_C),gr6
- sti gr4,@(gr10,#6*0x08)
- sti gr5,@(gr10,#6*0x08+0x100)
- sti gr6,@(gr11,#6*0x08)
- sethi.p %hi(__region_CS7),gr4
- setlo %lo(__region_CS7),gr4
- sethi.p %hi(__region_CS7_M),gr5
- setlo %lo(__region_CS7_M),gr5
- sethi.p %hi(__region_CS7_C),gr6
- setlo %lo(__region_CS7_C),gr6
- sti gr4,@(gr10,#7*0x08)
- sti gr5,@(gr10,#7*0x08+0x100)
- sti gr6,@(gr11,#7*0x08)
- membar
- bar
-
- # adjust LED bank address
-#ifdef CONFIG_MB93091_VDK
- sethi.p %hi(LED_ADDR - 0x20000000 +__region_CS2),gr30
- setlo %lo(LED_ADDR - 0x20000000 +__region_CS2),gr30
-#endif
- bralr
-
-###############################################################################
-#
-# determine the total SDRAM size
-#
-# ENTRY: EXIT:
-# GR25 - SDRAM size
-# GR26 &__head_reference [saved]
-# GR30 LED address [saved]
-#
-###############################################################################
- .globl __head_fr555_survey_sdram
-__head_fr555_survey_sdram:
- sethi.p %hi(__551_DAMK0),gr11
- setlo %lo(__551_DAMK0),gr11
- sethi.p %hi(__551_DARS0),gr12
- setlo %lo(__551_DARS0),gr12
-
- sethi.p %hi(0xfff),gr17 ; unused SDRAM AMK value
- setlo %lo(0xfff),gr17
- setlos #0,gr25
-
- ldi @(gr11,#0x00),gr6 ; DAMK0: bits 11:0 match addr 11:0
- subcc gr6,gr17,gr0,icc0
- beq icc0,#0,__head_no_DCS0
- ldi @(gr12,#0x00),gr4 ; DARS0
- add gr25,gr6,gr25
- addi gr25,#1,gr25
-__head_no_DCS0:
-
- ldi @(gr11,#0x04),gr6 ; DAMK1: bits 11:0 match addr 11:0
- subcc gr6,gr17,gr0,icc0
- beq icc0,#0,__head_no_DCS1
- ldi @(gr12,#0x04),gr4 ; DARS1
- add gr25,gr6,gr25
- addi gr25,#1,gr25
-__head_no_DCS1:
-
- ldi @(gr11,#0x8),gr6 ; DAMK2: bits 11:0 match addr 11:0
- subcc gr6,gr17,gr0,icc0
- beq icc0,#0,__head_no_DCS2
- ldi @(gr12,#0x8),gr4 ; DARS2
- add gr25,gr6,gr25
- addi gr25,#1,gr25
-__head_no_DCS2:
-
- ldi @(gr11,#0xc),gr6 ; DAMK3: bits 11:0 match addr 11:0
- subcc gr6,gr17,gr0,icc0
- beq icc0,#0,__head_no_DCS3
- ldi @(gr12,#0xc),gr4 ; DARS3
- add gr25,gr6,gr25
- addi gr25,#1,gr25
-__head_no_DCS3:
-
- slli gr25,#20,gr25 ; shift [11:0] -> [31:20]
- bralr
-
-###############################################################################
-#
-# set the protection map with the I/DAMPR registers
-#
-# ENTRY: EXIT:
-# GR25 SDRAM size saved
-# GR30 LED address saved
-#
-###############################################################################
- .globl __head_fr555_set_protection
-__head_fr555_set_protection:
- movsg lr,gr27
-
- sethi.p %hi(0xfff00000),gr11
- setlo %lo(0xfff00000),gr11
-
- # set the I/O region protection registers for FR555
- sethi.p %hi(__region_IO),gr7
- setlo %lo(__region_IO),gr7
- ori gr7,#xAMPRx_SS_512Mb|xAMPRx_S_KERNEL|xAMPRx_C|xAMPRx_V,gr5
- movgs gr0,iampr15
- movgs gr0,iamlr15
- movgs gr5,dampr15
- movgs gr7,damlr15
-
- # need to tile the remaining IAMPR/DAMPR registers to cover as much of the RAM as possible
- # - start with the highest numbered registers
- sethi.p %hi(__kernel_image_end),gr8
- setlo %lo(__kernel_image_end),gr8
- sethi.p %hi(32768),gr4 ; allow for a maximal allocator bitmap
- setlo %lo(32768),gr4
- add gr8,gr4,gr8
- sethi.p %hi(1024*2048-1),gr4 ; round up to nearest 2MiB
- setlo %lo(1024*2048-1),gr4
- add.p gr8,gr4,gr8
- not gr4,gr4
- and gr8,gr4,gr8
-
- sethi.p %hi(__page_offset),gr9
- setlo %lo(__page_offset),gr9
- add gr9,gr25,gr9
-
- # GR8 = base of uncovered RAM
- # GR9 = top of uncovered RAM
- # GR11 - mask for DAMLR/IAMLR regs
- #
- call __head_split_region
- movgs gr4,iampr14
- movgs gr6,iamlr14
- movgs gr5,dampr14
- movgs gr7,damlr14
- call __head_split_region
- movgs gr4,iampr13
- movgs gr6,iamlr13
- movgs gr5,dampr13
- movgs gr7,damlr13
- call __head_split_region
- movgs gr4,iampr12
- movgs gr6,iamlr12
- movgs gr5,dampr12
- movgs gr7,damlr12
- call __head_split_region
- movgs gr4,iampr11
- movgs gr6,iamlr11
- movgs gr5,dampr11
- movgs gr7,damlr11
- call __head_split_region
- movgs gr4,iampr10
- movgs gr6,iamlr10
- movgs gr5,dampr10
- movgs gr7,damlr10
- call __head_split_region
- movgs gr4,iampr9
- movgs gr6,iamlr9
- movgs gr5,dampr9
- movgs gr7,damlr9
- call __head_split_region
- movgs gr4,iampr8
- movgs gr6,iamlr8
- movgs gr5,dampr8
- movgs gr7,damlr8
-
- call __head_split_region
- movgs gr4,iampr7
- movgs gr6,iamlr7
- movgs gr5,dampr7
- movgs gr7,damlr7
- call __head_split_region
- movgs gr4,iampr6
- movgs gr6,iamlr6
- movgs gr5,dampr6
- movgs gr7,damlr6
- call __head_split_region
- movgs gr4,iampr5
- movgs gr6,iamlr5
- movgs gr5,dampr5
- movgs gr7,damlr5
- call __head_split_region
- movgs gr4,iampr4
- movgs gr6,iamlr4
- movgs gr5,dampr4
- movgs gr7,damlr4
- call __head_split_region
- movgs gr4,iampr3
- movgs gr6,iamlr3
- movgs gr5,dampr3
- movgs gr7,damlr3
- call __head_split_region
- movgs gr4,iampr2
- movgs gr6,iamlr2
- movgs gr5,dampr2
- movgs gr7,damlr2
- call __head_split_region
- movgs gr4,iampr1
- movgs gr6,iamlr1
- movgs gr5,dampr1
- movgs gr7,damlr1
-
- # cover kernel core image with kernel-only segment
- sethi.p %hi(__page_offset),gr8
- setlo %lo(__page_offset),gr8
- call __head_split_region
-
-#ifdef CONFIG_PROTECT_KERNEL
- ori.p gr4,#xAMPRx_S_KERNEL,gr4
- ori gr5,#xAMPRx_S_KERNEL,gr5
-#endif
-
- movgs gr4,iampr0
- movgs gr6,iamlr0
- movgs gr5,dampr0
- movgs gr7,damlr0
- jmpl @(gr27,gr0)
diff --git a/arch/frv/kernel/head.S b/arch/frv/kernel/head.S
deleted file mode 100644
index a7d0bea9c036..000000000000
--- a/arch/frv/kernel/head.S
+++ /dev/null
@@ -1,638 +0,0 @@
-/* head.S: kernel entry point for FR-V kernel
- *
- * Copyright (C) 2003, 2004 Red Hat, Inc. All Rights Reserved.
- * Written by David Howells (dhowells@redhat.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.
- */
-
-#include <linux/init.h>
-#include <linux/threads.h>
-#include <linux/linkage.h>
-#include <asm/thread_info.h>
-#include <asm/ptrace.h>
-#include <asm/page.h>
-#include <asm/spr-regs.h>
-#include <asm/mb86943a.h>
-#include <asm/cache.h>
-#include "head.inc"
-
-###############################################################################
-#
-# void _boot(unsigned long magic, char *command_line) __attribute__((noreturn))
-#
-# - if magic is 0xdead1eaf, then command_line is assumed to point to the kernel
-# command line string
-#
-###############################################################################
- __HEAD
- .balign 4
-
- .globl _boot, __head_reference
- .type _boot,@function
-_boot:
-__head_reference:
- sethi.p %hi(LED_ADDR),gr30
- setlo %lo(LED_ADDR),gr30
-
- LEDS 0x0000
-
- # calculate reference address for PC-relative stuff
- call 0f
-0: movsg lr,gr26
- addi gr26,#__head_reference-0b,gr26
-
- # invalidate and disable both of the caches and turn off the memory access checking
- dcef @(gr0,gr0),1
- bar
-
- sethi.p %hi(~(HSR0_ICE|HSR0_DCE|HSR0_CBM|HSR0_EIMMU|HSR0_EDMMU)),gr4
- setlo %lo(~(HSR0_ICE|HSR0_DCE|HSR0_CBM|HSR0_EIMMU|HSR0_EDMMU)),gr4
- movsg hsr0,gr5
- and gr4,gr5,gr5
- movgs gr5,hsr0
- movsg hsr0,gr5
-
- LEDS 0x0001
-
- icei @(gr0,gr0),1
- dcei @(gr0,gr0),1
- bar
-
- # turn the instruction cache back on
- sethi.p %hi(HSR0_ICE),gr4
- setlo %lo(HSR0_ICE),gr4
- movsg hsr0,gr5
- or gr4,gr5,gr5
- movgs gr5,hsr0
- movsg hsr0,gr5
-
- bar
-
- LEDS 0x0002
-
- # retrieve the parameters (including command line) before we overwrite them
- sethi.p %hi(0xdead1eaf),gr7
- setlo %lo(0xdead1eaf),gr7
- subcc gr7,gr8,gr0,icc0
- bne icc0,#0,__head_no_parameters
-
- sethi.p %hi(redboot_command_line-1),gr6
- setlo %lo(redboot_command_line-1),gr6
- sethi.p %hi(__head_reference),gr4
- setlo %lo(__head_reference),gr4
- sub gr6,gr4,gr6
- add.p gr6,gr26,gr6
- subi gr9,#1,gr9
- setlos.p #511,gr4
- setlos #1,gr5
-
-__head_copy_cmdline:
- ldubu.p @(gr9,gr5),gr16
- subicc gr4,#1,gr4,icc0
- stbu.p gr16,@(gr6,gr5)
- subicc gr16,#0,gr0,icc1
- bls icc0,#0,__head_end_cmdline
- bne icc1,#1,__head_copy_cmdline
-__head_end_cmdline:
- stbu gr0,@(gr6,gr5)
-__head_no_parameters:
-
-###############################################################################
-#
-# we need to relocate the SDRAM to 0x00000000 (linux) or 0xC0000000 (uClinux)
-# - note that we're going to have to run entirely out of the icache whilst
-# fiddling with the SDRAM controller registers
-#
-###############################################################################
-#ifdef CONFIG_MMU
- call __head_fr451_describe_sdram
-
-#else
- movsg psr,gr5
- srli gr5,#28,gr5
- subicc gr5,#3,gr0,icc0
- beq icc0,#0,__head_fr551_sdram
-
- call __head_fr401_describe_sdram
- bra __head_do_sdram
-
-__head_fr551_sdram:
- call __head_fr555_describe_sdram
- LEDS 0x000d
-
-__head_do_sdram:
-#endif
-
- # preload the registers with invalid values in case any DBR/DARS are marked not present
- sethi.p %hi(0xfe000000),gr17 ; unused SDRAM DBR value
- setlo %lo(0xfe000000),gr17
- or.p gr17,gr0,gr20
- or gr17,gr0,gr21
- or.p gr17,gr0,gr22
- or gr17,gr0,gr23
-
- # consult the SDRAM controller CS address registers
- cld @(gr14,gr0 ),gr20, cc0,#1 ; DBR0 / DARS0
- cld @(gr14,gr11),gr21, cc1,#1 ; DBR1 / DARS1
- cld @(gr14,gr12),gr22, cc2,#1 ; DBR2 / DARS2
- cld.p @(gr14,gr13),gr23, cc3,#1 ; DBR3 / DARS3
-
- sll gr20,gr15,gr20 ; shift values up for FR551
- sll gr21,gr15,gr21
- sll gr22,gr15,gr22
- sll gr23,gr15,gr23
-
- LEDS 0x0003
-
- # assume the lowest valid CS line to be the SDRAM base and get its address
- subcc gr20,gr17,gr0,icc0
- subcc.p gr21,gr17,gr0,icc1
- subcc gr22,gr17,gr0,icc2
- subcc.p gr23,gr17,gr0,icc3
- ckne icc0,cc4 ; T if DBR0 != 0xfe000000
- ckne icc1,cc5
- ckne icc2,cc6
- ckne icc3,cc7
- cor gr23,gr0,gr24, cc7,#1 ; GR24 = SDRAM base
- cor gr22,gr0,gr24, cc6,#1
- cor gr21,gr0,gr24, cc5,#1
- cor gr20,gr0,gr24, cc4,#1
-
- # calculate the displacement required to get the SDRAM into the right place in memory
- sethi.p %hi(__sdram_base),gr16
- setlo %lo(__sdram_base),gr16
- sub gr16,gr24,gr16 ; delta = __sdram_base - DBRx
-
- # calculate the new values to go in the controller regs
- cadd.p gr20,gr16,gr20, cc4,#1 ; DCS#0 (new) = DCS#0 (old) + delta
- cadd gr21,gr16,gr21, cc5,#1
- cadd.p gr22,gr16,gr22, cc6,#1
- cadd gr23,gr16,gr23, cc7,#1
-
- srl gr20,gr15,gr20 ; shift values down for FR551
- srl gr21,gr15,gr21
- srl gr22,gr15,gr22
- srl gr23,gr15,gr23
-
- # work out the address at which the reg updater resides and lock it into icache
- # also work out the address the updater will jump to when finished
- sethi.p %hi(__head_move_sdram-__head_reference),gr18
- setlo %lo(__head_move_sdram-__head_reference),gr18
- sethi.p %hi(__head_sdram_moved-__head_reference),gr19
- setlo %lo(__head_sdram_moved-__head_reference),gr19
- add.p gr18,gr26,gr18
- add gr19,gr26,gr19
- add.p gr19,gr16,gr19 ; moved = addr + (__sdram_base - DBRx)
- add gr18,gr5,gr4 ; two cachelines probably required
-
- icpl gr18,gr0,#1 ; load and lock the cachelines
- icpl gr4,gr0,#1
- LEDS 0x0004
- membar
- bar
- jmpl @(gr18,gr0)
-
- .balign L1_CACHE_BYTES
-__head_move_sdram:
- cst gr20,@(gr14,gr0 ), cc4,#1
- cst gr21,@(gr14,gr11), cc5,#1
- cst gr22,@(gr14,gr12), cc6,#1
- cst gr23,@(gr14,gr13), cc7,#1
- cld @(gr14,gr0 ),gr20, cc4,#1
- cld @(gr14,gr11),gr21, cc5,#1
- cld @(gr14,gr12),gr22, cc4,#1
- cld @(gr14,gr13),gr23, cc7,#1
- bar
- membar
- jmpl @(gr19,gr0)
-
- .balign L1_CACHE_BYTES
-__head_sdram_moved:
- icul gr18
- add gr18,gr5,gr4
- icul gr4
- icei @(gr0,gr0),1
- dcei @(gr0,gr0),1
-
- LEDS 0x0005
-
- # recalculate reference address
- call 0f
-0: movsg lr,gr26
- addi gr26,#__head_reference-0b,gr26
-
-
-###############################################################################
-#
-# move the kernel image down to the bottom of the SDRAM
-#
-###############################################################################
- sethi.p %hi(__kernel_image_size_no_bss+15),gr4
- setlo %lo(__kernel_image_size_no_bss+15),gr4
- srli.p gr4,#4,gr4 ; count
- or gr26,gr26,gr16 ; source
-
- sethi.p %hi(__sdram_base),gr17 ; destination
- setlo %lo(__sdram_base),gr17
-
- setlos #8,gr5
- sub.p gr16,gr5,gr16 ; adjust src for LDDU
- sub gr17,gr5,gr17 ; adjust dst for LDDU
-
- sethi.p %hi(__head_move_kernel-__head_reference),gr18
- setlo %lo(__head_move_kernel-__head_reference),gr18
- sethi.p %hi(__head_kernel_moved-__head_reference+__sdram_base),gr19
- setlo %lo(__head_kernel_moved-__head_reference+__sdram_base),gr19
- add gr18,gr26,gr18
- icpl gr18,gr0,#1
- jmpl @(gr18,gr0)
-
- .balign 32
-__head_move_kernel:
- lddu @(gr16,gr5),gr10
- lddu @(gr16,gr5),gr12
- stdu.p gr10,@(gr17,gr5)
- subicc gr4,#1,gr4,icc0
- stdu.p gr12,@(gr17,gr5)
- bhi icc0,#0,__head_move_kernel
- jmpl @(gr19,gr0)
-
- .balign 32
-__head_kernel_moved:
- icul gr18
- icei @(gr0,gr0),1
- dcei @(gr0,gr0),1
-
- LEDS 0x0006
-
- # recalculate reference address
- call 0f
-0: movsg lr,gr26
- addi gr26,#__head_reference-0b,gr26
-
-
-###############################################################################
-#
-# rearrange the iomem map and set the protection registers
-#
-###############################################################################
-
-#ifdef CONFIG_MMU
- LEDS 0x3301
- call __head_fr451_set_busctl
- LEDS 0x3303
- call __head_fr451_survey_sdram
- LEDS 0x3305
- call __head_fr451_set_protection
-
-#else
- movsg psr,gr5
- srli gr5,#PSR_IMPLE_SHIFT,gr5
- subicc gr5,#PSR_IMPLE_FR551,gr0,icc0
- beq icc0,#0,__head_fr555_memmap
- subicc gr5,#PSR_IMPLE_FR451,gr0,icc0
- beq icc0,#0,__head_fr451_memmap
-
- LEDS 0x3101
- call __head_fr401_set_busctl
- LEDS 0x3103
- call __head_fr401_survey_sdram
- LEDS 0x3105
- call __head_fr401_set_protection
- bra __head_done_memmap
-
-__head_fr451_memmap:
- LEDS 0x3301
- call __head_fr401_set_busctl
- LEDS 0x3303
- call __head_fr401_survey_sdram
- LEDS 0x3305
- call __head_fr451_set_protection
- bra __head_done_memmap
-
-__head_fr555_memmap:
- LEDS 0x3501
- call __head_fr555_set_busctl
- LEDS 0x3503
- call __head_fr555_survey_sdram
- LEDS 0x3505
- call __head_fr555_set_protection
-
-__head_done_memmap:
-#endif
- LEDS 0x0007
-
-###############################################################################
-#
-# turn the data cache and MMU on
-# - for the FR451 this'll mean that the window through which the kernel is
-# viewed will change
-#
-###############################################################################
-
-#ifdef CONFIG_MMU
-#define MMUMODE HSR0_EIMMU|HSR0_EDMMU|HSR0_EXMMU|HSR0_EDAT|HSR0_XEDAT
-#else
-#define MMUMODE HSR0_EIMMU|HSR0_EDMMU
-#endif
-
- movsg hsr0,gr5
-
- sethi.p %hi(MMUMODE),gr4
- setlo %lo(MMUMODE),gr4
- or gr4,gr5,gr5
-
-#if defined(CONFIG_FRV_DEFL_CACHE_WTHRU)
- sethi.p %hi(HSR0_DCE|HSR0_CBM_WRITE_THRU),gr4
- setlo %lo(HSR0_DCE|HSR0_CBM_WRITE_THRU),gr4
-#elif defined(CONFIG_FRV_DEFL_CACHE_WBACK)
- sethi.p %hi(HSR0_DCE|HSR0_CBM_COPY_BACK),gr4
- setlo %lo(HSR0_DCE|HSR0_CBM_COPY_BACK),gr4
-#elif defined(CONFIG_FRV_DEFL_CACHE_WBEHIND)
- sethi.p %hi(HSR0_DCE|HSR0_CBM_COPY_BACK),gr4
- setlo %lo(HSR0_DCE|HSR0_CBM_COPY_BACK),gr4
-
- movsg psr,gr6
- srli gr6,#24,gr6
- cmpi gr6,#0x50,icc0 // FR451
- beq icc0,#0,0f
- cmpi gr6,#0x40,icc0 // FR405
- bne icc0,#0,1f
-0:
- # turn off write-allocate
- sethi.p %hi(HSR0_NWA),gr6
- setlo %lo(HSR0_NWA),gr6
- or gr4,gr6,gr4
-1:
-
-#else
-#error No default cache configuration set
-#endif
-
- or gr4,gr5,gr5
- movgs gr5,hsr0
- bar
-
- LEDS 0x0008
-
- sethi.p %hi(__head_mmu_enabled),gr19
- setlo %lo(__head_mmu_enabled),gr19
- jmpl @(gr19,gr0)
-
-__head_mmu_enabled:
- icei @(gr0,gr0),#1
- dcei @(gr0,gr0),#1
-
- LEDS 0x0009
-
-#ifdef CONFIG_MMU
- call __head_fr451_finalise_protection
-#endif
-
- LEDS 0x000a
-
-###############################################################################
-#
-# set up the runtime environment
-#
-###############################################################################
-
- # clear the BSS area
- sethi.p %hi(__bss_start),gr4
- setlo %lo(__bss_start),gr4
- sethi.p %hi(_end),gr5
- setlo %lo(_end),gr5
- or.p gr0,gr0,gr18
- or gr0,gr0,gr19
-
-0:
- stdi gr18,@(gr4,#0)
- stdi gr18,@(gr4,#8)
- stdi gr18,@(gr4,#16)
- stdi.p gr18,@(gr4,#24)
- addi gr4,#24,gr4
- subcc gr5,gr4,gr0,icc0
- bhi icc0,#2,0b
-
- LEDS 0x000b
-
- # save the SDRAM details
- sethi.p %hi(__sdram_old_base),gr4
- setlo %lo(__sdram_old_base),gr4
- st gr24,@(gr4,gr0)
-
- sethi.p %hi(__sdram_base),gr5
- setlo %lo(__sdram_base),gr5
- sethi.p %hi(memory_start),gr4
- setlo %lo(memory_start),gr4
- st gr5,@(gr4,gr0)
-
- add gr25,gr5,gr25
- sethi.p %hi(memory_end),gr4
- setlo %lo(memory_end),gr4
- st gr25,@(gr4,gr0)
-
- # point the TBR at the kernel trap table
- sethi.p %hi(__entry_kerneltrap_table),gr4
- setlo %lo(__entry_kerneltrap_table),gr4
- movgs gr4,tbr
-
- # set up the exception frame for init
- sethi.p %hi(__kernel_frame0_ptr),gr28
- setlo %lo(__kernel_frame0_ptr),gr28
- sethi.p %hi(_gp),gr16
- setlo %lo(_gp),gr16
- sethi.p %hi(__entry_usertrap_table),gr4
- setlo %lo(__entry_usertrap_table),gr4
-
- lddi @(gr28,#0),gr28 ; load __frame & current
- ldi.p @(gr29,#4),gr15 ; set current_thread
-
- or gr0,gr0,fp
- or gr28,gr0,sp
-
- sti.p gr4,@(gr28,REG_TBR)
- setlos #ISR_EDE|ISR_DTT_DIVBYZERO|ISR_EMAM_EXCEPTION,gr5
- movgs gr5,isr
-
- # turn on and off various CPU services
- movsg psr,gr22
- sethi.p %hi(#PSR_EM|PSR_EF|PSR_CM|PSR_NEM),gr4
- setlo %lo(#PSR_EM|PSR_EF|PSR_CM|PSR_NEM),gr4
- or gr22,gr4,gr22
- movgs gr22,psr
-
- andi gr22,#~(PSR_PIL|PSR_PS|PSR_S),gr22
- ori gr22,#PSR_ET,gr22
- sti gr22,@(gr28,REG_PSR)
-
-
-###############################################################################
-#
-# set up the registers and jump into the kernel
-#
-###############################################################################
-
- LEDS 0x000c
-
- sethi.p #0xe5e5,gr3
- setlo #0xe5e5,gr3
- or.p gr3,gr0,gr4
- or gr3,gr0,gr5
- or.p gr3,gr0,gr6
- or gr3,gr0,gr7
- or.p gr3,gr0,gr8
- or gr3,gr0,gr9
- or.p gr3,gr0,gr10
- or gr3,gr0,gr11
- or.p gr3,gr0,gr12
- or gr3,gr0,gr13
- or.p gr3,gr0,gr14
- or gr3,gr0,gr17
- or.p gr3,gr0,gr18
- or gr3,gr0,gr19
- or.p gr3,gr0,gr20
- or gr3,gr0,gr21
- or.p gr3,gr0,gr23
- or gr3,gr0,gr24
- or.p gr3,gr0,gr25
- or gr3,gr0,gr26
- or.p gr3,gr0,gr27
-# or gr3,gr0,gr30
- or gr3,gr0,gr31
- movgs gr0,lr
- movgs gr0,lcr
- movgs gr0,ccr
- movgs gr0,cccr
-
- # initialise the virtual interrupt handling
- subcc gr0,gr0,gr0,icc2 /* set Z, clear C */
-
-#ifdef CONFIG_MMU
- movgs gr3,scr2
- movgs gr3,scr3
-#endif
-
- LEDS 0x0fff
-
- # invoke the debugging stub if present
- # - arch/frv/kernel/debug-stub.c will shift control directly to init/main.c
- # (it will not return here)
- break
- .globl __debug_stub_init_break
-__debug_stub_init_break:
-
- # however, if you need to use an ICE, and don't care about using any userspace
- # debugging tools (such as the ptrace syscall), you can just step over the break
- # above and get to the kernel this way
- # look at arch/frv/kernel/debug-stub.c: debug_stub_init() to see what you've missed
- call start_kernel
-
- .globl __head_end
-__head_end:
- .size _boot, .-_boot
-
- # provide a point for GDB to place a break
- .section .text..start,"ax"
- .globl _start
- .balign 4
-_start:
- call _boot
-
- .previous
-###############################################################################
-#
-# split a tile off of the region defined by GR8-GR9
-#
-# ENTRY: EXIT:
-# GR4 - IAMPR value representing tile
-# GR5 - DAMPR value representing tile
-# GR6 - IAMLR value representing tile
-# GR7 - DAMLR value representing tile
-# GR8 region base pointer [saved]
-# GR9 region top pointer updated to exclude new tile
-# GR11 xAMLR mask [saved]
-# GR25 SDRAM size [saved]
-# GR30 LED address [saved]
-#
-# - GR8 and GR9 should be rounded up/down to the nearest megabyte before calling
-#
-###############################################################################
- .globl __head_split_region
- .type __head_split_region,@function
-__head_split_region:
- subcc.p gr9,gr8,gr4,icc0
- setlos #31,gr5
- scan.p gr4,gr0,gr6
- beq icc0,#0,__head_region_empty
- sub.p gr5,gr6,gr6 ; bit number of highest set bit (1MB=>20)
- setlos #1,gr4
- sll.p gr4,gr6,gr4 ; size of region (1 << bitno)
- subi gr6,#17,gr6 ; 1MB => 0x03
- slli.p gr6,#4,gr6 ; 1MB => 0x30
- sub gr9,gr4,gr9 ; move uncovered top down
-
- or gr9,gr6,gr4
- ori gr4,#xAMPRx_S_USER|xAMPRx_C_CACHED|xAMPRx_V,gr4
- or.p gr4,gr0,gr5
-
- and gr4,gr11,gr6
- and.p gr5,gr11,gr7
- bralr
-
-__head_region_empty:
- or.p gr0,gr0,gr4
- or gr0,gr0,gr5
- or.p gr0,gr0,gr6
- or gr0,gr0,gr7
- bralr
- .size __head_split_region, .-__head_split_region
-
-###############################################################################
-#
-# write the 32-bit hex number in GR8 to ttyS0
-#
-###############################################################################
-#if 0
- .globl __head_write_to_ttyS0
- .type __head_write_to_ttyS0,@function
-__head_write_to_ttyS0:
- sethi.p %hi(0xfeff9c00),gr31
- setlo %lo(0xfeff9c00),gr31
- setlos #8,gr20
-
-0: ldubi @(gr31,#5*8),gr21
- andi gr21,#0x60,gr21
- subicc gr21,#0x60,gr21,icc0
- bne icc0,#0,0b
-
-1: srli gr8,#28,gr21
- slli gr8,#4,gr8
-
- addi gr21,#'0',gr21
- subicc gr21,#'9',gr0,icc0
- bls icc0,#2,2f
- addi gr21,#'A'-'0'-10,gr21
-2:
- stbi gr21,@(gr31,#0*8)
- subicc gr20,#1,gr20,icc0
- bhi icc0,#2,1b
-
- setlos #'\r',gr21
- stbi gr21,@(gr31,#0*8)
-
- setlos #'\n',gr21
- stbi gr21,@(gr31,#0*8)
-
-3: ldubi @(gr31,#5*8),gr21
- andi gr21,#0x60,gr21
- subicc gr21,#0x60,gr21,icc0
- bne icc0,#0,3b
- bralr
-
- .size __head_write_to_ttyS0, .-__head_write_to_ttyS0
-#endif
diff --git a/arch/frv/kernel/head.inc b/arch/frv/kernel/head.inc
deleted file mode 100644
index bff66628b99a..000000000000
--- a/arch/frv/kernel/head.inc
+++ /dev/null
@@ -1,50 +0,0 @@
-/* head.inc: head common definitions -*- asm -*-
- *
- * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
- * Written by David Howells (dhowells@redhat.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.
- */
-
-
-#if defined(CONFIG_MB93090_MB00)
-#define LED_ADDR (0x21200000+4)
-
-.macro LEDS val
- sethi.p %hi(0xFFC00030),gr3
- setlo %lo(0xFFC00030),gr3
- lduh @(gr3,gr0),gr3
- andicc gr3,#0x100,gr0,icc0
- bne icc0,0,999f
-
- setlos #~\val,gr3
- st gr3,@(gr30,gr0)
- membar
- dcf @(gr30,gr0)
- 999:
-.endm
-
-#elif defined(CONFIG_MB93093_PDK)
-#define LED_ADDR (0x20000023)
-
-.macro LEDS val
- setlos #\val,gr3
- stb gr3,@(gr30,gr0)
- membar
-.endm
-
-#else
-#define LED_ADDR 0
-
-.macro LEDS val
-.endm
-#endif
-
-#ifdef CONFIG_MMU
-__sdram_base = 0x00000000 /* base address to which SDRAM relocated */
-#else
-__sdram_base = __page_offset /* base address to which SDRAM relocated */
-#endif
diff --git a/arch/frv/kernel/irq-mb93091.c b/arch/frv/kernel/irq-mb93091.c
deleted file mode 100644
index 091b2839be90..000000000000
--- a/arch/frv/kernel/irq-mb93091.c
+++ /dev/null
@@ -1,157 +0,0 @@
-/* irq-mb93091.c: MB93091 FPGA interrupt handling
- *
- * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved.
- * Written by David Howells (dhowells@redhat.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.
- */
-
-#include <linux/ptrace.h>
-#include <linux/errno.h>
-#include <linux/signal.h>
-#include <linux/sched.h>
-#include <linux/ioport.h>
-#include <linux/interrupt.h>
-#include <linux/init.h>
-#include <linux/irq.h>
-#include <linux/bitops.h>
-
-#include <asm/io.h>
-#include <asm/delay.h>
-#include <asm/irq.h>
-#include <asm/irc-regs.h>
-
-#define __reg16(ADDR) (*(volatile unsigned short *)(ADDR))
-
-#define __get_IMR() ({ __reg16(0xffc00004); })
-#define __set_IMR(M) do { __reg16(0xffc00004) = (M); wmb(); } while(0)
-#define __get_IFR() ({ __reg16(0xffc0000c); })
-#define __clr_IFR(M) do { __reg16(0xffc0000c) = ~(M); wmb(); } while(0)
-
-
-/*
- * on-motherboard FPGA PIC operations
- */
-static void frv_fpga_mask(struct irq_data *d)
-{
- uint16_t imr = __get_IMR();
-
- imr |= 1 << (d->irq - IRQ_BASE_FPGA);
-
- __set_IMR(imr);
-}
-
-static void frv_fpga_ack(struct irq_data *d)
-{
- __clr_IFR(1 << (d->irq - IRQ_BASE_FPGA));
-}
-
-static void frv_fpga_mask_ack(struct irq_data *d)
-{
- uint16_t imr = __get_IMR();
-
- imr |= 1 << (d->irq - IRQ_BASE_FPGA);
- __set_IMR(imr);
-
- __clr_IFR(1 << (d->irq - IRQ_BASE_FPGA));
-}
-
-static void frv_fpga_unmask(struct irq_data *d)
-{
- uint16_t imr = __get_IMR();
-
- imr &= ~(1 << (d->irq - IRQ_BASE_FPGA));
-
- __set_IMR(imr);
-}
-
-static struct irq_chip frv_fpga_pic = {
- .name = "mb93091",
- .irq_ack = frv_fpga_ack,
- .irq_mask = frv_fpga_mask,
- .irq_mask_ack = frv_fpga_mask_ack,
- .irq_unmask = frv_fpga_unmask,
-};
-
-/*
- * FPGA PIC interrupt handler
- */
-static irqreturn_t fpga_interrupt(int irq, void *_mask)
-{
- uint16_t imr, mask = (unsigned long) _mask;
-
- imr = __get_IMR();
- mask = mask & ~imr & __get_IFR();
-
- /* poll all the triggered IRQs */
- while (mask) {
- int irq;
-
- asm("scan %1,gr0,%0" : "=r"(irq) : "r"(mask));
- irq = 31 - irq;
- mask &= ~(1 << irq);
-
- generic_handle_irq(IRQ_BASE_FPGA + irq);
- }
-
- return IRQ_HANDLED;
-}
-
-/*
- * define an interrupt action for each FPGA PIC output
- * - use dev_id to indicate the FPGA PIC input to output mappings
- */
-static struct irqaction fpga_irq[4] = {
- [0] = {
- .handler = fpga_interrupt,
- .flags = IRQF_SHARED,
- .name = "fpga.0",
- .dev_id = (void *) 0x0028UL,
- },
- [1] = {
- .handler = fpga_interrupt,
- .flags = IRQF_SHARED,
- .name = "fpga.1",
- .dev_id = (void *) 0x0050UL,
- },
- [2] = {
- .handler = fpga_interrupt,
- .flags = IRQF_SHARED,
- .name = "fpga.2",
- .dev_id = (void *) 0x1c00UL,
- },
- [3] = {
- .handler = fpga_interrupt,
- .flags = IRQF_SHARED,
- .name = "fpga.3",
- .dev_id = (void *) 0x6386UL,
- }
-};
-
-/*
- * initialise the motherboard FPGA's PIC
- */
-void __init fpga_init(void)
-{
- int irq;
-
- /* all PIC inputs are all set to be low-level driven, apart from the
- * NMI button (15) which is fixed at falling-edge
- */
- __set_IMR(0x7ffe);
- __clr_IFR(0x0000);
-
- for (irq = IRQ_BASE_FPGA + 1; irq <= IRQ_BASE_FPGA + 14; irq++)
- irq_set_chip_and_handler(irq, &frv_fpga_pic, handle_level_irq);
-
- irq_set_chip_and_handler(IRQ_FPGA_NMI, &frv_fpga_pic, handle_edge_irq);
-
- /* the FPGA drives the first four external IRQ inputs on the CPU PIC */
- setup_irq(IRQ_CPU_EXTERNAL0, &fpga_irq[0]);
- setup_irq(IRQ_CPU_EXTERNAL1, &fpga_irq[1]);
- setup_irq(IRQ_CPU_EXTERNAL2, &fpga_irq[2]);
- setup_irq(IRQ_CPU_EXTERNAL3, &fpga_irq[3]);
-}
diff --git a/arch/frv/kernel/irq-mb93093.c b/arch/frv/kernel/irq-mb93093.c
deleted file mode 100644
index 1f3015cf80f5..000000000000
--- a/arch/frv/kernel/irq-mb93093.c
+++ /dev/null
@@ -1,129 +0,0 @@
-/* irq-mb93093.c: MB93093 FPGA interrupt handling
- *
- * Copyright (C) 2006 Red Hat, Inc. All Rights Reserved.
- * Written by David Howells (dhowells@redhat.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.
- */
-
-#include <linux/ptrace.h>
-#include <linux/errno.h>
-#include <linux/signal.h>
-#include <linux/sched.h>
-#include <linux/ioport.h>
-#include <linux/interrupt.h>
-#include <linux/init.h>
-#include <linux/irq.h>
-#include <linux/bitops.h>
-
-#include <asm/io.h>
-#include <asm/delay.h>
-#include <asm/irq.h>
-#include <asm/irc-regs.h>
-
-#define __reg16(ADDR) (*(volatile unsigned short *)(__region_CS2 + (ADDR)))
-
-#define __get_IMR() ({ __reg16(0x0a); })
-#define __set_IMR(M) do { __reg16(0x0a) = (M); wmb(); } while(0)
-#define __get_IFR() ({ __reg16(0x02); })
-#define __clr_IFR(M) do { __reg16(0x02) = ~(M); wmb(); } while(0)
-
-/*
- * off-CPU FPGA PIC operations
- */
-static void frv_fpga_mask(struct irq_data *d)
-{
- uint16_t imr = __get_IMR();
-
- imr |= 1 << (d->irq - IRQ_BASE_FPGA);
- __set_IMR(imr);
-}
-
-static void frv_fpga_ack(struct irq_data *d)
-{
- __clr_IFR(1 << (d->irq - IRQ_BASE_FPGA));
-}
-
-static void frv_fpga_mask_ack(struct irq_data *d)
-{
- uint16_t imr = __get_IMR();
-
- imr |= 1 << (d->irq - IRQ_BASE_FPGA);
- __set_IMR(imr);
-
- __clr_IFR(1 << (d->irq - IRQ_BASE_FPGA));
-}
-
-static void frv_fpga_unmask(struct irq_data *d)
-{
- uint16_t imr = __get_IMR();
-
- imr &= ~(1 << (d->irq - IRQ_BASE_FPGA));
-
- __set_IMR(imr);
-}
-
-static struct irq_chip frv_fpga_pic = {
- .name = "mb93093",
- .irq_ack = frv_fpga_ack,
- .irq_mask = frv_fpga_mask,
- .irq_mask_ack = frv_fpga_mask_ack,
- .irq_unmask = frv_fpga_unmask,
-};
-
-/*
- * FPGA PIC interrupt handler
- */
-static irqreturn_t fpga_interrupt(int irq, void *_mask)
-{
- uint16_t imr, mask = (unsigned long) _mask;
-
- imr = __get_IMR();
- mask = mask & ~imr & __get_IFR();
-
- /* poll all the triggered IRQs */
- while (mask) {
- int irq;
-
- asm("scan %1,gr0,%0" : "=r"(irq) : "r"(mask));
- irq = 31 - irq;
- mask &= ~(1 << irq);
-
- generic_handle_irq(IRQ_BASE_FPGA + irq);
- }
-
- return IRQ_HANDLED;
-}
-
-/*
- * define an interrupt action for each FPGA PIC output
- * - use dev_id to indicate the FPGA PIC input to output mappings
- */
-static struct irqaction fpga_irq[1] = {
- [0] = {
- .handler = fpga_interrupt,
- .name = "fpga.0",
- .dev_id = (void *) 0x0700UL,
- }
-};
-
-/*
- * initialise the motherboard FPGA's PIC
- */
-void __init fpga_init(void)
-{
- int irq;
-
- /* all PIC inputs are all set to be edge triggered */
- __set_IMR(0x0700);
- __clr_IFR(0x0000);
-
- for (irq = IRQ_BASE_FPGA + 8; irq <= IRQ_BASE_FPGA + 10; irq++)
- irq_set_chip_and_handler(irq, &frv_fpga_pic, handle_edge_irq);
-
- /* the FPGA drives external IRQ input #2 on the CPU PIC */
- setup_irq(IRQ_CPU_EXTERNAL2, &fpga_irq[0]);
-}
diff --git a/arch/frv/kernel/irq-mb93493.c b/arch/frv/kernel/irq-mb93493.c
deleted file mode 100644
index 8ca5aa4ff595..000000000000
--- a/arch/frv/kernel/irq-mb93493.c
+++ /dev/null
@@ -1,147 +0,0 @@
-/* irq-mb93493.c: MB93493 companion chip interrupt handler
- *
- * Copyright (C) 2006 Red Hat, Inc. All Rights Reserved.
- * Written by David Howells (dhowells@redhat.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.
- */
-
-#include <linux/ptrace.h>
-#include <linux/errno.h>
-#include <linux/signal.h>
-#include <linux/sched.h>
-#include <linux/ioport.h>
-#include <linux/interrupt.h>
-#include <linux/init.h>
-#include <linux/irq.h>
-#include <linux/bitops.h>
-
-#include <asm/io.h>
-#include <asm/delay.h>
-#include <asm/irq.h>
-#include <asm/irc-regs.h>
-#include <asm/mb93493-irqs.h>
-#include <asm/mb93493-regs.h>
-
-#define IRQ_ROUTE_ONE(X) (X##_ROUTE << (X - IRQ_BASE_MB93493))
-
-#define IRQ_ROUTING \
- (IRQ_ROUTE_ONE(IRQ_MB93493_VDC) | \
- IRQ_ROUTE_ONE(IRQ_MB93493_VCC) | \
- IRQ_ROUTE_ONE(IRQ_MB93493_AUDIO_OUT) | \
- IRQ_ROUTE_ONE(IRQ_MB93493_I2C_0) | \
- IRQ_ROUTE_ONE(IRQ_MB93493_I2C_1) | \
- IRQ_ROUTE_ONE(IRQ_MB93493_USB) | \
- IRQ_ROUTE_ONE(IRQ_MB93493_LOCAL_BUS) | \
- IRQ_ROUTE_ONE(IRQ_MB93493_PCMCIA) | \
- IRQ_ROUTE_ONE(IRQ_MB93493_GPIO) | \
- IRQ_ROUTE_ONE(IRQ_MB93493_AUDIO_IN))
-
-/*
- * daughter board PIC operations
- * - there is no way to ACK interrupts in the MB93493 chip
- */
-static void frv_mb93493_mask(struct irq_data *d)
-{
- uint32_t iqsr;
- volatile void *piqsr;
-
- if (IRQ_ROUTING & (1 << (d->irq - IRQ_BASE_MB93493)))
- piqsr = __addr_MB93493_IQSR(1);
- else
- piqsr = __addr_MB93493_IQSR(0);
-
- iqsr = readl(piqsr);
- iqsr &= ~(1 << (d->irq - IRQ_BASE_MB93493 + 16));
- writel(iqsr, piqsr);
-}
-
-static void frv_mb93493_ack(struct irq_data *d)
-{
-}
-
-static void frv_mb93493_unmask(struct irq_data *d)
-{
- uint32_t iqsr;
- volatile void *piqsr;
-
- if (IRQ_ROUTING & (1 << (d->irq - IRQ_BASE_MB93493)))
- piqsr = __addr_MB93493_IQSR(1);
- else
- piqsr = __addr_MB93493_IQSR(0);
-
- iqsr = readl(piqsr);
- iqsr |= 1 << (d->irq - IRQ_BASE_MB93493 + 16);
- writel(iqsr, piqsr);
-}
-
-static struct irq_chip frv_mb93493_pic = {
- .name = "mb93093",
- .irq_ack = frv_mb93493_ack,
- .irq_mask = frv_mb93493_mask,
- .irq_mask_ack = frv_mb93493_mask,
- .irq_unmask = frv_mb93493_unmask,
-};
-
-/*
- * MB93493 PIC interrupt handler
- */
-static irqreturn_t mb93493_interrupt(int irq, void *_piqsr)
-{
- volatile void *piqsr = _piqsr;
- uint32_t iqsr;
-
- iqsr = readl(piqsr);
- iqsr = iqsr & (iqsr >> 16) & 0xffff;
-
- /* poll all the triggered IRQs */
- while (iqsr) {
- int irq;
-
- asm("scan %1,gr0,%0" : "=r"(irq) : "r"(iqsr));
- irq = 31 - irq;
- iqsr &= ~(1 << irq);
-
- generic_handle_irq(IRQ_BASE_MB93493 + irq);
- }
-
- return IRQ_HANDLED;
-}
-
-/*
- * define an interrupt action for each MB93493 PIC output
- * - use dev_id to indicate the MB93493 PIC input to output mappings
- */
-static struct irqaction mb93493_irq[2] = {
- [0] = {
- .handler = mb93493_interrupt,
- .flags = IRQF_SHARED,
- .name = "mb93493.0",
- .dev_id = (void *) __addr_MB93493_IQSR(0),
- },
- [1] = {
- .handler = mb93493_interrupt,
- .flags = IRQF_SHARED,
- .name = "mb93493.1",
- .dev_id = (void *) __addr_MB93493_IQSR(1),
- }
-};
-
-/*
- * initialise the motherboard MB93493's PIC
- */
-void __init mb93493_init(void)
-{
- int irq;
-
- for (irq = IRQ_BASE_MB93493 + 0; irq <= IRQ_BASE_MB93493 + 10; irq++)
- irq_set_chip_and_handler(irq, &frv_mb93493_pic,
- handle_edge_irq);
-
- /* the MB93493 drives external IRQ inputs on the CPU PIC */
- setup_irq(IRQ_CPU_MB93493_0, &mb93493_irq[0]);
- setup_irq(IRQ_CPU_MB93493_1, &mb93493_irq[1]);
-}
diff --git a/arch/frv/kernel/irq.c b/arch/frv/kernel/irq.c
deleted file mode 100644
index 93513e4ccd2b..000000000000
--- a/arch/frv/kernel/irq.c
+++ /dev/null
@@ -1,159 +0,0 @@
-/* irq.c: FRV IRQ handling
- *
- * Copyright (C) 2003, 2004, 2006 Red Hat, Inc. All Rights Reserved.
- * Written by David Howells (dhowells@redhat.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.
- */
-
-#include <linux/ptrace.h>
-#include <linux/errno.h>
-#include <linux/signal.h>
-#include <linux/sched.h>
-#include <linux/ioport.h>
-#include <linux/interrupt.h>
-#include <linux/timex.h>
-#include <linux/random.h>
-#include <linux/init.h>
-#include <linux/kernel_stat.h>
-#include <linux/irq.h>
-#include <linux/proc_fs.h>
-#include <linux/seq_file.h>
-#include <linux/module.h>
-#include <linux/bitops.h>
-
-#include <linux/atomic.h>
-#include <asm/io.h>
-#include <asm/smp.h>
-#include <linux/uaccess.h>
-#include <asm/pgalloc.h>
-#include <asm/delay.h>
-#include <asm/irq.h>
-#include <asm/irc-regs.h>
-#include <asm/gdb-stub.h>
-
-#define set_IRR(N,A,B,C,D) __set_IRR(N, (A << 28) | (B << 24) | (C << 20) | (D << 16))
-
-extern void __init fpga_init(void);
-#ifdef CONFIG_FUJITSU_MB93493
-extern void __init mb93493_init(void);
-#endif
-
-#define __reg16(ADDR) (*(volatile unsigned short *)(ADDR))
-
-atomic_t irq_err_count;
-
-int arch_show_interrupts(struct seq_file *p, int prec)
-{
- seq_printf(p, "%*s: ", prec, "ERR");
- seq_printf(p, "%10u\n", atomic_read(&irq_err_count));
- return 0;
-}
-
-/*
- * on-CPU PIC operations
- */
-static void frv_cpupic_ack(struct irq_data *d)
-{
- __clr_RC(d->irq);
- __clr_IRL();
-}
-
-static void frv_cpupic_mask(struct irq_data *d)
-{
- __set_MASK(d->irq);
-}
-
-static void frv_cpupic_mask_ack(struct irq_data *d)
-{
- __set_MASK(d->irq);
- __clr_RC(d->irq);
- __clr_IRL();
-}
-
-static void frv_cpupic_unmask(struct irq_data *d)
-{
- __clr_MASK(d->irq);
-}
-
-static struct irq_chip frv_cpu_pic = {
- .name = "cpu",
- .irq_ack = frv_cpupic_ack,
- .irq_mask = frv_cpupic_mask,
- .irq_mask_ack = frv_cpupic_mask_ack,
- .irq_unmask = frv_cpupic_unmask,
-};
-
-/*
- * handles all normal device IRQs
- * - registers are referred to by the __frame variable (GR28)
- * - IRQ distribution is complicated in this arch because of the many PICs, the
- * way they work and the way they cascade
- */
-asmlinkage void do_IRQ(void)
-{
- irq_enter();
- generic_handle_irq(__get_IRL());
- irq_exit();
-}
-
-/*
- * handles all NMIs when not co-opted by the debugger
- * - registers are referred to by the __frame variable (GR28)
- */
-asmlinkage void do_NMI(void)
-{
-}
-
-/*
- * initialise the interrupt system
- */
-void __init init_IRQ(void)
-{
- int level;
-
- for (level = 1; level <= 14; level++)
- irq_set_chip_and_handler(level, &frv_cpu_pic,
- handle_level_irq);
-
- irq_set_handler(IRQ_CPU_TIMER0, handle_edge_irq);
-
- /* set the trigger levels for internal interrupt sources
- * - timers all falling-edge
- * - ERR0 is rising-edge
- * - all others are high-level
- */
- __set_IITMR(0, 0x003f0000); /* DMA0-3, TIMER0-2 */
- __set_IITMR(1, 0x20000000); /* ERR0-1, UART0-1, DMA4-7 */
-
- /* route internal interrupts */
- set_IRR(4, IRQ_DMA3_LEVEL, IRQ_DMA2_LEVEL, IRQ_DMA1_LEVEL,
- IRQ_DMA0_LEVEL);
- set_IRR(5, 0, IRQ_TIMER2_LEVEL, IRQ_TIMER1_LEVEL, IRQ_TIMER0_LEVEL);
- set_IRR(6, IRQ_GDBSTUB_LEVEL, IRQ_GDBSTUB_LEVEL,
- IRQ_UART1_LEVEL, IRQ_UART0_LEVEL);
- set_IRR(7, IRQ_DMA7_LEVEL, IRQ_DMA6_LEVEL, IRQ_DMA5_LEVEL,
- IRQ_DMA4_LEVEL);
-
- /* route external interrupts */
- set_IRR(2, IRQ_XIRQ7_LEVEL, IRQ_XIRQ6_LEVEL, IRQ_XIRQ5_LEVEL,
- IRQ_XIRQ4_LEVEL);
- set_IRR(3, IRQ_XIRQ3_LEVEL, IRQ_XIRQ2_LEVEL, IRQ_XIRQ1_LEVEL,
- IRQ_XIRQ0_LEVEL);
-
-#if defined(CONFIG_MB93091_VDK)
- __set_TM1(0x55550000); /* XIRQ7-0 all active low */
-#elif defined(CONFIG_MB93093_PDK)
- __set_TM1(0x15550000); /* XIRQ7 active high, 6-0 all active low */
-#else
-#error dont know external IRQ trigger levels for this setup
-#endif
-
- fpga_init();
-#ifdef CONFIG_FUJITSU_MB93493
- mb93493_init();
-#endif
-}
diff --git a/arch/frv/kernel/local.h b/arch/frv/kernel/local.h
deleted file mode 100644
index 76606d13b1aa..000000000000
--- a/arch/frv/kernel/local.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/* local.h: local definitions
- *
- * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
- * Written by David Howells (dhowells@redhat.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.
- */
-
-#ifndef _FRV_LOCAL_H
-#define _FRV_LOCAL_H
-
-#include <asm/sections.h>
-
-#ifndef __ASSEMBLY__
-
-/* dma.c */
-extern unsigned long frv_dma_inprogress;
-
-extern void frv_dma_pause_all(void);
-extern void frv_dma_resume_all(void);
-
-/* sleep.S */
-extern asmlinkage void frv_cpu_suspend(unsigned long);
-extern asmlinkage void frv_cpu_core_sleep(void);
-
-/* setup.c */
-extern unsigned long __nongprelbss pdm_suspend_mode;
-extern void determine_clocks(int verbose);
-extern int __nongprelbss clock_p0_current;
-extern int __nongprelbss clock_cm_current;
-extern int __nongprelbss clock_cmode_current;
-
-#ifdef CONFIG_PM
-extern int __nongprelbss clock_cmodes_permitted;
-extern unsigned long __nongprelbss clock_bits_settable;
-#define CLOCK_BIT_CM 0x0000000f
-#define CLOCK_BIT_CM_H 0x00000001 /* CLKC.CM can be set to 0 */
-#define CLOCK_BIT_CM_M 0x00000002 /* CLKC.CM can be set to 1 */
-#define CLOCK_BIT_CM_L 0x00000004 /* CLKC.CM can be set to 2 */
-#define CLOCK_BIT_P0 0x00000010 /* CLKC.P0 can be changed */
-#define CLOCK_BIT_CMODE 0x00000020 /* CLKC.CMODE can be changed */
-
-extern void (*__power_switch_wake_setup)(void);
-extern int (*__power_switch_wake_check)(void);
-extern void (*__power_switch_wake_cleanup)(void);
-#endif
-
-/* time.c */
-extern void time_divisor_init(void);
-
-/* cmode.S */
-extern asmlinkage void frv_change_cmode(int);
-
-
-#endif /* __ASSEMBLY__ */
-#endif /* _FRV_LOCAL_H */
diff --git a/arch/frv/kernel/local64.h b/arch/frv/kernel/local64.h
deleted file mode 100644
index 36c93b5cc239..000000000000
--- a/arch/frv/kernel/local64.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <asm-generic/local64.h>
diff --git a/arch/frv/kernel/module.c b/arch/frv/kernel/module.c
deleted file mode 100644
index 9d9835f1fe2b..000000000000
--- a/arch/frv/kernel/module.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/* module.c: FRV specific module loading bits
- *
- * Copyright (C) 2006 Red Hat, Inc. All Rights Reserved.
- * Written by David Howells (dhowells@redhat.com)
- * - Derived from arch/i386/kernel/module.c, Copyright (C) 2001 Rusty Russell.
- *
- * 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.
- */
-#include <linux/moduleloader.h>
-#include <linux/elf.h>
-#include <linux/vmalloc.h>
-#include <linux/fs.h>
-#include <linux/string.h>
-#include <linux/kernel.h>
-
-#if 0
-#define DEBUGP printk
-#else
-#define DEBUGP(fmt...)
-#endif
-
-/* TODO: At least one of apply_relocate or apply_relocate_add must be
- * implemented in order to get working module support.
- */
diff --git a/arch/frv/kernel/pm-mb93093.c b/arch/frv/kernel/pm-mb93093.c
deleted file mode 100644
index 8358e34a3fad..000000000000
--- a/arch/frv/kernel/pm-mb93093.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * FR-V MB93093 Power Management Routines
- *
- * Copyright (c) 2004 Red Hat, Inc.
- *
- * Written by: msalter@redhat.com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License.
- *
- */
-
-#include <linux/init.h>
-#include <linux/pm.h>
-#include <linux/sched.h>
-#include <linux/interrupt.h>
-#include <linux/sysctl.h>
-#include <linux/errno.h>
-#include <linux/delay.h>
-#include <linux/uaccess.h>
-
-#include <asm/mb86943a.h>
-
-#include "local.h"
-
-static unsigned long imask;
-/*
- * Setup interrupt masks, etc to enable wakeup by power switch
- */
-static void mb93093_power_switch_setup(void)
-{
- /* mask all but FPGA interrupt sources. */
- imask = *(volatile unsigned long *)0xfeff9820;
- *(volatile unsigned long *)0xfeff9820 = ~(1 << (IRQ_XIRQ2_LEVEL + 16)) & 0xfffe0000;
-}
-
-/*
- * Cleanup interrupt masks, etc after wakeup by power switch
- */
-static void mb93093_power_switch_cleanup(void)
-{
- *(volatile unsigned long *)0xfeff9820 = imask;
-}
-
-/*
- * Return non-zero if wakeup irq was caused by power switch
- */
-static int mb93093_power_switch_check(void)
-{
- return 1;
-}
-
-/*
- * Initialize power interface
- */
-static int __init mb93093_pm_init(void)
-{
- __power_switch_wake_setup = mb93093_power_switch_setup;
- __power_switch_wake_check = mb93093_power_switch_check;
- __power_switch_wake_cleanup = mb93093_power_switch_cleanup;
- return 0;
-}
-
-__initcall(mb93093_pm_init);
-
diff --git a/arch/frv/kernel/pm.c b/arch/frv/kernel/pm.c
deleted file mode 100644
index 051ccecbf7f1..000000000000
--- a/arch/frv/kernel/pm.c
+++ /dev/null
@@ -1,352 +0,0 @@
-/*
- * FR-V Power Management Routines
- *
- * Copyright (c) 2004 Red Hat, Inc.
- *
- * Based on SA1100 version:
- * Copyright (c) 2001 Cliff Brake <cbrake@accelent.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License.
- *
- */
-
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/pm.h>
-#include <linux/sched.h>
-#include <linux/interrupt.h>
-#include <linux/sysctl.h>
-#include <linux/errno.h>
-#include <linux/delay.h>
-#include <linux/uaccess.h>
-
-#include <asm/mb86943a.h>
-
-#include "local.h"
-
-/*
- * Debug macros
- */
-#define DEBUG
-
-int pm_do_suspend(void)
-{
- local_irq_disable();
-
- __set_LEDS(0xb1);
-
- /* go zzz */
- frv_cpu_suspend(pdm_suspend_mode);
-
- __set_LEDS(0xb2);
-
- local_irq_enable();
-
- return 0;
-}
-
-static unsigned long __irq_mask;
-
-/*
- * Setup interrupt masks, etc to enable wakeup by power switch
- */
-static void __default_power_switch_setup(void)
-{
- /* default is to mask all interrupt sources. */
- __irq_mask = *(unsigned long *)0xfeff9820;
- *(unsigned long *)0xfeff9820 = 0xfffe0000;
-}
-
-/*
- * Cleanup interrupt masks, etc after wakeup by power switch
- */
-static void __default_power_switch_cleanup(void)
-{
- *(unsigned long *)0xfeff9820 = __irq_mask;
-}
-
-/*
- * Return non-zero if wakeup irq was caused by power switch
- */
-static int __default_power_switch_check(void)
-{
- return 1;
-}
-
-void (*__power_switch_wake_setup)(void) = __default_power_switch_setup;
-int (*__power_switch_wake_check)(void) = __default_power_switch_check;
-void (*__power_switch_wake_cleanup)(void) = __default_power_switch_cleanup;
-
-int pm_do_bus_sleep(void)
-{
- local_irq_disable();
-
- /*
- * Here is where we need some platform-dependent setup
- * of the interrupt state so that appropriate wakeup
- * sources are allowed and all others are masked.
- */
- __power_switch_wake_setup();
-
- __set_LEDS(0xa1);
-
- /* go zzz
- *
- * This is in a loop in case power switch shares an irq with other
- * devices. The wake_check() tells us if we need to finish waking
- * or go back to sleep.
- */
- do {
- frv_cpu_suspend(HSR0_PDM_BUS_SLEEP);
- } while (__power_switch_wake_check && !__power_switch_wake_check());
-
- __set_LEDS(0xa2);
-
- /*
- * Here is where we need some platform-dependent restore
- * of the interrupt state prior to being called.
- */
- __power_switch_wake_cleanup();
-
- local_irq_enable();
-
- return 0;
-}
-
-unsigned long sleep_phys_sp(void *sp)
-{
- return virt_to_phys(sp);
-}
-
-#ifdef CONFIG_SYSCTL
-/*
- * Use a temporary sysctl number. Horrid, but will be cleaned up in 2.6
- * when all the PM interfaces exist nicely.
- */
-#define CTL_PM_SUSPEND 1
-#define CTL_PM_CMODE 2
-#define CTL_PM_P0 4
-#define CTL_PM_CM 5
-
-static int user_atoi(char __user *ubuf, size_t len)
-{
- char buf[16];
- unsigned long ret;
-
- if (len > 15)
- return -EINVAL;
-
- if (copy_from_user(buf, ubuf, len))
- return -EFAULT;
-
- buf[len] = 0;
- ret = simple_strtoul(buf, NULL, 0);
- if (ret > INT_MAX)
- return -ERANGE;
- return ret;
-}
-
-/*
- * Send us to sleep.
- */
-static int sysctl_pm_do_suspend(struct ctl_table *ctl, int write,
- void __user *buffer, size_t *lenp, loff_t *fpos)
-{
- int mode;
-
- if (*lenp <= 0)
- return -EIO;
-
- mode = user_atoi(buffer, *lenp);
- switch (mode) {
- case 1:
- return pm_do_suspend();
-
- case 5:
- return pm_do_bus_sleep();
-
- default:
- return -EINVAL;
- }
-}
-
-static int try_set_cmode(int new_cmode)
-{
- if (new_cmode > 15)
- return -EINVAL;
- if (!(clock_cmodes_permitted & (1<<new_cmode)))
- return -EINVAL;
-
- /* now change cmode */
- local_irq_disable();
- frv_dma_pause_all();
-
- frv_change_cmode(new_cmode);
-
- determine_clocks(0);
- time_divisor_init();
-
-#ifdef DEBUG
- determine_clocks(1);
-#endif
- frv_dma_resume_all();
- local_irq_enable();
-
- return 0;
-}
-
-
-static int cmode_procctl(struct ctl_table *ctl, int write,
- void __user *buffer, size_t *lenp, loff_t *fpos)
-{
- int new_cmode;
-
- if (!write)
- return proc_dointvec(ctl, write, buffer, lenp, fpos);
-
- new_cmode = user_atoi(buffer, *lenp);
-
- return try_set_cmode(new_cmode)?:*lenp;
-}
-
-static int try_set_p0(int new_p0)
-{
- unsigned long flags, clkc;
-
- if (new_p0 < 0 || new_p0 > 1)
- return -EINVAL;
-
- local_irq_save(flags);
- __set_PSR(flags & ~PSR_ET);
-
- frv_dma_pause_all();
-
- clkc = __get_CLKC();
- if (new_p0)
- clkc |= CLKC_P0;
- else
- clkc &= ~CLKC_P0;
- __set_CLKC(clkc);
-
- determine_clocks(0);
- time_divisor_init();
-
-#ifdef DEBUG
- determine_clocks(1);
-#endif
- frv_dma_resume_all();
- local_irq_restore(flags);
- return 0;
-}
-
-static int try_set_cm(int new_cm)
-{
- unsigned long flags, clkc;
-
- if (new_cm < 0 || new_cm > 1)
- return -EINVAL;
-
- local_irq_save(flags);
- __set_PSR(flags & ~PSR_ET);
-
- frv_dma_pause_all();
-
- clkc = __get_CLKC();
- clkc &= ~CLKC_CM;
- clkc |= new_cm;
- __set_CLKC(clkc);
-
- determine_clocks(0);
- time_divisor_init();
-
-#if 1 //def DEBUG
- determine_clocks(1);
-#endif
-
- frv_dma_resume_all();
- local_irq_restore(flags);
- return 0;
-}
-
-static int p0_procctl(struct ctl_table *ctl, int write,
- void __user *buffer, size_t *lenp, loff_t *fpos)
-{
- int new_p0;
-
- if (!write)
- return proc_dointvec(ctl, write, buffer, lenp, fpos);
-
- new_p0 = user_atoi(buffer, *lenp);
-
- return try_set_p0(new_p0)?:*lenp;
-}
-
-static int cm_procctl(struct ctl_table *ctl, int write,
- void __user *buffer, size_t *lenp, loff_t *fpos)
-{
- int new_cm;
-
- if (!write)
- return proc_dointvec(ctl, write, buffer, lenp, fpos);
-
- new_cm = user_atoi(buffer, *lenp);
-
- return try_set_cm(new_cm)?:*lenp;
-}
-
-static struct ctl_table pm_table[] =
-{
- {
- .procname = "suspend",
- .data = NULL,
- .maxlen = 0,
- .mode = 0200,
- .proc_handler = sysctl_pm_do_suspend,
- },
- {
- .procname = "cmode",
- .data = &clock_cmode_current,
- .maxlen = sizeof(int),
- .mode = 0644,
- .proc_handler = cmode_procctl,
- },
- {
- .procname = "p0",
- .data = &clock_p0_current,
- .maxlen = sizeof(int),
- .mode = 0644,
- .proc_handler = p0_procctl,
- },
- {
- .procname = "cm",
- .data = &clock_cm_current,
- .maxlen = sizeof(int),
- .mode = 0644,
- .proc_handler = cm_procctl,
- },
- { }
-};
-
-static struct ctl_table pm_dir_table[] =
-{
- {
- .procname = "pm",
- .mode = 0555,
- .child = pm_table,
- },
- { }
-};
-
-/*
- * Initialize power interface
- */
-static int __init pm_init(void)
-{
- register_sysctl_table(pm_dir_table);
- return 0;
-}
-
-__initcall(pm_init);
-
-#endif
diff --git a/arch/frv/kernel/process.c b/arch/frv/kernel/process.c
deleted file mode 100644
index a957b374e3a6..000000000000
--- a/arch/frv/kernel/process.c
+++ /dev/null
@@ -1,275 +0,0 @@
-/* process.c: FRV specific parts of process handling
- *
- * Copyright (C) 2003-5 Red Hat, Inc. All Rights Reserved.
- * Written by David Howells (dhowells@redhat.com)
- * - Derived from arch/m68k/kernel/process.c
- *
- * 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.
- */
-
-#include <linux/module.h>
-#include <linux/errno.h>
-#include <linux/sched.h>
-#include <linux/sched/debug.h>
-#include <linux/sched/task.h>
-#include <linux/sched/task_stack.h>
-#include <linux/kernel.h>
-#include <linux/mm.h>
-#include <linux/smp.h>
-#include <linux/stddef.h>
-#include <linux/unistd.h>
-#include <linux/ptrace.h>
-#include <linux/slab.h>
-#include <linux/user.h>
-#include <linux/elf.h>
-#include <linux/reboot.h>
-#include <linux/interrupt.h>
-#include <linux/pagemap.h>
-#include <linux/rcupdate.h>
-
-#include <asm/asm-offsets.h>
-#include <linux/uaccess.h>
-#include <asm/setup.h>
-#include <asm/pgtable.h>
-#include <asm/tlb.h>
-#include <asm/gdb-stub.h>
-#include <asm/mb-regs.h>
-
-#include "local.h"
-
-asmlinkage void ret_from_fork(void);
-asmlinkage void ret_from_kernel_thread(void);
-
-#include <asm/pgalloc.h>
-
-void (*pm_power_off)(void);
-EXPORT_SYMBOL(pm_power_off);
-
-static void core_sleep_idle(void)
-{
-#ifdef LED_DEBUG_SLEEP
- /* Show that we're sleeping... */
- __set_LEDS(0x55aa);
-#endif
- frv_cpu_core_sleep();
-#ifdef LED_DEBUG_SLEEP
- /* ... and that we woke up */
- __set_LEDS(0);
-#endif
- mb();
-}
-
-void arch_cpu_idle(void)
-{
- if (!frv_dma_inprogress)
- core_sleep_idle();
- else
- local_irq_enable();
-}
-
-void machine_restart(char * __unused)
-{
- unsigned long reset_addr;
-#ifdef CONFIG_GDBSTUB
- gdbstub_exit(0);
-#endif
-
- if (PSR_IMPLE(__get_PSR()) == PSR_IMPLE_FR551)
- reset_addr = 0xfefff500;
- else
- reset_addr = 0xfeff0500;
-
- /* Software reset. */
- asm volatile(" dcef @(gr0,gr0),1 ! membar !"
- " sti %1,@(%0,0) !"
- " nop ! nop ! nop ! nop ! nop ! "
- " nop ! nop ! nop ! nop ! nop ! "
- " nop ! nop ! nop ! nop ! nop ! "
- " nop ! nop ! nop ! nop ! nop ! "
- : : "r" (reset_addr), "r" (1) );
-
- for (;;)
- ;
-}
-
-void machine_halt(void)
-{
-#ifdef CONFIG_GDBSTUB
- gdbstub_exit(0);
-#endif
-
- for (;;);
-}
-
-void machine_power_off(void)
-{
-#ifdef CONFIG_GDBSTUB
- gdbstub_exit(0);
-#endif
-
- for (;;);
-}
-
-void flush_thread(void)
-{
- /* nothing */
-}
-
-inline unsigned long user_stack(const struct pt_regs *regs)
-{
- while (regs->next_frame)
- regs = regs->next_frame;
- return user_mode(regs) ? regs->sp : 0;
-}
-
-/*
- * set up the kernel stack and exception frames for a new process
- */
-int copy_thread(unsigned long clone_flags,
- unsigned long usp, unsigned long arg,
- struct task_struct *p)
-{
- struct pt_regs *childregs;
-
- childregs = (struct pt_regs *)
- (task_stack_page(p) + THREAD_SIZE - FRV_FRAME0_SIZE);
-
- /* set up the userspace frame (the only place that the USP is stored) */
- *childregs = *current_pt_regs();
-
- p->thread.frame = childregs;
- p->thread.curr = p;
- p->thread.sp = (unsigned long) childregs;
- p->thread.fp = 0;
- p->thread.lr = 0;
- p->thread.frame0 = childregs;
-
- if (unlikely(p->flags & PF_KTHREAD)) {
- childregs->gr9 = usp; /* function */
- childregs->gr8 = arg;
- p->thread.pc = (unsigned long) ret_from_kernel_thread;
- save_user_regs(p->thread.user);
- return 0;
- }
- if (usp)
- childregs->sp = usp;
- childregs->next_frame = NULL;
-
- p->thread.pc = (unsigned long) ret_from_fork;
-
- /* the new TLS pointer is passed in as arg #5 to sys_clone() */
- if (clone_flags & CLONE_SETTLS)
- childregs->gr29 = childregs->gr12;
-
- save_user_regs(p->thread.user);
-
- return 0;
-} /* end copy_thread() */
-
-unsigned long get_wchan(struct task_struct *p)
-{
- struct pt_regs *regs0;
- unsigned long fp, pc;
- unsigned long stack_limit;
- int count = 0;
- if (!p || p == current || p->state == TASK_RUNNING)
- return 0;
-
- stack_limit = (unsigned long) (p + 1);
- fp = p->thread.fp;
- regs0 = p->thread.frame0;
-
- do {
- if (fp < stack_limit || fp >= (unsigned long) regs0 || fp & 3)
- return 0;
-
- pc = ((unsigned long *) fp)[2];
-
- /* FIXME: This depends on the order of these functions. */
- if (!in_sched_functions(pc))
- return pc;
-
- fp = *(unsigned long *) fp;
- } while (count++ < 16);
-
- return 0;
-}
-
-int elf_check_arch(const struct elf32_hdr *hdr)
-{
- unsigned long hsr0 = __get_HSR(0);
- unsigned long psr = __get_PSR();
-
- if (hdr->e_machine != EM_FRV)
- return 0;
-
- switch (hdr->e_flags & EF_FRV_GPR_MASK) {
- case EF_FRV_GPR64:
- if ((hsr0 & HSR0_GRN) == HSR0_GRN_32)
- return 0;
- case EF_FRV_GPR32:
- case 0:
- break;
- default:
- return 0;
- }
-
- switch (hdr->e_flags & EF_FRV_FPR_MASK) {
- case EF_FRV_FPR64:
- if ((hsr0 & HSR0_FRN) == HSR0_FRN_32)
- return 0;
- case EF_FRV_FPR32:
- case EF_FRV_FPR_NONE:
- case 0:
- break;
- default:
- return 0;
- }
-
- if ((hdr->e_flags & EF_FRV_MULADD) == EF_FRV_MULADD)
- if (PSR_IMPLE(psr) != PSR_IMPLE_FR405 &&
- PSR_IMPLE(psr) != PSR_IMPLE_FR451)
- return 0;
-
- switch (hdr->e_flags & EF_FRV_CPU_MASK) {
- case EF_FRV_CPU_GENERIC:
- break;
- case EF_FRV_CPU_FR300:
- case EF_FRV_CPU_SIMPLE:
- case EF_FRV_CPU_TOMCAT:
- default:
- return 0;
- case EF_FRV_CPU_FR400:
- if (PSR_IMPLE(psr) != PSR_IMPLE_FR401 &&
- PSR_IMPLE(psr) != PSR_IMPLE_FR405 &&
- PSR_IMPLE(psr) != PSR_IMPLE_FR451 &&
- PSR_IMPLE(psr) != PSR_IMPLE_FR551)
- return 0;
- break;
- case EF_FRV_CPU_FR450:
- if (PSR_IMPLE(psr) != PSR_IMPLE_FR451)
- return 0;
- break;
- case EF_FRV_CPU_FR500:
- if (PSR_IMPLE(psr) != PSR_IMPLE_FR501)
- return 0;
- break;
- case EF_FRV_CPU_FR550:
- if (PSR_IMPLE(psr) != PSR_IMPLE_FR551)
- return 0;
- break;
- }
-
- return 1;
-}
-
-int dump_fpu(struct pt_regs *regs, elf_fpregset_t *fpregs)
-{
- memcpy(fpregs,
- &current->thread.user->f,
- sizeof(current->thread.user->f));
- return 1;
-}
diff --git a/arch/frv/kernel/ptrace.c b/arch/frv/kernel/ptrace.c
deleted file mode 100644
index 49768401ce0f..000000000000
--- a/arch/frv/kernel/ptrace.c
+++ /dev/null
@@ -1,377 +0,0 @@
-/* ptrace.c: FRV specific parts of process tracing
- *
- * Copyright (C) 2003-5 Red Hat, Inc. All Rights Reserved.
- * Written by David Howells (dhowells@redhat.com)
- * - Derived from arch/m68k/kernel/ptrace.c
- *
- * 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.
- */
-
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/mm.h>
-#include <linux/smp.h>
-#include <linux/errno.h>
-#include <linux/ptrace.h>
-#include <linux/user.h>
-#include <linux/security.h>
-#include <linux/signal.h>
-#include <linux/regset.h>
-#include <linux/elf.h>
-#include <linux/tracehook.h>
-
-#include <linux/uaccess.h>
-#include <asm/page.h>
-#include <asm/pgtable.h>
-#include <asm/processor.h>
-#include <asm/unistd.h>
-
-/*
- * does not yet catch signals sent when the child dies.
- * in exit.c or in signal.c.
- */
-
-/*
- * retrieve the contents of FRV 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 user_int_regs *iregs = &target->thread.user->i;
- int ret;
-
- ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf,
- iregs, 0, sizeof(*iregs));
- if (ret < 0)
- return ret;
-
- return user_regset_copyout_zero(&pos, &count, &kbuf, &ubuf,
- sizeof(*iregs), -1);
-}
-
-/*
- * update the contents of the FRV 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 user_int_regs *iregs = &target->thread.user->i;
- unsigned int offs_gr0, offs_gr1;
- int ret;
-
- /* not allowed to set PSR or __status */
- if (pos < offsetof(struct user_int_regs, psr) + sizeof(long) &&
- pos + count > offsetof(struct user_int_regs, psr))
- return -EIO;
-
- if (pos < offsetof(struct user_int_regs, __status) + sizeof(long) &&
- pos + count > offsetof(struct user_int_regs, __status))
- return -EIO;
-
- /* set the control regs */
- offs_gr0 = offsetof(struct user_int_regs, gr[0]);
- offs_gr1 = offsetof(struct user_int_regs, gr[1]);
- ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
- iregs, 0, offs_gr0);
- if (ret < 0)
- return ret;
-
- /* skip GR0/TBR */
- ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
- offs_gr0, offs_gr1);
- if (ret < 0)
- return ret;
-
- /* set the general regs */
- ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
- &iregs->gr[1], offs_gr1, sizeof(*iregs));
- if (ret < 0)
- return ret;
-
- return user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
- sizeof(*iregs), -1);
-}
-
-/*
- * retrieve the contents of FRV userspace FP/Media registers
- */
-static int fpmregs_get(struct task_struct *target,
- const struct user_regset *regset,
- unsigned int pos, unsigned int count,
- void *kbuf, void __user *ubuf)
-{
- const struct user_fpmedia_regs *fpregs = &target->thread.user->f;
- int ret;
-
- ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf,
- fpregs, 0, sizeof(*fpregs));
- if (ret < 0)
- return ret;
-
- return user_regset_copyout_zero(&pos, &count, &kbuf, &ubuf,
- sizeof(*fpregs), -1);
-}
-
-/*
- * update the contents of the FRV userspace FP/Media registers
- */
-static int fpmregs_set(struct task_struct *target,
- const struct user_regset *regset,
- unsigned int pos, unsigned int count,
- const void *kbuf, const void __user *ubuf)
-{
- struct user_fpmedia_regs *fpregs = &target->thread.user->f;
- int ret;
-
- ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
- fpregs, 0, sizeof(*fpregs));
- if (ret < 0)
- return ret;
-
- return user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
- sizeof(*fpregs), -1);
-}
-
-/*
- * determine if the FP/Media registers have actually been used
- */
-static int fpmregs_active(struct task_struct *target,
- const struct user_regset *regset)
-{
- return tsk_used_math(target) ? regset->n : 0;
-}
-
-/*
- * Define the register sets available on the FRV under Linux
- */
-enum frv_regset {
- REGSET_GENERAL,
- REGSET_FPMEDIA,
-};
-
-static const struct user_regset frv_regsets[] = {
- /*
- * General register format is:
- * PSR, ISR, CCR, CCCR, LR, LCR, PC, (STATUS), SYSCALLNO, ORIG_G8
- * GNER0-1, IACC0, TBR, GR1-63
- */
- [REGSET_GENERAL] = {
- .core_note_type = NT_PRSTATUS,
- .n = ELF_NGREG,
- .size = sizeof(long),
- .align = sizeof(long),
- .get = genregs_get,
- .set = genregs_set,
- },
- /*
- * FPU/Media register format is:
- * FR0-63, FNER0-1, MSR0-1, ACC0-7, ACCG0-8, FSR
- */
- [REGSET_FPMEDIA] = {
- .core_note_type = NT_PRFPREG,
- .n = sizeof(struct user_fpmedia_regs) / sizeof(long),
- .size = sizeof(long),
- .align = sizeof(long),
- .get = fpmregs_get,
- .set = fpmregs_set,
- .active = fpmregs_active,
- },
-};
-
-static const struct user_regset_view user_frv_native_view = {
- .name = "frv",
- .e_machine = EM_FRV,
- .regsets = frv_regsets,
- .n = ARRAY_SIZE(frv_regsets),
-};
-
-const struct user_regset_view *task_user_regset_view(struct task_struct *task)
-{
- return &user_frv_native_view;
-}
-
-/*
- * Get contents of register REGNO in task TASK.
- */
-static inline long get_reg(struct task_struct *task, int regno)
-{
- struct user_context *user = task->thread.user;
-
- if (regno < 0 || regno >= PT__END)
- return 0;
-
- return ((unsigned long *) user)[regno];
-}
-
-/*
- * Write contents of register REGNO in task TASK.
- */
-static inline int put_reg(struct task_struct *task, int regno,
- unsigned long data)
-{
- struct user_context *user = task->thread.user;
-
- if (regno < 0 || regno >= PT__END)
- return -EIO;
-
- switch (regno) {
- case PT_GR(0):
- return 0;
- case PT_PSR:
- case PT__STATUS:
- return -EIO;
- default:
- ((unsigned long *) user)[regno] = data;
- return 0;
- }
-}
-
-/*
- * Called by kernel/ptrace.c when detaching..
- *
- * Control h/w single stepping
- */
-void user_enable_single_step(struct task_struct *child)
-{
- child->thread.frame0->__status |= REG__STATUS_STEP;
-}
-
-void user_disable_single_step(struct task_struct *child)
-{
- child->thread.frame0->__status &= ~REG__STATUS_STEP;
-}
-
-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)
-{
- unsigned long tmp;
- int ret;
- int regno = addr >> 2;
- unsigned long __user *datap = (unsigned long __user *) data;
-
- switch (request) {
- /* read the word at location addr in the USER area. */
- case PTRACE_PEEKUSR: {
- tmp = 0;
- ret = -EIO;
- if (addr & 3)
- break;
-
- ret = 0;
- switch (regno) {
- case 0 ... PT__END - 1:
- tmp = get_reg(child, regno);
- break;
-
- case PT__END + 0:
- tmp = child->mm->end_code - child->mm->start_code;
- break;
-
- case PT__END + 1:
- tmp = child->mm->end_data - child->mm->start_data;
- break;
-
- case PT__END + 2:
- tmp = child->mm->start_stack - child->mm->start_brk;
- break;
-
- case PT__END + 3:
- tmp = child->mm->start_code;
- break;
-
- case PT__END + 4:
- tmp = child->mm->start_stack;
- break;
-
- default:
- ret = -EIO;
- break;
- }
-
- if (ret == 0)
- ret = put_user(tmp, datap);
- break;
- }
-
- case PTRACE_POKEUSR: /* write the word at location addr in the USER area */
- ret = -EIO;
- if (addr & 3)
- break;
-
- switch (regno) {
- case 0 ... PT__END - 1:
- ret = put_reg(child, regno, data);
- break;
- }
- break;
-
- case PTRACE_GETREGS: /* Get all integer regs from the child. */
- return copy_regset_to_user(child, &user_frv_native_view,
- REGSET_GENERAL,
- 0, sizeof(child->thread.user->i),
- datap);
-
- case PTRACE_SETREGS: /* Set all integer regs in the child. */
- return copy_regset_from_user(child, &user_frv_native_view,
- REGSET_GENERAL,
- 0, sizeof(child->thread.user->i),
- datap);
-
- case PTRACE_GETFPREGS: /* Get the child FP/Media state. */
- return copy_regset_to_user(child, &user_frv_native_view,
- REGSET_FPMEDIA,
- 0, sizeof(child->thread.user->f),
- datap);
-
- case PTRACE_SETFPREGS: /* Set the child FP/Media state. */
- return copy_regset_from_user(child, &user_frv_native_view,
- REGSET_FPMEDIA,
- 0, sizeof(child->thread.user->f),
- datap);
-
- default:
- ret = ptrace_request(child, request, addr, data);
- break;
- }
- return ret;
-}
-
-/*
- * handle tracing of system call entry
- * - return the revised system call number or ULONG_MAX to cause ENOSYS
- */
-asmlinkage unsigned long syscall_trace_entry(void)
-{
- __frame->__status |= REG__STATUS_SYSC_ENTRY;
- if (tracehook_report_syscall_entry(__frame)) {
- /* tracing decided this syscall should not happen, so
- * We'll return a bogus call number to get an ENOSYS
- * error, but leave the original number in
- * __frame->syscallno
- */
- return ULONG_MAX;
- }
-
- return __frame->syscallno;
-}
-
-/*
- * handle tracing of system call exit
- */
-asmlinkage void syscall_trace_exit(void)
-{
- __frame->__status |= REG__STATUS_SYSC_EXIT;
- tracehook_report_syscall_exit(__frame, 0);
-}
diff --git a/arch/frv/kernel/setup.c b/arch/frv/kernel/setup.c
deleted file mode 100644
index 9f4a9a607dbe..000000000000
--- a/arch/frv/kernel/setup.c
+++ /dev/null
@@ -1,1178 +0,0 @@
-/* setup.c: FRV specific setup
- *
- * Copyright (C) 2003-5 Red Hat, Inc. All Rights Reserved.
- * Written by David Howells (dhowells@redhat.com)
- * - Derived from arch/m68k/kernel/setup.c
- *
- * 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.
- */
-
-#include <generated/utsrelease.h>
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/delay.h>
-#include <linux/interrupt.h>
-#include <linux/fs.h>
-#include <linux/mm.h>
-#include <linux/fb.h>
-#include <linux/console.h>
-#include <linux/genhd.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/major.h>
-#include <linux/bootmem.h>
-#include <linux/highmem.h>
-#include <linux/seq_file.h>
-#include <linux/serial.h>
-#include <linux/serial_core.h>
-#include <linux/serial_reg.h>
-#include <linux/serial_8250.h>
-
-#include <asm/setup.h>
-#include <asm/irq.h>
-#include <asm/sections.h>
-#include <asm/pgalloc.h>
-#include <asm/busctl-regs.h>
-#include <asm/serial-regs.h>
-#include <asm/timer-regs.h>
-#include <asm/irc-regs.h>
-#include <asm/spr-regs.h>
-#include <asm/mb-regs.h>
-#include <asm/mb93493-regs.h>
-#include <asm/gdb-stub.h>
-#include <asm/io.h>
-
-#ifdef CONFIG_BLK_DEV_INITRD
-#include <asm/pgtable.h>
-#endif
-
-#include "local.h"
-
-#ifdef CONFIG_MB93090_MB00
-static void __init mb93090_display(void);
-#endif
-#ifdef CONFIG_MMU
-static void __init setup_linux_memory(void);
-#else
-static void __init setup_uclinux_memory(void);
-#endif
-
-#ifdef CONFIG_MB93090_MB00
-static char __initdata mb93090_banner[] = "FJ/RH FR-V Linux";
-static char __initdata mb93090_version[] = UTS_RELEASE;
-
-int __nongprelbss mb93090_mb00_detected;
-#endif
-
-const char __frv_unknown_system[] = "unknown";
-const char __frv_mb93091_cb10[] = "mb93091-cb10";
-const char __frv_mb93091_cb11[] = "mb93091-cb11";
-const char __frv_mb93091_cb30[] = "mb93091-cb30";
-const char __frv_mb93091_cb41[] = "mb93091-cb41";
-const char __frv_mb93091_cb60[] = "mb93091-cb60";
-const char __frv_mb93091_cb70[] = "mb93091-cb70";
-const char __frv_mb93091_cb451[] = "mb93091-cb451";
-const char __frv_mb93090_mb00[] = "mb93090-mb00";
-
-const char __frv_mb93493[] = "mb93493";
-
-const char __frv_mb93093[] = "mb93093";
-
-static const char *__nongprelbss cpu_series;
-static const char *__nongprelbss cpu_core;
-static const char *__nongprelbss cpu_silicon;
-static const char *__nongprelbss cpu_mmu;
-static const char *__nongprelbss cpu_system;
-static const char *__nongprelbss cpu_board1;
-static const char *__nongprelbss cpu_board2;
-
-static unsigned long __nongprelbss cpu_psr_all;
-static unsigned long __nongprelbss cpu_hsr0_all;
-
-unsigned long __nongprelbss pdm_suspend_mode;
-
-unsigned long __nongprelbss rom_length;
-unsigned long __nongprelbss memory_start;
-unsigned long __nongprelbss memory_end;
-
-unsigned long __nongprelbss dma_coherent_mem_start;
-unsigned long __nongprelbss dma_coherent_mem_end;
-
-unsigned long __initdata __sdram_old_base;
-unsigned long __initdata num_mappedpages;
-
-char __initdata command_line[COMMAND_LINE_SIZE];
-char __initdata redboot_command_line[COMMAND_LINE_SIZE];
-
-#ifdef CONFIG_PM
-#define __pminit
-#define __pminitdata
-#define __pminitconst
-#else
-#define __pminit __init
-#define __pminitdata __initdata
-#define __pminitconst __initconst
-#endif
-
-struct clock_cmode {
- uint8_t xbus, sdram, corebus, core, dsu;
-};
-
-#define _frac(N,D) ((N)<<4 | (D))
-#define _x0_16 _frac(1,6)
-#define _x0_25 _frac(1,4)
-#define _x0_33 _frac(1,3)
-#define _x0_375 _frac(3,8)
-#define _x0_5 _frac(1,2)
-#define _x0_66 _frac(2,3)
-#define _x0_75 _frac(3,4)
-#define _x1 _frac(1,1)
-#define _x1_5 _frac(3,2)
-#define _x2 _frac(2,1)
-#define _x3 _frac(3,1)
-#define _x4 _frac(4,1)
-#define _x4_5 _frac(9,2)
-#define _x6 _frac(6,1)
-#define _x8 _frac(8,1)
-#define _x9 _frac(9,1)
-
-int __nongprelbss clock_p0_current;
-int __nongprelbss clock_cm_current;
-int __nongprelbss clock_cmode_current;
-#ifdef CONFIG_PM
-int __nongprelbss clock_cmodes_permitted;
-unsigned long __nongprelbss clock_bits_settable;
-#endif
-
-static struct clock_cmode __pminitdata undef_clock_cmode = { _x1, _x1, _x1, _x1, _x1 };
-
-static struct clock_cmode __pminitdata clock_cmodes_fr401_fr403[16] = {
- [4] = { _x1, _x1, _x2, _x2, _x0_25 },
- [5] = { _x1, _x2, _x4, _x4, _x0_5 },
- [8] = { _x1, _x1, _x1, _x2, _x0_25 },
- [9] = { _x1, _x2, _x2, _x4, _x0_5 },
- [11] = { _x1, _x4, _x4, _x8, _x1 },
- [12] = { _x1, _x1, _x2, _x4, _x0_5 },
- [13] = { _x1, _x2, _x4, _x8, _x1 },
-};
-
-static struct clock_cmode __pminitdata clock_cmodes_fr405[16] = {
- [0] = { _x1, _x1, _x1, _x1, _x0_5 },
- [1] = { _x1, _x1, _x1, _x3, _x0_25 },
- [2] = { _x1, _x1, _x2, _x6, _x0_5 },
- [3] = { _x1, _x2, _x2, _x6, _x0_5 },
- [4] = { _x1, _x1, _x2, _x2, _x0_16 },
- [8] = { _x1, _x1, _x1, _x2, _x0_16 },
- [9] = { _x1, _x2, _x2, _x4, _x0_33 },
- [12] = { _x1, _x1, _x2, _x4, _x0_33 },
- [14] = { _x1, _x3, _x3, _x9, _x0_75 },
- [15] = { _x1, _x1_5, _x1_5, _x4_5, _x0_375 },
-
-#define CLOCK_CMODES_PERMITTED_FR405 0xd31f
-};
-
-static struct clock_cmode __pminitdata clock_cmodes_fr555[16] = {
- [0] = { _x1, _x2, _x2, _x4, _x0_33 },
- [1] = { _x1, _x3, _x3, _x6, _x0_5 },
- [2] = { _x1, _x2, _x4, _x8, _x0_66 },
- [3] = { _x1, _x1_5, _x3, _x6, _x0_5 },
- [4] = { _x1, _x3, _x3, _x9, _x0_75 },
- [5] = { _x1, _x2, _x2, _x6, _x0_5 },
- [6] = { _x1, _x1_5, _x1_5, _x4_5, _x0_375 },
-};
-
-static const struct clock_cmode __pminitconst *clock_cmodes;
-static int __pminitdata clock_doubled;
-
-static struct uart_port __pminitdata __frv_uart0 = {
- .uartclk = 0,
- .membase = (char *) UART0_BASE,
- .irq = IRQ_CPU_UART0,
- .regshift = 3,
- .iotype = UPIO_MEM,
- .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,
-};
-
-static struct uart_port __pminitdata __frv_uart1 = {
- .uartclk = 0,
- .membase = (char *) UART1_BASE,
- .irq = IRQ_CPU_UART1,
- .regshift = 3,
- .iotype = UPIO_MEM,
- .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,
-};
-
-#if 0
-static void __init printk_xampr(unsigned long ampr, unsigned long amlr, char i_d, int n)
-{
- unsigned long phys, virt, cxn, size;
-
-#ifdef CONFIG_MMU
- virt = amlr & 0xffffc000;
- cxn = amlr & 0x3fff;
-#else
- virt = ampr & 0xffffc000;
- cxn = 0;
-#endif
- phys = ampr & xAMPRx_PPFN;
- size = 1 << (((ampr & xAMPRx_SS) >> 4) + 17);
-
- printk("%cAMPR%d: va %08lx-%08lx [pa %08lx] %c%c%c%c [cxn:%04lx]\n",
- i_d, n,
- virt, virt + size - 1,
- phys,
- ampr & xAMPRx_S ? 'S' : '-',
- ampr & xAMPRx_C ? 'C' : '-',
- ampr & DAMPRx_WP ? 'W' : '-',
- ampr & xAMPRx_V ? 'V' : '-',
- cxn
- );
-}
-#endif
-
-/*****************************************************************************/
-/*
- * dump the memory map
- */
-static void __init dump_memory_map(void)
-{
-
-#if 0
- /* dump the protection map */
- printk_xampr(__get_IAMPR(0), __get_IAMLR(0), 'I', 0);
- printk_xampr(__get_IAMPR(1), __get_IAMLR(1), 'I', 1);
- printk_xampr(__get_IAMPR(2), __get_IAMLR(2), 'I', 2);
- printk_xampr(__get_IAMPR(3), __get_IAMLR(3), 'I', 3);
- printk_xampr(__get_IAMPR(4), __get_IAMLR(4), 'I', 4);
- printk_xampr(__get_IAMPR(5), __get_IAMLR(5), 'I', 5);
- printk_xampr(__get_IAMPR(6), __get_IAMLR(6), 'I', 6);
- printk_xampr(__get_IAMPR(7), __get_IAMLR(7), 'I', 7);
- printk_xampr(__get_IAMPR(8), __get_IAMLR(8), 'I', 8);
- printk_xampr(__get_IAMPR(9), __get_IAMLR(9), 'i', 9);
- printk_xampr(__get_IAMPR(10), __get_IAMLR(10), 'I', 10);
- printk_xampr(__get_IAMPR(11), __get_IAMLR(11), 'I', 11);
- printk_xampr(__get_IAMPR(12), __get_IAMLR(12), 'I', 12);
- printk_xampr(__get_IAMPR(13), __get_IAMLR(13), 'I', 13);
- printk_xampr(__get_IAMPR(14), __get_IAMLR(14), 'I', 14);
- printk_xampr(__get_IAMPR(15), __get_IAMLR(15), 'I', 15);
-
- printk_xampr(__get_DAMPR(0), __get_DAMLR(0), 'D', 0);
- printk_xampr(__get_DAMPR(1), __get_DAMLR(1), 'D', 1);
- printk_xampr(__get_DAMPR(2), __get_DAMLR(2), 'D', 2);
- printk_xampr(__get_DAMPR(3), __get_DAMLR(3), 'D', 3);
- printk_xampr(__get_DAMPR(4), __get_DAMLR(4), 'D', 4);
- printk_xampr(__get_DAMPR(5), __get_DAMLR(5), 'D', 5);
- printk_xampr(__get_DAMPR(6), __get_DAMLR(6), 'D', 6);
- printk_xampr(__get_DAMPR(7), __get_DAMLR(7), 'D', 7);
- printk_xampr(__get_DAMPR(8), __get_DAMLR(8), 'D', 8);
- printk_xampr(__get_DAMPR(9), __get_DAMLR(9), 'D', 9);
- printk_xampr(__get_DAMPR(10), __get_DAMLR(10), 'D', 10);
- printk_xampr(__get_DAMPR(11), __get_DAMLR(11), 'D', 11);
- printk_xampr(__get_DAMPR(12), __get_DAMLR(12), 'D', 12);
- printk_xampr(__get_DAMPR(13), __get_DAMLR(13), 'D', 13);
- printk_xampr(__get_DAMPR(14), __get_DAMLR(14), 'D', 14);
- printk_xampr(__get_DAMPR(15), __get_DAMLR(15), 'D', 15);
-#endif
-
-#if 0
- /* dump the bus controller registers */
- printk("LGCR: %08lx\n", __get_LGCR());
- printk("Master: %08lx-%08lx CR=%08lx\n",
- __get_LEMBR(), __get_LEMBR() + __get_LEMAM(),
- __get_LMAICR());
-
- int loop;
- for (loop = 1; loop <= 7; loop++) {
- unsigned long lcr = __get_LCR(loop), lsbr = __get_LSBR(loop);
- printk("CS#%d: %08lx-%08lx %c%c%c%c%c%c%c%c%c\n",
- loop,
- lsbr, lsbr + __get_LSAM(loop),
- lcr & 0x80000000 ? 'r' : '-',
- lcr & 0x40000000 ? 'w' : '-',
- lcr & 0x08000000 ? 'b' : '-',
- lcr & 0x04000000 ? 'B' : '-',
- lcr & 0x02000000 ? 'C' : '-',
- lcr & 0x01000000 ? 'D' : '-',
- lcr & 0x00800000 ? 'W' : '-',
- lcr & 0x00400000 ? 'R' : '-',
- (lcr & 0x00030000) == 0x00000000 ? '4' :
- (lcr & 0x00030000) == 0x00010000 ? '2' :
- (lcr & 0x00030000) == 0x00020000 ? '1' :
- '-'
- );
- }
-#endif
-
-#if 0
- printk("\n");
-#endif
-} /* end dump_memory_map() */
-
-/*****************************************************************************/
-/*
- * attempt to detect a VDK motherboard and DAV daughter board on an MB93091 system
- */
-#ifdef CONFIG_MB93091_VDK
-static void __init detect_mb93091(void)
-{
-#ifdef CONFIG_MB93090_MB00
- /* Detect CB70 without motherboard */
- if (!(cpu_system == __frv_mb93091_cb70 && ((*(unsigned short *)0xffc00030) & 0x100))) {
- cpu_board1 = __frv_mb93090_mb00;
- mb93090_mb00_detected = 1;
- }
-#endif
-
-#ifdef CONFIG_FUJITSU_MB93493
- cpu_board2 = __frv_mb93493;
-#endif
-
-} /* end detect_mb93091() */
-#endif
-
-/*****************************************************************************/
-/*
- * determine the CPU type and set appropriate parameters
- *
- * Family Series CPU Core Silicon Imple Vers
- * ----------------------------------------------------------
- * FR-V --+-> FR400 --+-> FR401 --+-> MB93401 02 00 [1]
- * | | |
- * | | +-> MB93401/A 02 01
- * | | |
- * | | +-> MB93403 02 02
- * | |
- * | +-> FR405 ----> MB93405 04 00
- * |
- * +-> FR450 ----> FR451 ----> MB93451 05 00
- * |
- * +-> FR500 ----> FR501 --+-> MB93501 01 01 [2]
- * | |
- * | +-> MB93501/A 01 02
- * |
- * +-> FR550 --+-> FR551 ----> MB93555 03 01
- *
- * [1] The MB93401 is an obsolete CPU replaced by the MB93401A
- * [2] The MB93501 is an obsolete CPU replaced by the MB93501A
- *
- * Imple is PSR(Processor Status Register)[31:28].
- * Vers is PSR(Processor Status Register)[27:24].
- *
- * A "Silicon" consists of CPU core and some on-chip peripherals.
- */
-static void __init determine_cpu(void)
-{
- unsigned long hsr0 = __get_HSR(0);
- unsigned long psr = __get_PSR();
-
- /* work out what selectable services the CPU supports */
- __set_PSR(psr | PSR_EM | PSR_EF | PSR_CM | PSR_NEM);
- cpu_psr_all = __get_PSR();
- __set_PSR(psr);
-
- __set_HSR(0, hsr0 | HSR0_GRLE | HSR0_GRHE | HSR0_FRLE | HSR0_FRHE);
- cpu_hsr0_all = __get_HSR(0);
- __set_HSR(0, hsr0);
-
- /* derive other service specs from the CPU type */
- cpu_series = "unknown";
- cpu_core = "unknown";
- cpu_silicon = "unknown";
- cpu_mmu = "Prot";
- cpu_system = __frv_unknown_system;
- clock_cmodes = NULL;
- clock_doubled = 0;
-#ifdef CONFIG_PM
- clock_bits_settable = CLOCK_BIT_CM_H | CLOCK_BIT_CM_M | CLOCK_BIT_P0;
-#endif
-
- switch (PSR_IMPLE(psr)) {
- case PSR_IMPLE_FR401:
- cpu_series = "fr400";
- cpu_core = "fr401";
- pdm_suspend_mode = HSR0_PDM_PLL_RUN;
-
- switch (PSR_VERSION(psr)) {
- case PSR_VERSION_FR401_MB93401:
- cpu_silicon = "mb93401";
- cpu_system = __frv_mb93091_cb10;
- clock_cmodes = clock_cmodes_fr401_fr403;
- clock_doubled = 1;
- break;
- case PSR_VERSION_FR401_MB93401A:
- cpu_silicon = "mb93401/A";
- cpu_system = __frv_mb93091_cb11;
- clock_cmodes = clock_cmodes_fr401_fr403;
- break;
- case PSR_VERSION_FR401_MB93403:
- cpu_silicon = "mb93403";
-#ifndef CONFIG_MB93093_PDK
- cpu_system = __frv_mb93091_cb30;
-#else
- cpu_system = __frv_mb93093;
-#endif
- clock_cmodes = clock_cmodes_fr401_fr403;
- break;
- default:
- break;
- }
- break;
-
- case PSR_IMPLE_FR405:
- cpu_series = "fr400";
- cpu_core = "fr405";
- pdm_suspend_mode = HSR0_PDM_PLL_STOP;
-
- switch (PSR_VERSION(psr)) {
- case PSR_VERSION_FR405_MB93405:
- cpu_silicon = "mb93405";
- cpu_system = __frv_mb93091_cb60;
- clock_cmodes = clock_cmodes_fr405;
-#ifdef CONFIG_PM
- clock_bits_settable |= CLOCK_BIT_CMODE;
- clock_cmodes_permitted = CLOCK_CMODES_PERMITTED_FR405;
-#endif
-
- /* the FPGA on the CB70 has extra registers
- * - it has 0x0046 in the VDK_ID FPGA register at 0x1a0, which is
- * how we tell the difference between it and a CB60
- */
- if (*(volatile unsigned short *) 0xffc001a0 == 0x0046)
- cpu_system = __frv_mb93091_cb70;
- break;
- default:
- break;
- }
- break;
-
- case PSR_IMPLE_FR451:
- cpu_series = "fr450";
- cpu_core = "fr451";
- pdm_suspend_mode = HSR0_PDM_PLL_STOP;
-#ifdef CONFIG_PM
- clock_bits_settable |= CLOCK_BIT_CMODE;
- clock_cmodes_permitted = CLOCK_CMODES_PERMITTED_FR405;
-#endif
- switch (PSR_VERSION(psr)) {
- case PSR_VERSION_FR451_MB93451:
- cpu_silicon = "mb93451";
- cpu_mmu = "Prot, SAT, xSAT, DAT";
- cpu_system = __frv_mb93091_cb451;
- clock_cmodes = clock_cmodes_fr405;
- break;
- default:
- break;
- }
- break;
-
- case PSR_IMPLE_FR501:
- cpu_series = "fr500";
- cpu_core = "fr501";
- pdm_suspend_mode = HSR0_PDM_PLL_STOP;
-
- switch (PSR_VERSION(psr)) {
- case PSR_VERSION_FR501_MB93501: cpu_silicon = "mb93501"; break;
- case PSR_VERSION_FR501_MB93501A: cpu_silicon = "mb93501/A"; break;
- default:
- break;
- }
- break;
-
- case PSR_IMPLE_FR551:
- cpu_series = "fr550";
- cpu_core = "fr551";
- pdm_suspend_mode = HSR0_PDM_PLL_RUN;
-
- switch (PSR_VERSION(psr)) {
- case PSR_VERSION_FR551_MB93555:
- cpu_silicon = "mb93555";
- cpu_mmu = "Prot, SAT";
- cpu_system = __frv_mb93091_cb41;
- clock_cmodes = clock_cmodes_fr555;
- clock_doubled = 1;
- break;
- default:
- break;
- }
- break;
-
- default:
- break;
- }
-
- printk("- Series:%s CPU:%s Silicon:%s\n",
- cpu_series, cpu_core, cpu_silicon);
-
-#ifdef CONFIG_MB93091_VDK
- detect_mb93091();
-#endif
-
-#if defined(CONFIG_MB93093_PDK) && defined(CONFIG_FUJITSU_MB93493)
- cpu_board2 = __frv_mb93493;
-#endif
-
-} /* end determine_cpu() */
-
-/*****************************************************************************/
-/*
- * calculate the bus clock speed
- */
-void __pminit determine_clocks(int verbose)
-{
- const struct clock_cmode *mode, *tmode;
- unsigned long clkc, psr, quot;
-
- clkc = __get_CLKC();
- psr = __get_PSR();
-
- clock_p0_current = !!(clkc & CLKC_P0);
- clock_cm_current = clkc & CLKC_CM;
- clock_cmode_current = (clkc & CLKC_CMODE) >> CLKC_CMODE_s;
-
- if (verbose)
- printk("psr=%08lx hsr0=%08lx clkc=%08lx\n", psr, __get_HSR(0), clkc);
-
- /* the CB70 has some alternative ways of setting the clock speed through switches accessed
- * through the FPGA. */
- if (cpu_system == __frv_mb93091_cb70) {
- unsigned short clkswr = *(volatile unsigned short *) 0xffc00104UL & 0x1fffUL;
-
- if (clkswr & 0x1000)
- __clkin_clock_speed_HZ = 60000000UL;
- else
- __clkin_clock_speed_HZ =
- ((clkswr >> 8) & 0xf) * 10000000 +
- ((clkswr >> 4) & 0xf) * 1000000 +
- ((clkswr ) & 0xf) * 100000;
- }
- /* the FR451 is currently fixed at 24MHz */
- else if (cpu_system == __frv_mb93091_cb451) {
- //__clkin_clock_speed_HZ = 24000000UL; // CB451-FPGA
- unsigned short clkswr = *(volatile unsigned short *) 0xffc00104UL & 0x1fffUL;
-
- if (clkswr & 0x1000)
- __clkin_clock_speed_HZ = 60000000UL;
- else
- __clkin_clock_speed_HZ =
- ((clkswr >> 8) & 0xf) * 10000000 +
- ((clkswr >> 4) & 0xf) * 1000000 +
- ((clkswr ) & 0xf) * 100000;
- }
- /* otherwise determine the clockspeed from VDK or other registers */
- else {
- __clkin_clock_speed_HZ = __get_CLKIN();
- }
-
- /* look up the appropriate clock relationships table entry */
- mode = &undef_clock_cmode;
- if (clock_cmodes) {
- tmode = &clock_cmodes[(clkc & CLKC_CMODE) >> CLKC_CMODE_s];
- if (tmode->xbus)
- mode = tmode;
- }
-
-#define CLOCK(SRC,RATIO) ((SRC) * (((RATIO) >> 4) & 0x0f) / ((RATIO) & 0x0f))
-
- if (clock_doubled)
- __clkin_clock_speed_HZ <<= 1;
-
- __ext_bus_clock_speed_HZ = CLOCK(__clkin_clock_speed_HZ, mode->xbus);
- __sdram_clock_speed_HZ = CLOCK(__clkin_clock_speed_HZ, mode->sdram);
- __dsu_clock_speed_HZ = CLOCK(__clkin_clock_speed_HZ, mode->dsu);
-
- switch (clkc & CLKC_CM) {
- case 0: /* High */
- __core_bus_clock_speed_HZ = CLOCK(__clkin_clock_speed_HZ, mode->corebus);
- __core_clock_speed_HZ = CLOCK(__clkin_clock_speed_HZ, mode->core);
- break;
- case 1: /* Medium */
- __core_bus_clock_speed_HZ = CLOCK(__clkin_clock_speed_HZ, mode->sdram);
- __core_clock_speed_HZ = CLOCK(__clkin_clock_speed_HZ, mode->sdram);
- break;
- case 2: /* Low; not supported */
- case 3: /* UNDEF */
- printk("Unsupported CLKC CM %ld\n", clkc & CLKC_CM);
- panic("Bye");
- }
-
- __res_bus_clock_speed_HZ = __ext_bus_clock_speed_HZ;
- if (clkc & CLKC_P0)
- __res_bus_clock_speed_HZ >>= 1;
-
- if (verbose) {
- printk("CLKIN: %lu.%3.3luMHz\n",
- __clkin_clock_speed_HZ / 1000000,
- (__clkin_clock_speed_HZ / 1000) % 1000);
-
- printk("CLKS:"
- " ext=%luMHz res=%luMHz sdram=%luMHz cbus=%luMHz core=%luMHz dsu=%luMHz\n",
- __ext_bus_clock_speed_HZ / 1000000,
- __res_bus_clock_speed_HZ / 1000000,
- __sdram_clock_speed_HZ / 1000000,
- __core_bus_clock_speed_HZ / 1000000,
- __core_clock_speed_HZ / 1000000,
- __dsu_clock_speed_HZ / 1000000
- );
- }
-
- /* calculate the number of __delay() loop iterations per sec (2 insn loop) */
- __delay_loops_MHz = __core_clock_speed_HZ / (1000000 * 2);
-
- /* set the serial prescaler */
- __serial_clock_speed_HZ = __res_bus_clock_speed_HZ;
- quot = 1;
- while (__serial_clock_speed_HZ / quot / 16 / 65536 > 3000)
- quot += 1;
-
- /* double the divisor if P0 is clear, so that if/when P0 is set, it's still achievable
- * - we have to be careful - dividing too much can mean we can't get 115200 baud
- */
- if (__serial_clock_speed_HZ > 32000000 && !(clkc & CLKC_P0))
- quot <<= 1;
-
- __serial_clock_speed_HZ /= quot;
- __frv_uart0.uartclk = __serial_clock_speed_HZ;
- __frv_uart1.uartclk = __serial_clock_speed_HZ;
-
- if (verbose)
- printk(" uart=%luMHz\n", __serial_clock_speed_HZ / 1000000 * quot);
-
- while (!(__get_UART0_LSR() & UART_LSR_TEMT))
- continue;
-
- while (!(__get_UART1_LSR() & UART_LSR_TEMT))
- continue;
-
- __set_UCPVR(quot);
- __set_UCPSR(0);
-} /* end determine_clocks() */
-
-/*****************************************************************************/
-/*
- * reserve some DMA consistent memory
- */
-#ifdef CONFIG_RESERVE_DMA_COHERENT
-static void __init reserve_dma_coherent(void)
-{
- unsigned long ampr;
-
- /* find the first non-kernel memory tile and steal it */
-#define __steal_AMPR(r) \
- if (__get_DAMPR(r) & xAMPRx_V) { \
- ampr = __get_DAMPR(r); \
- __set_DAMPR(r, ampr | xAMPRx_S | xAMPRx_C); \
- __set_IAMPR(r, 0); \
- goto found; \
- }
-
- __steal_AMPR(1);
- __steal_AMPR(2);
- __steal_AMPR(3);
- __steal_AMPR(4);
- __steal_AMPR(5);
- __steal_AMPR(6);
-
- if (PSR_IMPLE(__get_PSR()) == PSR_IMPLE_FR551) {
- __steal_AMPR(7);
- __steal_AMPR(8);
- __steal_AMPR(9);
- __steal_AMPR(10);
- __steal_AMPR(11);
- __steal_AMPR(12);
- __steal_AMPR(13);
- __steal_AMPR(14);
- }
-
- /* unable to grant any DMA consistent memory */
- printk("No DMA consistent memory reserved\n");
- return;
-
- found:
- dma_coherent_mem_start = ampr & xAMPRx_PPFN;
- ampr &= xAMPRx_SS;
- ampr >>= 4;
- ampr = 1 << (ampr - 3 + 20);
- dma_coherent_mem_end = dma_coherent_mem_start + ampr;
-
- printk("DMA consistent memory reserved %lx-%lx\n",
- dma_coherent_mem_start, dma_coherent_mem_end);
-
-} /* end reserve_dma_coherent() */
-#endif
-
-/*****************************************************************************/
-/*
- * calibrate the delay loop
- */
-void calibrate_delay(void)
-{
- loops_per_jiffy = __delay_loops_MHz * (1000000 / HZ);
-
- printk("Calibrating delay loop... %lu.%02lu BogoMIPS\n",
- loops_per_jiffy / (500000 / HZ),
- (loops_per_jiffy / (5000 / HZ)) % 100);
-
-} /* end calibrate_delay() */
-
-/*****************************************************************************/
-/*
- * look through the command line for some things we need to know immediately
- */
-static void __init parse_cmdline_early(char *cmdline)
-{
- if (!cmdline)
- return;
-
- while (*cmdline) {
- if (*cmdline == ' ')
- cmdline++;
-
- /* "mem=XXX[kKmM]" sets SDRAM size to <mem>, overriding the value we worked
- * out from the SDRAM controller mask register
- */
- if (!strncmp(cmdline, "mem=", 4)) {
- unsigned long long mem_size;
-
- mem_size = memparse(cmdline + 4, &cmdline);
- memory_end = memory_start + mem_size;
- }
-
- while (*cmdline && *cmdline != ' ')
- cmdline++;
- }
-
-} /* end parse_cmdline_early() */
-
-/*****************************************************************************/
-/*
- *
- */
-void __init setup_arch(char **cmdline_p)
-{
-#ifdef CONFIG_MMU
- printk("Linux FR-V port done by Red Hat Inc <dhowells@redhat.com>\n");
-#else
- printk("uClinux FR-V port done by Red Hat Inc <dhowells@redhat.com>\n");
-#endif
-
- memcpy(boot_command_line, redboot_command_line, COMMAND_LINE_SIZE);
-
- determine_cpu();
- determine_clocks(1);
-
- /* For printk-directly-beats-on-serial-hardware hack */
- console_set_baud(115200);
-#ifdef CONFIG_GDBSTUB
- gdbstub_set_baud(115200);
-#endif
-
-#ifdef CONFIG_RESERVE_DMA_COHERENT
- reserve_dma_coherent();
-#endif
- dump_memory_map();
-
-#ifdef CONFIG_MB93090_MB00
- if (mb93090_mb00_detected)
- mb93090_display();
-#endif
-
- /* register those serial ports that are available */
-#ifdef CONFIG_FRV_ONCPU_SERIAL
-#ifndef CONFIG_GDBSTUB_UART0
- __reg(UART0_BASE + UART_IER * 8) = 0;
- early_serial_setup(&__frv_uart0);
-#endif
-#ifndef CONFIG_GDBSTUB_UART1
- __reg(UART1_BASE + UART_IER * 8) = 0;
- early_serial_setup(&__frv_uart1);
-#endif
-#endif
-
- /* deal with the command line - RedBoot may have passed one to the kernel */
- memcpy(command_line, boot_command_line, sizeof(command_line));
- *cmdline_p = &command_line[0];
- parse_cmdline_early(command_line);
-
- /* set up the memory description
- * - by now the stack is part of the init task */
- printk("Memory %08lx-%08lx\n", memory_start, memory_end);
-
- BUG_ON(memory_start == memory_end);
-
- init_mm.start_code = (unsigned long) _stext;
- init_mm.end_code = (unsigned long) _etext;
- init_mm.end_data = (unsigned long) _edata;
-#if 0 /* DAVIDM - don't set brk just incase someone decides to use it */
- init_mm.brk = (unsigned long) &_end;
-#else
- init_mm.brk = (unsigned long) 0;
-#endif
-
-#ifdef DEBUG
- printk("KERNEL -> TEXT=0x%p-0x%p DATA=0x%p-0x%p BSS=0x%p-0x%p\n",
- _stext, _etext, _sdata, _edata, __bss_start, __bss_stop);
-#endif
-
-#ifdef CONFIG_VT
-#if defined(CONFIG_VGA_CONSOLE)
- conswitchp = &vga_con;
-#elif defined(CONFIG_DUMMY_CONSOLE)
- conswitchp = &dummy_con;
-#endif
-#endif
-
-#ifdef CONFIG_MMU
- setup_linux_memory();
-#else
- setup_uclinux_memory();
-#endif
-
- /* get kmalloc into gear */
- paging_init();
-
- /* init DMA */
- frv_dma_init();
-#ifdef DEBUG
- printk("Done setup_arch\n");
-#endif
-
- /* start the decrement timer running */
-// asm volatile("movgs %0,timerd" :: "r"(10000000));
-// __set_HSR(0, __get_HSR(0) | HSR0_ETMD);
-
-} /* end setup_arch() */
-
-#if 0
-/*****************************************************************************/
-/*
- *
- */
-static int setup_arch_serial(void)
-{
- /* register those serial ports that are available */
-#ifndef CONFIG_GDBSTUB_UART0
- early_serial_setup(&__frv_uart0);
-#endif
-#ifndef CONFIG_GDBSTUB_UART1
- early_serial_setup(&__frv_uart1);
-#endif
-
- return 0;
-} /* end setup_arch_serial() */
-
-late_initcall(setup_arch_serial);
-#endif
-
-/*****************************************************************************/
-/*
- * set up the memory map for normal MMU linux
- */
-#ifdef CONFIG_MMU
-static void __init setup_linux_memory(void)
-{
- unsigned long bootmap_size, low_top_pfn, kstart, kend, high_mem;
- unsigned long physpages;
-
- kstart = (unsigned long) &__kernel_image_start - PAGE_OFFSET;
- kend = (unsigned long) &__kernel_image_end - PAGE_OFFSET;
-
- kstart = kstart & PAGE_MASK;
- kend = (kend + PAGE_SIZE - 1) & PAGE_MASK;
-
- /* give all the memory to the bootmap allocator, tell it to put the
- * boot mem_map immediately following the kernel image
- */
- bootmap_size = init_bootmem_node(NODE_DATA(0),
- kend >> PAGE_SHIFT, /* map addr */
- memory_start >> PAGE_SHIFT, /* start of RAM */
- memory_end >> PAGE_SHIFT /* end of RAM */
- );
-
- /* pass the memory that the kernel can immediately use over to the bootmem allocator */
- max_mapnr = physpages = (memory_end - memory_start) >> PAGE_SHIFT;
- low_top_pfn = (KERNEL_LOWMEM_END - KERNEL_LOWMEM_START) >> PAGE_SHIFT;
- high_mem = 0;
-
- if (physpages > low_top_pfn) {
-#ifdef CONFIG_HIGHMEM
- high_mem = physpages - low_top_pfn;
-#else
- max_mapnr = physpages = low_top_pfn;
-#endif
- }
- else {
- low_top_pfn = physpages;
- }
-
- min_low_pfn = memory_start >> PAGE_SHIFT;
- max_low_pfn = low_top_pfn;
- max_pfn = memory_end >> PAGE_SHIFT;
-
- num_mappedpages = low_top_pfn;
-
- printk(KERN_NOTICE "%ldMB LOWMEM available.\n", low_top_pfn >> (20 - PAGE_SHIFT));
-
- free_bootmem(memory_start, low_top_pfn << PAGE_SHIFT);
-
-#ifdef CONFIG_HIGHMEM
- if (high_mem)
- printk(KERN_NOTICE "%ldMB HIGHMEM available.\n", high_mem >> (20 - PAGE_SHIFT));
-#endif
-
- /* take back the memory occupied by the kernel image and the bootmem alloc map */
- reserve_bootmem(kstart, kend - kstart + bootmap_size,
- BOOTMEM_DEFAULT);
-
- /* reserve the memory occupied by the initial ramdisk */
-#ifdef CONFIG_BLK_DEV_INITRD
- if (LOADER_TYPE && INITRD_START) {
- if (INITRD_START + INITRD_SIZE <= (low_top_pfn << PAGE_SHIFT)) {
- reserve_bootmem(INITRD_START, INITRD_SIZE,
- BOOTMEM_DEFAULT);
- initrd_start = INITRD_START + PAGE_OFFSET;
- initrd_end = initrd_start + INITRD_SIZE;
- }
- else {
- printk(KERN_ERR
- "initrd extends beyond end of memory (0x%08lx > 0x%08lx)\n"
- "disabling initrd\n",
- INITRD_START + INITRD_SIZE,
- low_top_pfn << PAGE_SHIFT);
- initrd_start = 0;
- }
- }
-#endif
-
-} /* end setup_linux_memory() */
-#endif
-
-/*****************************************************************************/
-/*
- * set up the memory map for uClinux
- */
-#ifndef CONFIG_MMU
-static void __init setup_uclinux_memory(void)
-{
-#ifdef CONFIG_PROTECT_KERNEL
- unsigned long dampr;
-#endif
- unsigned long kend;
- int bootmap_size;
-
- kend = (unsigned long) &__kernel_image_end;
- kend = (kend + PAGE_SIZE - 1) & PAGE_MASK;
-
- /* give all the memory to the bootmap allocator, tell it to put the
- * boot mem_map immediately following the kernel image
- */
- bootmap_size = init_bootmem_node(NODE_DATA(0),
- kend >> PAGE_SHIFT, /* map addr */
- memory_start >> PAGE_SHIFT, /* start of RAM */
- memory_end >> PAGE_SHIFT /* end of RAM */
- );
-
- /* free all the usable memory */
- free_bootmem(memory_start, memory_end - memory_start);
-
- high_memory = (void *) (memory_end & PAGE_MASK);
- max_mapnr = ((unsigned long) high_memory - PAGE_OFFSET) >> PAGE_SHIFT;
-
- min_low_pfn = memory_start >> PAGE_SHIFT;
- max_low_pfn = memory_end >> PAGE_SHIFT;
- max_pfn = max_low_pfn;
-
- /* now take back the bits the core kernel is occupying */
-#ifndef CONFIG_PROTECT_KERNEL
- reserve_bootmem(kend, bootmap_size, BOOTMEM_DEFAULT);
- reserve_bootmem((unsigned long) &__kernel_image_start,
- kend - (unsigned long) &__kernel_image_start,
- BOOTMEM_DEFAULT);
-
-#else
- dampr = __get_DAMPR(0);
- dampr &= xAMPRx_SS;
- dampr = (dampr >> 4) + 17;
- dampr = 1 << dampr;
-
- reserve_bootmem(__get_DAMPR(0) & xAMPRx_PPFN, dampr, BOOTMEM_DEFAULT);
-#endif
-
- /* reserve some memory to do uncached DMA through if requested */
-#ifdef CONFIG_RESERVE_DMA_COHERENT
- if (dma_coherent_mem_start)
- reserve_bootmem(dma_coherent_mem_start,
- dma_coherent_mem_end - dma_coherent_mem_start,
- BOOTMEM_DEFAULT);
-#endif
-
-} /* end setup_uclinux_memory() */
-#endif
-
-/*****************************************************************************/
-/*
- * get CPU information for use by procfs
- */
-static int show_cpuinfo(struct seq_file *m, void *v)
-{
- const char *gr, *fr, *fm, *fp, *cm, *nem, *ble;
-#ifdef CONFIG_PM
- const char *sep;
-#endif
-
- gr = cpu_hsr0_all & HSR0_GRHE ? "gr0-63" : "gr0-31";
- fr = cpu_hsr0_all & HSR0_FRHE ? "fr0-63" : "fr0-31";
- fm = cpu_psr_all & PSR_EM ? ", Media" : "";
- fp = cpu_psr_all & PSR_EF ? ", FPU" : "";
- cm = cpu_psr_all & PSR_CM ? ", CCCR" : "";
- nem = cpu_psr_all & PSR_NEM ? ", NE" : "";
- ble = cpu_psr_all & PSR_BE ? "BE" : "LE";
-
- seq_printf(m,
- "CPU-Series:\t%s\n"
- "CPU-Core:\t%s, %s, %s%s%s\n"
- "CPU:\t\t%s\n"
- "MMU:\t\t%s\n"
- "FP-Media:\t%s%s%s\n"
- "System:\t\t%s",
- cpu_series,
- cpu_core, gr, ble, cm, nem,
- cpu_silicon,
- cpu_mmu,
- fr, fm, fp,
- cpu_system);
-
- if (cpu_board1)
- seq_printf(m, ", %s", cpu_board1);
-
- if (cpu_board2)
- seq_printf(m, ", %s", cpu_board2);
-
- seq_printf(m, "\n");
-
-#ifdef CONFIG_PM
- seq_printf(m, "PM-Controls:");
- sep = "\t";
-
- if (clock_bits_settable & CLOCK_BIT_CMODE) {
- seq_printf(m, "%scmode=0x%04hx", sep, clock_cmodes_permitted);
- sep = ", ";
- }
-
- if (clock_bits_settable & CLOCK_BIT_CM) {
- seq_printf(m, "%scm=0x%lx", sep, clock_bits_settable & CLOCK_BIT_CM);
- sep = ", ";
- }
-
- if (clock_bits_settable & CLOCK_BIT_P0) {
- seq_printf(m, "%sp0=0x3", sep);
- sep = ", ";
- }
-
- seq_printf(m, "%ssuspend=0x22\n", sep);
-#endif
-
- seq_printf(m,
- "PM-Status:\tcmode=%d, cm=%d, p0=%d\n",
- clock_cmode_current, clock_cm_current, clock_p0_current);
-
-#define print_clk(TAG, VAR) \
- seq_printf(m, "Clock-" TAG ":\t%lu.%2.2lu MHz\n", VAR / 1000000, (VAR / 10000) % 100)
-
- print_clk("In", __clkin_clock_speed_HZ);
- print_clk("Core", __core_clock_speed_HZ);
- print_clk("SDRAM", __sdram_clock_speed_HZ);
- print_clk("CBus", __core_bus_clock_speed_HZ);
- print_clk("Res", __res_bus_clock_speed_HZ);
- print_clk("Ext", __ext_bus_clock_speed_HZ);
- print_clk("DSU", __dsu_clock_speed_HZ);
-
- seq_printf(m,
- "BogoMips:\t%lu.%02lu\n",
- (loops_per_jiffy * HZ) / 500000, ((loops_per_jiffy * HZ) / 5000) % 100);
-
- return 0;
-} /* end show_cpuinfo() */
-
-static void *c_start(struct seq_file *m, loff_t *pos)
-{
- return *pos < NR_CPUS ? (void *) 0x12345678 : 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,
-};
-
-void arch_gettod(int *year, int *mon, int *day, int *hour,
- int *min, int *sec)
-{
- *year = *mon = *day = *hour = *min = *sec = 0;
-}
-
-/*****************************************************************************/
-/*
- *
- */
-#ifdef CONFIG_MB93090_MB00
-static void __init mb93090_sendlcdcmd(uint32_t cmd)
-{
- unsigned long base = __addr_LCD();
- int loop;
-
- /* request reading of the busy flag */
- __set_LCD(base, LCD_CMD_READ_BUSY);
- __set_LCD(base, LCD_CMD_READ_BUSY & ~LCD_E);
-
- /* wait for the busy flag to become clear */
- for (loop = 10000; loop > 0; loop--)
- if (!(__get_LCD(base) & 0x80))
- break;
-
- /* send the command */
- __set_LCD(base, cmd);
- __set_LCD(base, cmd & ~LCD_E);
-
-} /* end mb93090_sendlcdcmd() */
-
-/*****************************************************************************/
-/*
- * write to the MB93090 LEDs and LCD
- */
-static void __init mb93090_display(void)
-{
- const char *p;
-
- __set_LEDS(0);
-
- /* set up the LCD */
- mb93090_sendlcdcmd(LCD_CMD_CLEAR);
- mb93090_sendlcdcmd(LCD_CMD_FUNCSET(1,1,0));
- mb93090_sendlcdcmd(LCD_CMD_ON(0,0));
- mb93090_sendlcdcmd(LCD_CMD_HOME);
-
- mb93090_sendlcdcmd(LCD_CMD_SET_DD_ADDR(0));
- for (p = mb93090_banner; *p; p++)
- mb93090_sendlcdcmd(LCD_DATA_WRITE(*p));
-
- mb93090_sendlcdcmd(LCD_CMD_SET_DD_ADDR(64));
- for (p = mb93090_version; *p; p++)
- mb93090_sendlcdcmd(LCD_DATA_WRITE(*p));
-
-} /* end mb93090_display() */
-
-#endif // CONFIG_MB93090_MB00
diff --git a/arch/frv/kernel/signal.c b/arch/frv/kernel/signal.c
deleted file mode 100644
index bf6e07a7a1b1..000000000000
--- a/arch/frv/kernel/signal.c
+++ /dev/null
@@ -1,426 +0,0 @@
-/* signal.c: FRV specific bits of signal handling
- *
- * Copyright (C) 2003-5 Red Hat, Inc. All Rights Reserved.
- * Written by David Howells (dhowells@redhat.com)
- * - Derived from arch/m68k/kernel/signal.c
- *
- * 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.
- */
-
-#include <linux/sched.h>
-#include <linux/mm.h>
-#include <linux/smp.h>
-#include <linux/kernel.h>
-#include <linux/signal.h>
-#include <linux/errno.h>
-#include <linux/wait.h>
-#include <linux/ptrace.h>
-#include <linux/unistd.h>
-#include <linux/personality.h>
-#include <linux/tracehook.h>
-#include <asm/ucontext.h>
-#include <linux/uaccess.h>
-#include <asm/cacheflush.h>
-
-#define DEBUG_SIG 0
-
-struct fdpic_func_descriptor {
- unsigned long text;
- unsigned long GOT;
-};
-
-/*
- * Do a signal return; undo the signal stack.
- */
-
-struct sigframe
-{
- __sigrestore_t pretcode;
- int sig;
- struct sigcontext sc;
- unsigned long extramask[_NSIG_WORDS-1];
- uint32_t retcode[2];
-};
-
-struct rt_sigframe
-{
- __sigrestore_t pretcode;
- int sig;
- struct siginfo __user *pinfo;
- void __user *puc;
- struct siginfo info;
- struct ucontext uc;
- uint32_t retcode[2];
-};
-
-static int restore_sigcontext(struct sigcontext __user *sc, int *_gr8)
-{
- struct user_context *user = current->thread.user;
- unsigned long tbr, psr;
-
- /* Always make any pending restarted system calls return -EINTR */
- current->restart_block.fn = do_no_restart_syscall;
-
- tbr = user->i.tbr;
- psr = user->i.psr;
- if (copy_from_user(user, &sc->sc_context, sizeof(sc->sc_context)))
- goto badframe;
- user->i.tbr = tbr;
- user->i.psr = psr;
-
- restore_user_regs(user);
-
- user->i.syscallno = -1; /* disable syscall checks */
-
- *_gr8 = user->i.gr[8];
- return 0;
-
- badframe:
- return 1;
-}
-
-asmlinkage int sys_sigreturn(void)
-{
- struct sigframe __user *frame = (struct sigframe __user *) __frame->sp;
- sigset_t set;
- int gr8;
-
- if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
- goto badframe;
- if (__get_user(set.sig[0], &frame->sc.sc_oldmask))
- goto badframe;
-
- if (_NSIG_WORDS > 1 &&
- __copy_from_user(&set.sig[1], &frame->extramask, sizeof(frame->extramask)))
- goto badframe;
-
- set_current_blocked(&set);
-
- if (restore_sigcontext(&frame->sc, &gr8))
- goto badframe;
- return gr8;
-
- badframe:
- force_sig(SIGSEGV, current);
- return 0;
-}
-
-asmlinkage int sys_rt_sigreturn(void)
-{
- struct rt_sigframe __user *frame = (struct rt_sigframe __user *) __frame->sp;
- sigset_t set;
- int gr8;
-
- if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
- goto badframe;
- if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
- goto badframe;
-
- set_current_blocked(&set);
-
- if (restore_sigcontext(&frame->uc.uc_mcontext, &gr8))
- goto badframe;
-
- if (restore_altstack(&frame->uc.uc_stack))
- goto badframe;
-
- return gr8;
-
-badframe:
- force_sig(SIGSEGV, current);
- return 0;
-}
-
-/*
- * Set up a signal frame
- */
-static int setup_sigcontext(struct sigcontext __user *sc, unsigned long mask)
-{
- save_user_regs(current->thread.user);
-
- if (copy_to_user(&sc->sc_context, current->thread.user, sizeof(sc->sc_context)) != 0)
- goto badframe;
-
- /* non-iBCS2 extensions.. */
- if (__put_user(mask, &sc->sc_oldmask) < 0)
- goto badframe;
-
- return 0;
-
- badframe:
- return 1;
-}
-
-/*****************************************************************************/
-/*
- * Determine which stack to use..
- */
-static inline void __user *get_sigframe(struct ksignal *ksig,
- size_t frame_size)
-{
- unsigned long sp = sigsp(__frame->sp, ksig);
-
- return (void __user *) ((sp - frame_size) & ~7UL);
-
-} /* end get_sigframe() */
-
-/*****************************************************************************/
-/*
- *
- */
-static int setup_frame(struct ksignal *ksig, sigset_t *set)
-{
- struct sigframe __user *frame;
- int sig = ksig->sig;
-
- frame = get_sigframe(ksig, sizeof(*frame));
-
- if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
- return -EFAULT;
-
- if (__put_user(sig, &frame->sig) < 0)
- return -EFAULT;
-
- if (setup_sigcontext(&frame->sc, set->sig[0]))
- return -EFAULT;
-
- if (_NSIG_WORDS > 1) {
- if (__copy_to_user(frame->extramask, &set->sig[1],
- sizeof(frame->extramask)))
- return -EFAULT;
- }
-
- /* Set up to return from userspace. If provided, use a stub
- * already in userspace. */
- if (ksig->ka.sa.sa_flags & SA_RESTORER) {
- if (__put_user(ksig->ka.sa.sa_restorer, &frame->pretcode) < 0)
- return -EFAULT;
- }
- else {
- /* Set up the following code on the stack:
- * setlos #__NR_sigreturn,gr7
- * tira gr0,0
- */
- if (__put_user((__sigrestore_t)frame->retcode, &frame->pretcode) ||
- __put_user(0x8efc0000|__NR_sigreturn, &frame->retcode[0]) ||
- __put_user(0xc0700000, &frame->retcode[1]))
- return -EFAULT;
-
- flush_icache_range((unsigned long) frame->retcode,
- (unsigned long) (frame->retcode + 2));
- }
-
- /* Set up registers for the signal handler */
- if (current->personality & FDPIC_FUNCPTRS) {
- struct fdpic_func_descriptor __user *funcptr =
- (struct fdpic_func_descriptor __user *) ksig->ka.sa.sa_handler;
- struct fdpic_func_descriptor desc;
- if (copy_from_user(&desc, funcptr, sizeof(desc)))
- return -EFAULT;
- __frame->pc = desc.text;
- __frame->gr15 = desc.GOT;
- } else {
- __frame->pc = (unsigned long) ksig->ka.sa.sa_handler;
- __frame->gr15 = 0;
- }
-
- __frame->sp = (unsigned long) frame;
- __frame->lr = (unsigned long) &frame->retcode;
- __frame->gr8 = sig;
-
-#if DEBUG_SIG
- printk("SIG deliver %d (%s:%d): sp=%p pc=%lx ra=%p\n",
- sig, current->comm, current->pid, frame, __frame->pc,
- frame->pretcode);
-#endif
-
- return 0;
-} /* end setup_frame() */
-
-/*****************************************************************************/
-/*
- *
- */
-static int setup_rt_frame(struct ksignal *ksig, sigset_t *set)
-{
- struct rt_sigframe __user *frame;
- int sig = ksig->sig;
-
- frame = get_sigframe(ksig, sizeof(*frame));
-
- if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
- return -EFAULT;
-
- if (__put_user(sig, &frame->sig) ||
- __put_user(&frame->info, &frame->pinfo) ||
- __put_user(&frame->uc, &frame->puc))
- return -EFAULT;
-
- if (copy_siginfo_to_user(&frame->info, &ksig->info))
- return -EFAULT;
-
- /* Create the ucontext. */
- if (__put_user(0, &frame->uc.uc_flags) ||
- __put_user(NULL, &frame->uc.uc_link) ||
- __save_altstack(&frame->uc.uc_stack, __frame->sp))
- return -EFAULT;
-
- if (setup_sigcontext(&frame->uc.uc_mcontext, set->sig[0]))
- return -EFAULT;
-
- if (__copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)))
- return -EFAULT;
-
- /* Set up to return from userspace. If provided, use a stub
- * already in userspace. */
- if (ksig->ka.sa.sa_flags & SA_RESTORER) {
- if (__put_user(ksig->ka.sa.sa_restorer, &frame->pretcode))
- return -EFAULT;
- }
- else {
- /* Set up the following code on the stack:
- * setlos #__NR_sigreturn,gr7
- * tira gr0,0
- */
- if (__put_user((__sigrestore_t)frame->retcode, &frame->pretcode) ||
- __put_user(0x8efc0000|__NR_rt_sigreturn, &frame->retcode[0]) ||
- __put_user(0xc0700000, &frame->retcode[1]))
- return -EFAULT;
-
- flush_icache_range((unsigned long) frame->retcode,
- (unsigned long) (frame->retcode + 2));
- }
-
- /* Set up registers for signal handler */
- if (current->personality & FDPIC_FUNCPTRS) {
- struct fdpic_func_descriptor __user *funcptr =
- (struct fdpic_func_descriptor __user *) ksig->ka.sa.sa_handler;
- struct fdpic_func_descriptor desc;
- if (copy_from_user(&desc, funcptr, sizeof(desc)))
- return -EFAULT;
- __frame->pc = desc.text;
- __frame->gr15 = desc.GOT;
- } else {
- __frame->pc = (unsigned long) ksig->ka.sa.sa_handler;
- __frame->gr15 = 0;
- }
-
- __frame->sp = (unsigned long) frame;
- __frame->lr = (unsigned long) &frame->retcode;
- __frame->gr8 = sig;
- __frame->gr9 = (unsigned long) &frame->info;
-
-#if DEBUG_SIG
- printk("SIG deliver %d (%s:%d): sp=%p pc=%lx ra=%p\n",
- sig, current->comm, current->pid, frame, __frame->pc,
- frame->pretcode);
-#endif
- return 0;
-
-} /* end setup_rt_frame() */
-
-/*****************************************************************************/
-/*
- * OK, we're invoking a handler
- */
-static void handle_signal(struct ksignal *ksig)
-{
- sigset_t *oldset = sigmask_to_save();
- int ret;
-
- /* Are we from a system call? */
- if (__frame->syscallno != -1) {
- /* If so, check system call restarting.. */
- switch (__frame->gr8) {
- case -ERESTART_RESTARTBLOCK:
- case -ERESTARTNOHAND:
- __frame->gr8 = -EINTR;
- break;
-
- case -ERESTARTSYS:
- if (!(ksig->ka.sa.sa_flags & SA_RESTART)) {
- __frame->gr8 = -EINTR;
- break;
- }
-
- /* fallthrough */
- case -ERESTARTNOINTR:
- __frame->gr8 = __frame->orig_gr8;
- __frame->pc -= 4;
- }
- __frame->syscallno = -1;
- }
-
- /* Set up the stack frame */
- if (ksig->ka.sa.sa_flags & SA_SIGINFO)
- ret = setup_rt_frame(ksig, oldset);
- else
- ret = setup_frame(ksig, oldset);
-
- signal_setup_done(ret, ksig, test_thread_flag(TIF_SINGLESTEP));
-} /* end handle_signal() */
-
-/*****************************************************************************/
-/*
- * Note that 'init' is a special process: it doesn't get signals it doesn't
- * want to handle. Thus you cannot kill init even with a SIGKILL even by
- * mistake.
- */
-static void do_signal(void)
-{
- struct ksignal ksig;
-
- if (get_signal(&ksig)) {
- handle_signal(&ksig);
- return;
- }
-
- /* Did we come from a system call? */
- if (__frame->syscallno != -1) {
- /* Restart the system call - no handlers present */
- switch (__frame->gr8) {
- case -ERESTARTNOHAND:
- case -ERESTARTSYS:
- case -ERESTARTNOINTR:
- __frame->gr8 = __frame->orig_gr8;
- __frame->pc -= 4;
- break;
-
- case -ERESTART_RESTARTBLOCK:
- __frame->gr7 = __NR_restart_syscall;
- __frame->pc -= 4;
- break;
- }
- __frame->syscallno = -1;
- }
-
- /* if there's no signal to deliver, we just put the saved sigmask
- * back */
- restore_saved_sigmask();
-} /* end do_signal() */
-
-/*****************************************************************************/
-/*
- * notification of userspace execution resumption
- * - triggered by the TIF_WORK_MASK flags
- */
-asmlinkage void do_notify_resume(__u32 thread_info_flags)
-{
- /* pending single-step? */
- if (thread_info_flags & _TIF_SINGLESTEP)
- clear_thread_flag(TIF_SINGLESTEP);
-
- /* deal with pending signal delivery */
- if (thread_info_flags & _TIF_SIGPENDING)
- do_signal();
-
- /* deal with notification on about to resume userspace execution */
- if (thread_info_flags & _TIF_NOTIFY_RESUME) {
- clear_thread_flag(TIF_NOTIFY_RESUME);
- tracehook_notify_resume(__frame);
- }
-
-} /* end do_notify_resume() */
diff --git a/arch/frv/kernel/sleep.S b/arch/frv/kernel/sleep.S
deleted file mode 100644
index f67bf73cd2cc..000000000000
--- a/arch/frv/kernel/sleep.S
+++ /dev/null
@@ -1,373 +0,0 @@
-/* sleep.S: power saving mode entry
- *
- * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
- * Written by David Woodhouse (dwmw2@infradead.org)
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
- *
- */
-
-#include <linux/sys.h>
-#include <linux/linkage.h>
-#include <asm/setup.h>
-#include <asm/segment.h>
-#include <asm/page.h>
-#include <asm/ptrace.h>
-#include <asm/errno.h>
-#include <asm/cache.h>
-#include <asm/spr-regs.h>
-
-#define __addr_MASK 0xfeff9820 /* interrupt controller mask */
-
-#define __addr_FR55X_DRCN 0xfeff0218 /* Address of DRCN register */
-#define FR55X_DSTS_OFFSET -4 /* Offset from DRCN to DSTS */
-#define FR55X_SDRAMC_DSTS_SSI 0x00000002 /* indicates that the SDRAM is in self-refresh mode */
-
-#define __addr_FR4XX_DRCN 0xfe000430 /* Address of DRCN register */
-#define FR4XX_DSTS_OFFSET -8 /* Offset from DRCN to DSTS */
-#define FR4XX_SDRAMC_DSTS_SSI 0x00000001 /* indicates that the SDRAM is in self-refresh mode */
-
-#define SDRAMC_DRCN_SR 0x00000001 /* transition SDRAM into self-refresh mode */
-
- .section .bss
- .balign 8
- .globl __sleep_save_area
-__sleep_save_area:
- .space 16
-
-
- .text
- .balign 4
-
-.macro li v r
- sethi.p %hi(\v),\r
- setlo %lo(\v),\r
-.endm
-
-#ifdef CONFIG_PM
-###############################################################################
-#
-# CPU suspension routine
-# - void frv_cpu_suspend(unsigned long pdm_mode)
-#
-###############################################################################
- .globl frv_cpu_suspend
- .type frv_cpu_suspend,@function
-frv_cpu_suspend:
-
- #----------------------------------------------------
- # save hsr0, psr, isr, and lr for resume code
- #----------------------------------------------------
- li __sleep_save_area,gr11
-
- movsg hsr0,gr4
- movsg psr,gr5
- movsg isr,gr6
- movsg lr,gr7
- stdi gr4,@(gr11,#0)
- stdi gr6,@(gr11,#8)
-
- # store the return address from sleep in GR14, and its complement in GR13 as a check
- li __ramboot_resume,gr14
-#ifdef CONFIG_MMU
- # Resume via RAMBOOT# will turn MMU off, so bootloader needs a physical address.
- sethi.p %hi(__page_offset),gr13
- setlo %lo(__page_offset),gr13
- sub gr14,gr13,gr14
-#endif
- not gr14,gr13
-
- #----------------------------------------------------
- # preload and lock into icache that code which may have to run
- # when dram is in self-refresh state.
- #----------------------------------------------------
- movsg hsr0, gr3
- li HSR0_ICE,gr4
- or gr3,gr4,gr3
- movgs gr3,hsr0
- or gr3,gr8,gr7 // add the sleep bits for later
-
- li #__icache_lock_start,gr3
- li #__icache_lock_end,gr4
-1: icpl gr3,gr0,#1
- addi gr3,#L1_CACHE_BYTES,gr3
- cmp gr4,gr3,icc0
- bhi icc0,#0,1b
-
- # disable exceptions
- movsg psr,gr8
- andi.p gr8,#~PSR_PIL,gr8
- andi gr8,~PSR_ET,gr8
- movgs gr8,psr
- ori gr8,#PSR_ET,gr8
-
- srli gr8,#28,gr4
- subicc gr4,#3,gr0,icc0
- beq icc0,#0,1f
- # FR4xx
- li __addr_FR4XX_DRCN,gr4
- li FR4XX_SDRAMC_DSTS_SSI,gr5
- li FR4XX_DSTS_OFFSET,gr6
- bra __icache_lock_start
-1:
- # FR5xx
- li __addr_FR55X_DRCN,gr4
- li FR55X_SDRAMC_DSTS_SSI,gr5
- li FR55X_DSTS_OFFSET,gr6
- bra __icache_lock_start
-
- .size frv_cpu_suspend, .-frv_cpu_suspend
-
-#
-# the final part of the sleep sequence...
-# - we want it to be be cacheline aligned so we can lock it into the icache easily
-# On entry: gr7 holds desired hsr0 sleep value
-# gr8 holds desired psr sleep value
-#
- .balign L1_CACHE_BYTES
- .type __icache_lock_start,@function
-__icache_lock_start:
-
- #----------------------------------------------------
- # put SDRAM in self-refresh mode
- #----------------------------------------------------
-
- # Flush all data in the cache using the DCEF instruction.
- dcef @(gr0,gr0),#1
-
- # Stop DMAC transfer
-
- # Execute dummy load from SDRAM
- ldi @(gr11,#0),gr11
-
- # put the SDRAM into self-refresh mode
- ld @(gr4,gr0),gr11
- ori gr11,#SDRAMC_DRCN_SR,gr11
- st gr11,@(gr4,gr0)
- membar
-
- # wait for SDRAM to reach self-refresh mode
-1: ld @(gr4,gr6),gr11
- andcc gr11,gr5,gr11,icc0
- beq icc0,#0,1b
-
- # Set the GPIO register so that the IRQ[3:0] pins become valid, as required.
- # Set the clock mode (CLKC register) as required.
- # - At this time, also set the CLKC register P0 bit.
-
- # Set the HSR0 register PDM field.
- movgs gr7,hsr0
-
- # Execute NOP 32 times.
- .rept 32
- nop
- .endr
-
-#if 0 // Fujitsu recommend to skip this and will update docs.
- # Release the interrupt mask setting of the MASK register of the
- # interrupt controller if necessary.
- sti gr10,@(gr9,#0)
- membar
-#endif
-
- # Set the PSR register ET bit to 1 to enable interrupts.
- movgs gr8,psr
-
- ###################################################
- # this is only reached if waking up via interrupt
- ###################################################
-
- # Execute NOP 32 times.
- .rept 32
- nop
- .endr
-
- #----------------------------------------------------
- # wake SDRAM from self-refresh mode
- #----------------------------------------------------
- ld @(gr4,gr0),gr11
- andi gr11,#~SDRAMC_DRCN_SR,gr11
- st gr11,@(gr4,gr0)
- membar
-2:
- ld @(gr4,gr6),gr11 // Wait for it to come back...
- andcc gr11,gr5,gr0,icc0
- bne icc0,0,2b
-
- # wait for the SDRAM to stabilise
- li 0x0100000,gr3
-3: subicc gr3,#1,gr3,icc0
- bne icc0,#0,3b
-
- # now that DRAM is back, this is the end of the code which gets
- # locked in icache.
-__icache_lock_end:
- .size __icache_lock_start, .-__icache_lock_start
-
- # Fall-through to the RAMBOOT# wakeup path
-
-###############################################################################
-#
-# resume from suspend re-entry point reached via RAMBOOT# and bootloader
-#
-###############################################################################
-__ramboot_resume:
-
- #----------------------------------------------------
- # restore hsr0, psr, isr, and leave saved lr in gr7
- #----------------------------------------------------
- li __sleep_save_area,gr11
-#ifdef CONFIG_MMU
- movsg hsr0,gr4
- sethi.p %hi(HSR0_EXMMU),gr3
- setlo %lo(HSR0_EXMMU),gr3
- andcc gr3,gr4,gr0,icc0
- bne icc0,#0,2f
-
- # need to use physical address
- sethi.p %hi(__page_offset),gr3
- setlo %lo(__page_offset),gr3
- sub gr11,gr3,gr11
-
- # flush all tlb entries
- setlos #64,gr4
- setlos.p #PAGE_SIZE,gr5
- setlos #0,gr6
-1:
- tlbpr gr6,gr0,#6,#0
- subicc.p gr4,#1,gr4,icc0
- add gr6,gr5,gr6
- bne icc0,#2,1b
-
- # need a temporary mapping for the current physical address we are
- # using between time MMU is enabled and jump to virtual address is
- # made.
- sethi.p %hi(0x00000000),gr4
- setlo %lo(0x00000000),gr4 ; physical address
- setlos #xAMPRx_L|xAMPRx_M|xAMPRx_SS_256Mb|xAMPRx_S_KERNEL|xAMPRx_V,gr5
- or gr4,gr5,gr5
-
- movsg cxnr,gr13
- or gr4,gr13,gr4
-
- movgs gr4,iamlr1 ; mapped from real address 0
- movgs gr5,iampr1 ; cached kernel memory at 0x00000000
-2:
-#endif
-
- lddi @(gr11,#0),gr4 ; hsr0, psr
- lddi @(gr11,#8),gr6 ; isr, lr
- movgs gr4,hsr0
- bar
-
-#ifdef CONFIG_MMU
- sethi.p %hi(1f),gr11
- setlo %lo(1f),gr11
- jmpl @(gr11,gr0)
-1:
- movgs gr0,iampr1 ; get rid of temporary mapping
-#endif
- movgs gr5,psr
- movgs gr6,isr
-
- #----------------------------------------------------
- # unlock the icache which was locked before going to sleep
- #----------------------------------------------------
- li __icache_lock_start,gr3
- li __icache_lock_end,gr4
-1: icul gr3
- addi gr3,#L1_CACHE_BYTES,gr3
- cmp gr4,gr3,icc0
- bhi icc0,#0,1b
-
- #----------------------------------------------------
- # back to business as usual
- #----------------------------------------------------
- jmpl @(gr7,gr0) ;
-
-#endif /* CONFIG_PM */
-
-###############################################################################
-#
-# CPU core sleep mode routine
-#
-###############################################################################
- .globl frv_cpu_core_sleep
- .type frv_cpu_core_sleep,@function
-frv_cpu_core_sleep:
-
- # Preload into icache.
- li #__core_sleep_icache_lock_start,gr3
- li #__core_sleep_icache_lock_end,gr4
-
-1: icpl gr3,gr0,#1
- addi gr3,#L1_CACHE_BYTES,gr3
- cmp gr4,gr3,icc0
- bhi icc0,#0,1b
-
- bra __core_sleep_icache_lock_start
-
- .balign L1_CACHE_BYTES
-__core_sleep_icache_lock_start:
-
- # (1) Set the PSR register ET bit to 0 to disable interrupts.
- movsg psr,gr8
- andi.p gr8,#~(PSR_PIL),gr8
- andi gr8,#~(PSR_ET),gr4
- movgs gr4,psr
-
-#if 0 // Fujitsu recommend to skip this and will update docs.
- # (2) Set '1' to all bits in the MASK register of the interrupt
- # controller and mask interrupts.
- sethi.p %hi(__addr_MASK),gr9
- setlo %lo(__addr_MASK),gr9
- sethi.p %hi(0xffff0000),gr4
- setlo %lo(0xffff0000),gr4
- ldi @(gr9,#0),gr10
- sti gr4,@(gr9,#0)
-#endif
- # (3) Flush all data in the cache using the DCEF instruction.
- dcef @(gr0,gr0),#1
-
- # (4) Execute the memory barrier instruction
- membar
-
- # (5) Set the GPIO register so that the IRQ[3:0] pins become valid, as required.
- # (6) Set the clock mode (CLKC register) as required.
- # - At this time, also set the CLKC register P0 bit.
- # (7) Set the HSR0 register PDM field to 001 .
- movsg hsr0,gr4
- ori gr4,HSR0_PDM_CORE_SLEEP,gr4
- movgs gr4,hsr0
-
- # (8) Execute NOP 32 times.
- .rept 32
- nop
- .endr
-
-#if 0 // Fujitsu recommend to skip this and will update docs.
- # (9) Release the interrupt mask setting of the MASK register of the
- # interrupt controller if necessary.
- sti gr10,@(gr9,#0)
- membar
-#endif
-
- # (10) Set the PSR register ET bit to 1 to enable interrupts.
- movgs gr8,psr
-
-__core_sleep_icache_lock_end:
-
- # Unlock from icache
- li __core_sleep_icache_lock_start,gr3
- li __core_sleep_icache_lock_end,gr4
-1: icul gr3
- addi gr3,#L1_CACHE_BYTES,gr3
- cmp gr4,gr3,icc0
- bhi icc0,#0,1b
-
- bralr
-
- .size frv_cpu_core_sleep, .-frv_cpu_core_sleep
diff --git a/arch/frv/kernel/switch_to.S b/arch/frv/kernel/switch_to.S
deleted file mode 100644
index b06668670fcc..000000000000
--- a/arch/frv/kernel/switch_to.S
+++ /dev/null
@@ -1,489 +0,0 @@
-###############################################################################
-#
-# switch_to.S: context switch operation
-#
-# Copyright (C) 2003 Red Hat, Inc. All Rights Reserved.
-# Written by David Howells (dhowells@redhat.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.
-#
-###############################################################################
-
-#include <linux/linkage.h>
-#include <asm/thread_info.h>
-#include <asm/processor.h>
-#include <asm/registers.h>
-#include <asm/spr-regs.h>
-
-.macro LEDS val
- setlos #~\val,gr27
- st gr27,@(gr30,gr0)
- membar
- dcf @(gr30,gr0)
-.endm
-
- .section .sdata
- .balign 8
-
- # address of frame 0 (userspace) on current kernel stack
- .globl __kernel_frame0_ptr
-__kernel_frame0_ptr:
- .long init_thread_union + THREAD_SIZE - FRV_FRAME0_SIZE
-
- # address of current task
- .globl __kernel_current_task
-__kernel_current_task:
- .long init_task
-
- .section .text
- .balign 4
-
-###############################################################################
-#
-# struct task_struct *__switch_to(struct thread_struct *prev_thread,
-# struct thread_struct *next_thread,
-# struct task_struct *prev)
-#
-###############################################################################
- .globl __switch_to
-__switch_to:
- # save outgoing process's context
- sethi.p %hi(__switch_back),gr13
- setlo %lo(__switch_back),gr13
- movsg lr,gr12
-
- stdi gr28,@(gr8,#__THREAD_FRAME)
- sti sp ,@(gr8,#__THREAD_SP)
- sti fp ,@(gr8,#__THREAD_FP)
- stdi gr12,@(gr8,#__THREAD_LR)
- stdi gr16,@(gr8,#__THREAD_GR(16))
- stdi gr18,@(gr8,#__THREAD_GR(18))
- stdi gr20,@(gr8,#__THREAD_GR(20))
- stdi gr22,@(gr8,#__THREAD_GR(22))
- stdi gr24,@(gr8,#__THREAD_GR(24))
- stdi.p gr26,@(gr8,#__THREAD_GR(26))
-
- or gr8,gr8,gr22
- ldi.p @(gr8,#__THREAD_USER),gr8
- call save_user_regs
- or gr22,gr22,gr8
-
- # retrieve the new context
- sethi.p %hi(__kernel_frame0_ptr),gr6
- setlo %lo(__kernel_frame0_ptr),gr6
- movsg psr,gr4
-
- lddi.p @(gr9,#__THREAD_FRAME),gr10
- or gr10,gr10,gr27 ; save prev for the return value
-
- ldi @(gr11,#4),gr19 ; get new_current->thread_info
-
- lddi @(gr9,#__THREAD_SP),gr12
- ldi @(gr9,#__THREAD_LR),gr14
- ldi @(gr9,#__THREAD_PC),gr18
- ldi.p @(gr9,#__THREAD_FRAME0),gr7
-
- # actually switch kernel contexts with ordinary exceptions disabled
- andi gr4,#~PSR_ET,gr5
- movgs gr5,psr
-
- or.p gr10,gr0,gr28 ; set __frame
- or gr11,gr0,gr29 ; set __current
- or.p gr12,gr0,sp
- or gr13,gr0,fp
- or gr19,gr0,gr15 ; set __current_thread_info
-
- sti gr7,@(gr6,#0) ; set __kernel_frame0_ptr
- sti gr29,@(gr6,#4) ; set __kernel_current_task
-
- movgs gr14,lr
- bar
-
- # jump to __switch_back or ret_from_fork as appropriate
- # - move prev to GR8
- movgs gr4,psr
- jmpl.p @(gr18,gr0)
- or gr27,gr27,gr8
-
-###############################################################################
-#
-# restore incoming process's context
-# - on entry:
-# - SP, FP, LR, GR15, GR28 and GR29 will have been set up appropriately
-# - GR8 will point to the outgoing task_struct
-# - GR9 will point to the incoming thread_struct
-#
-###############################################################################
-__switch_back:
- lddi @(gr9,#__THREAD_GR(16)),gr16
- lddi @(gr9,#__THREAD_GR(18)),gr18
- lddi @(gr9,#__THREAD_GR(20)),gr20
- lddi @(gr9,#__THREAD_GR(22)),gr22
- lddi @(gr9,#__THREAD_GR(24)),gr24
- lddi @(gr9,#__THREAD_GR(26)),gr26
-
- # fall through into restore_user_regs()
- ldi.p @(gr9,#__THREAD_USER),gr8
- or gr8,gr8,gr9
-
-###############################################################################
-#
-# restore extra general regs and FP/Media regs
-# - void *restore_user_regs(const struct user_context *target, void *retval)
-# - on entry:
-# - GR8 will point to the user context to swap in
-# - GR9 will contain the value to be returned in GR8 (prev task on context switch)
-#
-###############################################################################
- .globl restore_user_regs
-restore_user_regs:
- movsg hsr0,gr6
- ori gr6,#HSR0_GRHE|HSR0_FRLE|HSR0_FRHE,gr6
- movgs gr6,hsr0
- movsg hsr0,gr6
-
- movsg psr,gr7
- ori gr7,#PSR_EF|PSR_EM,gr7
- movgs gr7,psr
- movsg psr,gr7
- srli gr7,#24,gr7
- bar
-
- lddi @(gr8,#__FPMEDIA_MSR(0)),gr4
-
- movgs gr4,msr0
- movgs gr5,msr1
-
- lddfi @(gr8,#__FPMEDIA_ACC(0)),fr16
- lddfi @(gr8,#__FPMEDIA_ACC(2)),fr18
- ldbfi @(gr8,#__FPMEDIA_ACCG(0)),fr20
- ldbfi @(gr8,#__FPMEDIA_ACCG(1)),fr21
- ldbfi @(gr8,#__FPMEDIA_ACCG(2)),fr22
- ldbfi @(gr8,#__FPMEDIA_ACCG(3)),fr23
-
- mwtacc fr16,acc0
- mwtacc fr17,acc1
- mwtacc fr18,acc2
- mwtacc fr19,acc3
- mwtaccg fr20,accg0
- mwtaccg fr21,accg1
- mwtaccg fr22,accg2
- mwtaccg fr23,accg3
-
- # some CPUs have extra ACCx and ACCGx regs and maybe FSRx regs
- subicc.p gr7,#0x50,gr0,icc0
- subicc gr7,#0x31,gr0,icc1
- beq icc0,#0,__restore_acc_fr451
- beq icc1,#0,__restore_acc_fr555
-__restore_acc_cont:
-
- # some CPU's have GR32-GR63
- setlos #HSR0_FRHE,gr4
- andcc gr6,gr4,gr0,icc0
- beq icc0,#1,__restore_skip_gr32_gr63
-
- lddi @(gr8,#__INT_GR(32)),gr32
- lddi @(gr8,#__INT_GR(34)),gr34
- lddi @(gr8,#__INT_GR(36)),gr36
- lddi @(gr8,#__INT_GR(38)),gr38
- lddi @(gr8,#__INT_GR(40)),gr40
- lddi @(gr8,#__INT_GR(42)),gr42
- lddi @(gr8,#__INT_GR(44)),gr44
- lddi @(gr8,#__INT_GR(46)),gr46
- lddi @(gr8,#__INT_GR(48)),gr48
- lddi @(gr8,#__INT_GR(50)),gr50
- lddi @(gr8,#__INT_GR(52)),gr52
- lddi @(gr8,#__INT_GR(54)),gr54
- lddi @(gr8,#__INT_GR(56)),gr56
- lddi @(gr8,#__INT_GR(58)),gr58
- lddi @(gr8,#__INT_GR(60)),gr60
- lddi @(gr8,#__INT_GR(62)),gr62
-__restore_skip_gr32_gr63:
-
- # all CPU's have FR0-FR31
- lddfi @(gr8,#__FPMEDIA_FR( 0)),fr0
- lddfi @(gr8,#__FPMEDIA_FR( 2)),fr2
- lddfi @(gr8,#__FPMEDIA_FR( 4)),fr4
- lddfi @(gr8,#__FPMEDIA_FR( 6)),fr6
- lddfi @(gr8,#__FPMEDIA_FR( 8)),fr8
- lddfi @(gr8,#__FPMEDIA_FR(10)),fr10
- lddfi @(gr8,#__FPMEDIA_FR(12)),fr12
- lddfi @(gr8,#__FPMEDIA_FR(14)),fr14
- lddfi @(gr8,#__FPMEDIA_FR(16)),fr16
- lddfi @(gr8,#__FPMEDIA_FR(18)),fr18
- lddfi @(gr8,#__FPMEDIA_FR(20)),fr20
- lddfi @(gr8,#__FPMEDIA_FR(22)),fr22
- lddfi @(gr8,#__FPMEDIA_FR(24)),fr24
- lddfi @(gr8,#__FPMEDIA_FR(26)),fr26
- lddfi @(gr8,#__FPMEDIA_FR(28)),fr28
- lddfi.p @(gr8,#__FPMEDIA_FR(30)),fr30
-
- # some CPU's have FR32-FR63
- setlos #HSR0_FRHE,gr4
- andcc gr6,gr4,gr0,icc0
- beq icc0,#1,__restore_skip_fr32_fr63
-
- lddfi @(gr8,#__FPMEDIA_FR(32)),fr32
- lddfi @(gr8,#__FPMEDIA_FR(34)),fr34
- lddfi @(gr8,#__FPMEDIA_FR(36)),fr36
- lddfi @(gr8,#__FPMEDIA_FR(38)),fr38
- lddfi @(gr8,#__FPMEDIA_FR(40)),fr40
- lddfi @(gr8,#__FPMEDIA_FR(42)),fr42
- lddfi @(gr8,#__FPMEDIA_FR(44)),fr44
- lddfi @(gr8,#__FPMEDIA_FR(46)),fr46
- lddfi @(gr8,#__FPMEDIA_FR(48)),fr48
- lddfi @(gr8,#__FPMEDIA_FR(50)),fr50
- lddfi @(gr8,#__FPMEDIA_FR(52)),fr52
- lddfi @(gr8,#__FPMEDIA_FR(54)),fr54
- lddfi @(gr8,#__FPMEDIA_FR(56)),fr56
- lddfi @(gr8,#__FPMEDIA_FR(58)),fr58
- lddfi @(gr8,#__FPMEDIA_FR(60)),fr60
- lddfi @(gr8,#__FPMEDIA_FR(62)),fr62
-__restore_skip_fr32_fr63:
-
- lddi @(gr8,#__FPMEDIA_FNER(0)),gr4
- movsg fner0,gr4
- movsg fner1,gr5
- or.p gr9,gr9,gr8
- bralr
-
- # the FR451 also has ACC8-11/ACCG8-11 regs (but not 4-7...)
-__restore_acc_fr451:
- lddfi @(gr8,#__FPMEDIA_ACC(4)),fr16
- lddfi @(gr8,#__FPMEDIA_ACC(6)),fr18
- ldbfi @(gr8,#__FPMEDIA_ACCG(4)),fr20
- ldbfi @(gr8,#__FPMEDIA_ACCG(5)),fr21
- ldbfi @(gr8,#__FPMEDIA_ACCG(6)),fr22
- ldbfi @(gr8,#__FPMEDIA_ACCG(7)),fr23
-
- mwtacc fr16,acc8
- mwtacc fr17,acc9
- mwtacc fr18,acc10
- mwtacc fr19,acc11
- mwtaccg fr20,accg8
- mwtaccg fr21,accg9
- mwtaccg fr22,accg10
- mwtaccg fr23,accg11
- bra __restore_acc_cont
-
- # the FR555 also has ACC4-7/ACCG4-7 regs and an FSR0 reg
-__restore_acc_fr555:
- lddfi @(gr8,#__FPMEDIA_ACC(4)),fr16
- lddfi @(gr8,#__FPMEDIA_ACC(6)),fr18
- ldbfi @(gr8,#__FPMEDIA_ACCG(4)),fr20
- ldbfi @(gr8,#__FPMEDIA_ACCG(5)),fr21
- ldbfi @(gr8,#__FPMEDIA_ACCG(6)),fr22
- ldbfi @(gr8,#__FPMEDIA_ACCG(7)),fr23
-
- mnop.p
- mwtacc fr16,acc4
- mnop.p
- mwtacc fr17,acc5
- mnop.p
- mwtacc fr18,acc6
- mnop.p
- mwtacc fr19,acc7
- mnop.p
- mwtaccg fr20,accg4
- mnop.p
- mwtaccg fr21,accg5
- mnop.p
- mwtaccg fr22,accg6
- mnop.p
- mwtaccg fr23,accg7
-
- ldi @(gr8,#__FPMEDIA_FSR(0)),gr4
- movgs gr4,fsr0
-
- bra __restore_acc_cont
-
-
-###############################################################################
-#
-# save extra general regs and FP/Media regs
-# - void save_user_regs(struct user_context *target)
-#
-###############################################################################
- .globl save_user_regs
-save_user_regs:
- movsg hsr0,gr6
- ori gr6,#HSR0_GRHE|HSR0_FRLE|HSR0_FRHE,gr6
- movgs gr6,hsr0
- movsg hsr0,gr6
-
- movsg psr,gr7
- ori gr7,#PSR_EF|PSR_EM,gr7
- movgs gr7,psr
- movsg psr,gr7
- srli gr7,#24,gr7
- bar
-
- movsg fner0,gr4
- movsg fner1,gr5
- stdi.p gr4,@(gr8,#__FPMEDIA_FNER(0))
-
- # some CPU's have GR32-GR63
- setlos #HSR0_GRHE,gr4
- andcc gr6,gr4,gr0,icc0
- beq icc0,#1,__save_skip_gr32_gr63
-
- stdi gr32,@(gr8,#__INT_GR(32))
- stdi gr34,@(gr8,#__INT_GR(34))
- stdi gr36,@(gr8,#__INT_GR(36))
- stdi gr38,@(gr8,#__INT_GR(38))
- stdi gr40,@(gr8,#__INT_GR(40))
- stdi gr42,@(gr8,#__INT_GR(42))
- stdi gr44,@(gr8,#__INT_GR(44))
- stdi gr46,@(gr8,#__INT_GR(46))
- stdi gr48,@(gr8,#__INT_GR(48))
- stdi gr50,@(gr8,#__INT_GR(50))
- stdi gr52,@(gr8,#__INT_GR(52))
- stdi gr54,@(gr8,#__INT_GR(54))
- stdi gr56,@(gr8,#__INT_GR(56))
- stdi gr58,@(gr8,#__INT_GR(58))
- stdi gr60,@(gr8,#__INT_GR(60))
- stdi gr62,@(gr8,#__INT_GR(62))
-__save_skip_gr32_gr63:
-
- # all CPU's have FR0-FR31
- stdfi fr0 ,@(gr8,#__FPMEDIA_FR( 0))
- stdfi fr2 ,@(gr8,#__FPMEDIA_FR( 2))
- stdfi fr4 ,@(gr8,#__FPMEDIA_FR( 4))
- stdfi fr6 ,@(gr8,#__FPMEDIA_FR( 6))
- stdfi fr8 ,@(gr8,#__FPMEDIA_FR( 8))
- stdfi fr10,@(gr8,#__FPMEDIA_FR(10))
- stdfi fr12,@(gr8,#__FPMEDIA_FR(12))
- stdfi fr14,@(gr8,#__FPMEDIA_FR(14))
- stdfi fr16,@(gr8,#__FPMEDIA_FR(16))
- stdfi fr18,@(gr8,#__FPMEDIA_FR(18))
- stdfi fr20,@(gr8,#__FPMEDIA_FR(20))
- stdfi fr22,@(gr8,#__FPMEDIA_FR(22))
- stdfi fr24,@(gr8,#__FPMEDIA_FR(24))
- stdfi fr26,@(gr8,#__FPMEDIA_FR(26))
- stdfi fr28,@(gr8,#__FPMEDIA_FR(28))
- stdfi.p fr30,@(gr8,#__FPMEDIA_FR(30))
-
- # some CPU's have FR32-FR63
- setlos #HSR0_FRHE,gr4
- andcc gr6,gr4,gr0,icc0
- beq icc0,#1,__save_skip_fr32_fr63
-
- stdfi fr32,@(gr8,#__FPMEDIA_FR(32))
- stdfi fr34,@(gr8,#__FPMEDIA_FR(34))
- stdfi fr36,@(gr8,#__FPMEDIA_FR(36))
- stdfi fr38,@(gr8,#__FPMEDIA_FR(38))
- stdfi fr40,@(gr8,#__FPMEDIA_FR(40))
- stdfi fr42,@(gr8,#__FPMEDIA_FR(42))
- stdfi fr44,@(gr8,#__FPMEDIA_FR(44))
- stdfi fr46,@(gr8,#__FPMEDIA_FR(46))
- stdfi fr48,@(gr8,#__FPMEDIA_FR(48))
- stdfi fr50,@(gr8,#__FPMEDIA_FR(50))
- stdfi fr52,@(gr8,#__FPMEDIA_FR(52))
- stdfi fr54,@(gr8,#__FPMEDIA_FR(54))
- stdfi fr56,@(gr8,#__FPMEDIA_FR(56))
- stdfi fr58,@(gr8,#__FPMEDIA_FR(58))
- stdfi fr60,@(gr8,#__FPMEDIA_FR(60))
- stdfi fr62,@(gr8,#__FPMEDIA_FR(62))
-__save_skip_fr32_fr63:
-
- mrdacc acc0 ,fr4
- mrdacc acc1 ,fr5
-
- stdfi.p fr4 ,@(gr8,#__FPMEDIA_ACC(0))
-
- mrdacc acc2 ,fr6
- mrdacc acc3 ,fr7
-
- stdfi.p fr6 ,@(gr8,#__FPMEDIA_ACC(2))
-
- mrdaccg accg0,fr4
- stbfi.p fr4 ,@(gr8,#__FPMEDIA_ACCG(0))
-
- mrdaccg accg1,fr5
- stbfi.p fr5 ,@(gr8,#__FPMEDIA_ACCG(1))
-
- mrdaccg accg2,fr6
- stbfi.p fr6 ,@(gr8,#__FPMEDIA_ACCG(2))
-
- mrdaccg accg3,fr7
- stbfi fr7 ,@(gr8,#__FPMEDIA_ACCG(3))
-
- movsg msr0 ,gr4
- movsg msr1 ,gr5
-
- stdi gr4 ,@(gr8,#__FPMEDIA_MSR(0))
-
- # some CPUs have extra ACCx and ACCGx regs and maybe FSRx regs
- subicc.p gr7,#0x50,gr0,icc0
- subicc gr7,#0x31,gr0,icc1
- beq icc0,#0,__save_acc_fr451
- beq icc1,#0,__save_acc_fr555
-__save_acc_cont:
-
- lddfi @(gr8,#__FPMEDIA_FR(4)),fr4
- lddfi.p @(gr8,#__FPMEDIA_FR(6)),fr6
- bralr
-
- # the FR451 also has ACC8-11/ACCG8-11 regs (but not 4-7...)
-__save_acc_fr451:
- mrdacc acc8 ,fr4
- mrdacc acc9 ,fr5
-
- stdfi.p fr4 ,@(gr8,#__FPMEDIA_ACC(4))
-
- mrdacc acc10,fr6
- mrdacc acc11,fr7
-
- stdfi.p fr6 ,@(gr8,#__FPMEDIA_ACC(6))
-
- mrdaccg accg8,fr4
- stbfi.p fr4 ,@(gr8,#__FPMEDIA_ACCG(4))
-
- mrdaccg accg9,fr5
- stbfi.p fr5 ,@(gr8,#__FPMEDIA_ACCG(5))
-
- mrdaccg accg10,fr6
- stbfi.p fr6 ,@(gr8,#__FPMEDIA_ACCG(6))
-
- mrdaccg accg11,fr7
- stbfi fr7 ,@(gr8,#__FPMEDIA_ACCG(7))
- bra __save_acc_cont
-
- # the FR555 also has ACC4-7/ACCG4-7 regs and an FSR0 reg
-__save_acc_fr555:
- mnop.p
- mrdacc acc4 ,fr4
- mnop.p
- mrdacc acc5 ,fr5
-
- stdfi fr4 ,@(gr8,#__FPMEDIA_ACC(4))
-
- mnop.p
- mrdacc acc6 ,fr6
- mnop.p
- mrdacc acc7 ,fr7
-
- stdfi fr6 ,@(gr8,#__FPMEDIA_ACC(6))
-
- mnop.p
- mrdaccg accg4,fr4
- stbfi fr4 ,@(gr8,#__FPMEDIA_ACCG(4))
-
- mnop.p
- mrdaccg accg5,fr5
- stbfi fr5 ,@(gr8,#__FPMEDIA_ACCG(5))
-
- mnop.p
- mrdaccg accg6,fr6
- stbfi fr6 ,@(gr8,#__FPMEDIA_ACCG(6))
-
- mnop.p
- mrdaccg accg7,fr7
- stbfi fr7 ,@(gr8,#__FPMEDIA_ACCG(7))
-
- movsg fsr0 ,gr4
- sti gr4 ,@(gr8,#__FPMEDIA_FSR(0))
- bra __save_acc_cont
diff --git a/arch/frv/kernel/sys_frv.c b/arch/frv/kernel/sys_frv.c
deleted file mode 100644
index f80cc8b9bd45..000000000000
--- a/arch/frv/kernel/sys_frv.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/* sys_frv.c: FRV arch-specific syscall wrappers
- *
- * Copyright (C) 2003-5 Red Hat, Inc. All Rights Reserved.
- * Written by David Howells (dhowells@redhat.com)
- * - Derived from arch/m68k/kernel/sys_m68k.c
- *
- * 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.
- */
-
-#include <linux/errno.h>
-#include <linux/sched.h>
-#include <linux/mm.h>
-#include <linux/fs.h>
-#include <linux/smp.h>
-#include <linux/sem.h>
-#include <linux/msg.h>
-#include <linux/shm.h>
-#include <linux/stat.h>
-#include <linux/mman.h>
-#include <linux/file.h>
-#include <linux/syscalls.h>
-#include <linux/ipc.h>
-
-#include <asm/setup.h>
-#include <linux/uaccess.h>
-
-asmlinkage long sys_mmap2(unsigned long addr, unsigned long len,
- unsigned long prot, unsigned long flags,
- unsigned long fd, unsigned long pgoff)
-{
- /* As with sparc32, make sure the shift for mmap2 is constant
- (12), no matter what PAGE_SIZE we have.... */
-
- /* But unlike sparc32, don't just silently break if we're
- trying to map something we can't */
- if (pgoff & ((1 << (PAGE_SHIFT - 12)) - 1))
- return -EINVAL;
-
- return sys_mmap_pgoff(addr, len, prot, flags, fd,
- pgoff >> (PAGE_SHIFT - 12));
-}
diff --git a/arch/frv/kernel/sysctl.c b/arch/frv/kernel/sysctl.c
deleted file mode 100644
index b54a64971cf1..000000000000
--- a/arch/frv/kernel/sysctl.c
+++ /dev/null
@@ -1,221 +0,0 @@
-/* sysctl.c: implementation of /proc/sys files relating to FRV specifically
- *
- * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
- * Written by David Howells (dhowells@redhat.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.
- */
-
-#include <linux/sysctl.h>
-#include <linux/proc_fs.h>
-#include <linux/init.h>
-#include <linux/uaccess.h>
-
-static const char frv_cache_wback[] = "wback";
-static const char frv_cache_wthru[] = "wthru";
-
-static void frv_change_dcache_mode(unsigned long newmode)
-{
- unsigned long flags, hsr0;
-
- local_irq_save(flags);
-
- hsr0 = __get_HSR(0);
- hsr0 &= ~HSR0_DCE;
- __set_HSR(0, hsr0);
-
- asm volatile(" dcef @(gr0,gr0),#1 \n"
- " membar \n"
- : : : "memory"
- );
-
- hsr0 = (hsr0 & ~HSR0_CBM) | newmode;
- __set_HSR(0, hsr0);
- hsr0 |= HSR0_DCE;
- __set_HSR(0, hsr0);
-
- local_irq_restore(flags);
-
- //printk("HSR0 now %08lx\n", hsr0);
-}
-
-/*****************************************************************************/
-/*
- * handle requests to dynamically switch the write caching mode delivered by /proc
- */
-static int procctl_frv_cachemode(struct ctl_table *table, int write,
- void __user *buffer, size_t *lenp,
- loff_t *ppos)
-{
- unsigned long hsr0;
- char buff[8];
- int len;
-
- len = *lenp;
-
- if (write) {
- /* potential state change */
- if (len <= 1 || len > sizeof(buff) - 1)
- return -EINVAL;
-
- if (copy_from_user(buff, buffer, len) != 0)
- return -EFAULT;
-
- if (buff[len - 1] == '\n')
- buff[len - 1] = '\0';
- else
- buff[len] = '\0';
-
- if (strcmp(buff, frv_cache_wback) == 0) {
- /* switch dcache into write-back mode */
- frv_change_dcache_mode(HSR0_CBM_COPY_BACK);
- return 0;
- }
-
- if (strcmp(buff, frv_cache_wthru) == 0) {
- /* switch dcache into write-through mode */
- frv_change_dcache_mode(HSR0_CBM_WRITE_THRU);
- return 0;
- }
-
- return -EINVAL;
- }
-
- /* read the state */
- if (*ppos > 0) {
- *lenp = 0;
- return 0;
- }
-
- hsr0 = __get_HSR(0);
- switch (hsr0 & HSR0_CBM) {
- case HSR0_CBM_WRITE_THRU:
- memcpy(buff, frv_cache_wthru, sizeof(frv_cache_wthru) - 1);
- buff[sizeof(frv_cache_wthru) - 1] = '\n';
- len = sizeof(frv_cache_wthru);
- break;
- default:
- memcpy(buff, frv_cache_wback, sizeof(frv_cache_wback) - 1);
- buff[sizeof(frv_cache_wback) - 1] = '\n';
- len = sizeof(frv_cache_wback);
- break;
- }
-
- if (len > *lenp)
- len = *lenp;
-
- if (copy_to_user(buffer, buff, len) != 0)
- return -EFAULT;
-
- *lenp = len;
- *ppos = len;
- return 0;
-
-} /* end procctl_frv_cachemode() */
-
-/*****************************************************************************/
-/*
- * permit the mm_struct the nominated process is using have its MMU context ID pinned
- */
-#ifdef CONFIG_MMU
-static int procctl_frv_pin_cxnr(struct ctl_table *table, int write,
- void __user *buffer, size_t *lenp,
- loff_t *ppos)
-{
- pid_t pid;
- char buff[16], *p;
- int len;
-
- len = *lenp;
-
- if (write) {
- /* potential state change */
- if (len <= 1 || len > sizeof(buff) - 1)
- return -EINVAL;
-
- if (copy_from_user(buff, buffer, len) != 0)
- return -EFAULT;
-
- if (buff[len - 1] == '\n')
- buff[len - 1] = '\0';
- else
- buff[len] = '\0';
-
- pid = simple_strtoul(buff, &p, 10);
- if (*p)
- return -EINVAL;
-
- return cxn_pin_by_pid(pid);
- }
-
- /* read the currently pinned CXN */
- if (*ppos > 0) {
- *lenp = 0;
- return 0;
- }
-
- len = snprintf(buff, sizeof(buff), "%d\n", cxn_pinned);
- if (len > *lenp)
- len = *lenp;
-
- if (copy_to_user(buffer, buff, len) != 0)
- return -EFAULT;
-
- *lenp = len;
- *ppos = len;
- return 0;
-
-} /* end procctl_frv_pin_cxnr() */
-#endif
-
-/*
- * FR-V specific sysctls
- */
-static struct ctl_table frv_table[] =
-{
- {
- .procname = "cache-mode",
- .data = NULL,
- .maxlen = 0,
- .mode = 0644,
- .proc_handler = procctl_frv_cachemode,
- },
-#ifdef CONFIG_MMU
- {
- .procname = "pin-cxnr",
- .data = NULL,
- .maxlen = 0,
- .mode = 0644,
- .proc_handler = procctl_frv_pin_cxnr
- },
-#endif
- {}
-};
-
-/*
- * Use a temporary sysctl number. Horrid, but will be cleaned up in 2.6
- * when all the PM interfaces exist nicely.
- */
-static struct ctl_table frv_dir_table[] =
-{
- {
- .procname = "frv",
- .mode = 0555,
- .child = frv_table
- },
- {}
-};
-
-/*
- * Initialize power interface
- */
-static int __init frv_sysctl_init(void)
-{
- register_sysctl_table(frv_dir_table);
- return 0;
-}
-
-__initcall(frv_sysctl_init);
diff --git a/arch/frv/kernel/time.c b/arch/frv/kernel/time.c
deleted file mode 100644
index 332e00bf9d06..000000000000
--- a/arch/frv/kernel/time.c
+++ /dev/null
@@ -1,122 +0,0 @@
-/* time.c: FRV arch-specific time handling
- *
- * Copyright (C) 2003-5 Red Hat, Inc. All Rights Reserved.
- * Written by David Howells (dhowells@redhat.com)
- * - Derived from arch/m68k/kernel/time.c
- *
- * 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.
- */
-
-#include <linux/module.h>
-#include <linux/errno.h>
-#include <linux/sched.h>
-#include <linux/kernel.h>
-#include <linux/param.h>
-#include <linux/string.h>
-#include <linux/interrupt.h>
-#include <linux/profile.h>
-#include <linux/irq.h>
-#include <linux/mm.h>
-
-#include <asm/io.h>
-#include <asm/timer-regs.h>
-#include <asm/mb-regs.h>
-#include <asm/mb86943a.h>
-
-#include <linux/timex.h>
-
-#define TICK_SIZE (tick_nsec / 1000)
-
-unsigned long __nongprelbss __clkin_clock_speed_HZ;
-unsigned long __nongprelbss __ext_bus_clock_speed_HZ;
-unsigned long __nongprelbss __res_bus_clock_speed_HZ;
-unsigned long __nongprelbss __sdram_clock_speed_HZ;
-unsigned long __nongprelbss __core_bus_clock_speed_HZ;
-unsigned long __nongprelbss __core_clock_speed_HZ;
-unsigned long __nongprelbss __dsu_clock_speed_HZ;
-unsigned long __nongprelbss __serial_clock_speed_HZ;
-unsigned long __delay_loops_MHz;
-
-static irqreturn_t timer_interrupt(int irq, void *dummy);
-
-static struct irqaction timer_irq = {
- .handler = timer_interrupt,
- .name = "timer",
-};
-
-/*
- * timer_interrupt() needs to keep up the real-time clock,
- * as well as call the "xtime_update()" routine every clocktick
- */
-static irqreturn_t timer_interrupt(int irq, void *dummy)
-{
- profile_tick(CPU_PROFILING);
-
- xtime_update(1);
-
-#ifdef CONFIG_HEARTBEAT
- static unsigned short n;
- n++;
- __set_LEDS(n);
-#endif /* CONFIG_HEARTBEAT */
-
- update_process_times(user_mode(get_irq_regs()));
-
- return IRQ_HANDLED;
-}
-
-void time_divisor_init(void)
-{
- unsigned short base, pre, prediv;
-
- /* set the scheduling timer going */
- pre = 1;
- prediv = 4;
- base = __res_bus_clock_speed_HZ / pre / HZ / (1 << prediv);
-
- __set_TPRV(pre);
- __set_TxCKSL_DATA(0, prediv);
- __set_TCTR(TCTR_SC_CTR0 | TCTR_RL_RW_LH8 | TCTR_MODE_2);
- __set_TCSR_DATA(0, base & 0xff);
- __set_TCSR_DATA(0, base >> 8);
-}
-
-
-void read_persistent_clock(struct timespec *ts)
-{
- unsigned int year, mon, day, hour, min, sec;
-
- extern void arch_gettod(int *year, int *mon, int *day, int *hour, int *min, int *sec);
-
- /* FIX by dqg : Set to zero for platforms that don't have tod */
- /* without this time is undefined and can overflow time_t, causing */
- /* very strange errors */
- year = 1980;
- mon = day = 1;
- hour = min = sec = 0;
- arch_gettod (&year, &mon, &day, &hour, &min, &sec);
-
- if ((year += 1900) < 1970)
- year += 100;
- ts->tv_sec = mktime(year, mon, day, hour, min, sec);
- ts->tv_nsec = 0;
-}
-
-void time_init(void)
-{
- /* install scheduling interrupt handler */
- setup_irq(IRQ_CPU_TIMER0, &timer_irq);
-
- time_divisor_init();
-}
-
-/*
- * Scheduler clock - returns current time in nanosec units.
- */
-unsigned long long sched_clock(void)
-{
- return jiffies_64 * (1000000000 / HZ);
-}
diff --git a/arch/frv/kernel/traps.c b/arch/frv/kernel/traps.c
deleted file mode 100644
index fb08ebe0dab4..000000000000
--- a/arch/frv/kernel/traps.c
+++ /dev/null
@@ -1,642 +0,0 @@
-/* traps.c: high-level exception handler for FR-V
- *
- * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved.
- * Written by David Howells (dhowells@redhat.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.
- */
-
-#include <linux/sched/signal.h>
-#include <linux/sched/debug.h>
-#include <linux/signal.h>
-#include <linux/kernel.h>
-#include <linux/mm.h>
-#include <linux/types.h>
-#include <linux/user.h>
-#include <linux/string.h>
-#include <linux/linkage.h>
-#include <linux/init.h>
-#include <linux/module.h>
-
-#include <asm/asm-offsets.h>
-#include <asm/setup.h>
-#include <asm/fpu.h>
-#include <linux/uaccess.h>
-#include <asm/pgtable.h>
-#include <asm/siginfo.h>
-#include <asm/unaligned.h>
-
-void show_backtrace(struct pt_regs *, unsigned long);
-
-extern asmlinkage void __break_hijack_kernel_event(void);
-
-/*****************************************************************************/
-/*
- * instruction access error
- */
-asmlinkage void insn_access_error(unsigned long esfr1, unsigned long epcr0, unsigned long esr0)
-{
- siginfo_t info;
-
- die_if_kernel("-- Insn Access Error --\n"
- "EPCR0 : %08lx\n"
- "ESR0 : %08lx\n",
- epcr0, esr0);
-
- info.si_signo = SIGSEGV;
- info.si_code = SEGV_ACCERR;
- info.si_errno = 0;
- info.si_addr = (void __user *) ((epcr0 & EPCR0_V) ? (epcr0 & EPCR0_PC) : __frame->pc);
-
- force_sig_info(info.si_signo, &info, current);
-} /* end insn_access_error() */
-
-/*****************************************************************************/
-/*
- * handler for:
- * - illegal instruction
- * - privileged instruction
- * - unsupported trap
- * - debug exceptions
- */
-asmlinkage void illegal_instruction(unsigned long esfr1, unsigned long epcr0, unsigned long esr0)
-{
- siginfo_t info;
-
- die_if_kernel("-- Illegal Instruction --\n"
- "EPCR0 : %08lx\n"
- "ESR0 : %08lx\n"
- "ESFR1 : %08lx\n",
- epcr0, esr0, esfr1);
-
- info.si_errno = 0;
- info.si_addr = (void __user *) ((epcr0 & EPCR0_V) ? (epcr0 & EPCR0_PC) : __frame->pc);
-
- switch (__frame->tbr & TBR_TT) {
- case TBR_TT_ILLEGAL_INSTR:
- info.si_signo = SIGILL;
- info.si_code = ILL_ILLOPC;
- break;
- case TBR_TT_PRIV_INSTR:
- info.si_signo = SIGILL;
- info.si_code = ILL_PRVOPC;
- break;
- case TBR_TT_TRAP2 ... TBR_TT_TRAP126:
- info.si_signo = SIGILL;
- info.si_code = ILL_ILLTRP;
- break;
- /* GDB uses "tira gr0, #1" as a breakpoint instruction. */
- case TBR_TT_TRAP1:
- case TBR_TT_BREAK:
- info.si_signo = SIGTRAP;
- info.si_code =
- (__frame->__status & REG__STATUS_STEPPED) ? TRAP_TRACE : TRAP_BRKPT;
- break;
- }
-
- force_sig_info(info.si_signo, &info, current);
-} /* end illegal_instruction() */
-
-/*****************************************************************************/
-/*
- * handle atomic operations with errors
- * - arguments in gr8, gr9, gr10
- * - original memory value placed in gr5
- * - replacement memory value placed in gr9
- */
-asmlinkage void atomic_operation(unsigned long esfr1, unsigned long epcr0,
- unsigned long esr0)
-{
- static DEFINE_SPINLOCK(atomic_op_lock);
- unsigned long x, y, z;
- unsigned long __user *p;
- mm_segment_t oldfs;
- siginfo_t info;
- int ret;
-
- y = 0;
- z = 0;
-
- oldfs = get_fs();
- if (!user_mode(__frame))
- set_fs(KERNEL_DS);
-
- switch (__frame->tbr & TBR_TT) {
- /* TIRA gr0,#120
- * u32 __atomic_user_cmpxchg32(u32 *ptr, u32 test, u32 new)
- */
- case TBR_TT_ATOMIC_CMPXCHG32:
- p = (unsigned long __user *) __frame->gr8;
- x = __frame->gr9;
- y = __frame->gr10;
-
- for (;;) {
- ret = get_user(z, p);
- if (ret < 0)
- goto error;
-
- if (z != x)
- goto done;
-
- spin_lock_irq(&atomic_op_lock);
-
- if (__get_user(z, p) == 0) {
- if (z != x)
- goto done2;
-
- if (__put_user(y, p) == 0)
- goto done2;
- goto error2;
- }
-
- spin_unlock_irq(&atomic_op_lock);
- }
-
- /* TIRA gr0,#121
- * u32 __atomic_kernel_xchg32(void *v, u32 new)
- */
- case TBR_TT_ATOMIC_XCHG32:
- p = (unsigned long __user *) __frame->gr8;
- y = __frame->gr9;
-
- for (;;) {
- ret = get_user(z, p);
- if (ret < 0)
- goto error;
-
- spin_lock_irq(&atomic_op_lock);
-
- if (__get_user(z, p) == 0) {
- if (__put_user(y, p) == 0)
- goto done2;
- goto error2;
- }
-
- spin_unlock_irq(&atomic_op_lock);
- }
-
- /* TIRA gr0,#122
- * ulong __atomic_kernel_XOR_return(ulong i, ulong *v)
- */
- case TBR_TT_ATOMIC_XOR:
- p = (unsigned long __user *) __frame->gr8;
- x = __frame->gr9;
-
- for (;;) {
- ret = get_user(z, p);
- if (ret < 0)
- goto error;
-
- spin_lock_irq(&atomic_op_lock);
-
- if (__get_user(z, p) == 0) {
- y = x ^ z;
- if (__put_user(y, p) == 0)
- goto done2;
- goto error2;
- }
-
- spin_unlock_irq(&atomic_op_lock);
- }
-
- /* TIRA gr0,#123
- * ulong __atomic_kernel_OR_return(ulong i, ulong *v)
- */
- case TBR_TT_ATOMIC_OR:
- p = (unsigned long __user *) __frame->gr8;
- x = __frame->gr9;
-
- for (;;) {
- ret = get_user(z, p);
- if (ret < 0)
- goto error;
-
- spin_lock_irq(&atomic_op_lock);
-
- if (__get_user(z, p) == 0) {
- y = x ^ z;
- if (__put_user(y, p) == 0)
- goto done2;
- goto error2;
- }
-
- spin_unlock_irq(&atomic_op_lock);
- }
-
- /* TIRA gr0,#124
- * ulong __atomic_kernel_AND_return(ulong i, ulong *v)
- */
- case TBR_TT_ATOMIC_AND:
- p = (unsigned long __user *) __frame->gr8;
- x = __frame->gr9;
-
- for (;;) {
- ret = get_user(z, p);
- if (ret < 0)
- goto error;
-
- spin_lock_irq(&atomic_op_lock);
-
- if (__get_user(z, p) == 0) {
- y = x & z;
- if (__put_user(y, p) == 0)
- goto done2;
- goto error2;
- }
-
- spin_unlock_irq(&atomic_op_lock);
- }
-
- /* TIRA gr0,#125
- * int __atomic_user_sub_return(atomic_t *v, int i)
- */
- case TBR_TT_ATOMIC_SUB:
- p = (unsigned long __user *) __frame->gr8;
- x = __frame->gr9;
-
- for (;;) {
- ret = get_user(z, p);
- if (ret < 0)
- goto error;
-
- spin_lock_irq(&atomic_op_lock);
-
- if (__get_user(z, p) == 0) {
- y = z - x;
- if (__put_user(y, p) == 0)
- goto done2;
- goto error2;
- }
-
- spin_unlock_irq(&atomic_op_lock);
- }
-
- /* TIRA gr0,#126
- * int __atomic_user_add_return(atomic_t *v, int i)
- */
- case TBR_TT_ATOMIC_ADD:
- p = (unsigned long __user *) __frame->gr8;
- x = __frame->gr9;
-
- for (;;) {
- ret = get_user(z, p);
- if (ret < 0)
- goto error;
-
- spin_lock_irq(&atomic_op_lock);
-
- if (__get_user(z, p) == 0) {
- y = z + x;
- if (__put_user(y, p) == 0)
- goto done2;
- goto error2;
- }
-
- spin_unlock_irq(&atomic_op_lock);
- }
-
- default:
- BUG();
- }
-
-done2:
- spin_unlock_irq(&atomic_op_lock);
-done:
- if (!user_mode(__frame))
- set_fs(oldfs);
- __frame->gr5 = z;
- __frame->gr9 = y;
- return;
-
-error2:
- spin_unlock_irq(&atomic_op_lock);
-error:
- if (!user_mode(__frame))
- set_fs(oldfs);
- __frame->pc -= 4;
-
- die_if_kernel("-- Atomic Op Error --\n");
-
- info.si_signo = SIGSEGV;
- info.si_code = SEGV_ACCERR;
- info.si_errno = 0;
- info.si_addr = (void __user *) __frame->pc;
-
- force_sig_info(info.si_signo, &info, current);
-}
-
-/*****************************************************************************/
-/*
- *
- */
-asmlinkage void media_exception(unsigned long msr0, unsigned long msr1)
-{
- siginfo_t info;
-
- die_if_kernel("-- Media Exception --\n"
- "MSR0 : %08lx\n"
- "MSR1 : %08lx\n",
- msr0, msr1);
-
- info.si_signo = SIGFPE;
- info.si_code = FPE_MDAOVF;
- info.si_errno = 0;
- info.si_addr = (void __user *) __frame->pc;
-
- force_sig_info(info.si_signo, &info, current);
-} /* end media_exception() */
-
-/*****************************************************************************/
-/*
- * instruction or data access exception
- */
-asmlinkage void memory_access_exception(unsigned long esr0,
- unsigned long ear0,
- unsigned long epcr0)
-{
- siginfo_t info;
-
-#ifdef CONFIG_MMU
- if (fixup_exception(__frame))
- return;
-#endif
-
- die_if_kernel("-- Memory Access Exception --\n"
- "ESR0 : %08lx\n"
- "EAR0 : %08lx\n"
- "EPCR0 : %08lx\n",
- esr0, ear0, epcr0);
-
- info.si_signo = SIGSEGV;
- info.si_code = SEGV_ACCERR;
- info.si_errno = 0;
- info.si_addr = NULL;
-
- if ((esr0 & (ESRx_VALID | ESR0_EAV)) == (ESRx_VALID | ESR0_EAV))
- info.si_addr = (void __user *) ear0;
-
- force_sig_info(info.si_signo, &info, current);
-
-} /* end memory_access_exception() */
-
-/*****************************************************************************/
-/*
- * data access error
- * - double-word data load from CPU control area (0xFExxxxxx)
- * - read performed on inactive or self-refreshing SDRAM
- * - error notification from slave device
- * - misaligned address
- * - access to out of bounds memory region
- * - user mode accessing privileged memory region
- * - write to R/O memory region
- */
-asmlinkage void data_access_error(unsigned long esfr1, unsigned long esr15, unsigned long ear15)
-{
- siginfo_t info;
-
- die_if_kernel("-- Data Access Error --\n"
- "ESR15 : %08lx\n"
- "EAR15 : %08lx\n",
- esr15, ear15);
-
- info.si_signo = SIGSEGV;
- info.si_code = SEGV_ACCERR;
- info.si_errno = 0;
- info.si_addr = (void __user *)
- (((esr15 & (ESRx_VALID|ESR15_EAV)) == (ESRx_VALID|ESR15_EAV)) ? ear15 : 0);
-
- force_sig_info(info.si_signo, &info, current);
-} /* end data_access_error() */
-
-/*****************************************************************************/
-/*
- * data store error - should only happen if accessing inactive or self-refreshing SDRAM
- */
-asmlinkage void data_store_error(unsigned long esfr1, unsigned long esr15)
-{
- die_if_kernel("-- Data Store Error --\n"
- "ESR15 : %08lx\n",
- esr15);
- BUG();
-} /* end data_store_error() */
-
-/*****************************************************************************/
-/*
- *
- */
-asmlinkage void division_exception(unsigned long esfr1, unsigned long esr0, unsigned long isr)
-{
- siginfo_t info;
-
- die_if_kernel("-- Division Exception --\n"
- "ESR0 : %08lx\n"
- "ISR : %08lx\n",
- esr0, isr);
-
- info.si_signo = SIGFPE;
- info.si_code = FPE_INTDIV;
- info.si_errno = 0;
- info.si_addr = (void __user *) __frame->pc;
-
- force_sig_info(info.si_signo, &info, current);
-} /* end division_exception() */
-
-/*****************************************************************************/
-/*
- *
- */
-asmlinkage void compound_exception(unsigned long esfr1,
- unsigned long esr0, unsigned long esr14, unsigned long esr15,
- unsigned long msr0, unsigned long msr1)
-{
- die_if_kernel("-- Compound Exception --\n"
- "ESR0 : %08lx\n"
- "ESR15 : %08lx\n"
- "ESR15 : %08lx\n"
- "MSR0 : %08lx\n"
- "MSR1 : %08lx\n",
- esr0, esr14, esr15, msr0, msr1);
- BUG();
-} /* end compound_exception() */
-
-void show_stack(struct task_struct *task, unsigned long *sp)
-{
-}
-
-void show_trace_task(struct task_struct *tsk)
-{
- printk("CONTEXT: stack=0x%lx frame=0x%p LR=0x%lx RET=0x%lx\n",
- tsk->thread.sp, tsk->thread.frame, tsk->thread.lr, tsk->thread.sched_lr);
-}
-
-static const char *regnames[] = {
- "PSR ", "ISR ", "CCR ", "CCCR",
- "LR ", "LCR ", "PC ", "_stt",
- "sys ", "GR8*", "GNE0", "GNE1",
- "IACH", "IACL",
- "TBR ", "SP ", "FP ", "GR3 ",
- "GR4 ", "GR5 ", "GR6 ", "GR7 ",
- "GR8 ", "GR9 ", "GR10", "GR11",
- "GR12", "GR13", "GR14", "GR15",
- "GR16", "GR17", "GR18", "GR19",
- "GR20", "GR21", "GR22", "GR23",
- "GR24", "GR25", "GR26", "GR27",
- "EFRM", "CURR", "GR30", "BFRM"
-};
-
-void show_regs(struct pt_regs *regs)
-{
- unsigned long *reg;
- int loop;
-
- printk("\n");
- show_regs_print_info(KERN_DEFAULT);
-
- printk("Frame: @%08lx [%s]\n",
- (unsigned long) regs,
- regs->psr & PSR_S ? "kernel" : "user");
-
- reg = (unsigned long *) regs;
- for (loop = 0; loop < NR_PT_REGS; loop++) {
- printk("%s %08lx", regnames[loop + 0], reg[loop + 0]);
-
- if (loop == NR_PT_REGS - 1 || loop % 5 == 4)
- printk("\n");
- else
- printk(" | ");
- }
-}
-
-void die_if_kernel(const char *str, ...)
-{
- char buffer[256];
- va_list va;
-
- if (user_mode(__frame))
- return;
-
- va_start(va, str);
- vsnprintf(buffer, sizeof(buffer), str, va);
- va_end(va);
-
- console_verbose();
- printk("\n===================================\n");
- printk("%s\n", buffer);
- show_backtrace(__frame, 0);
-
- __break_hijack_kernel_event();
- do_exit(SIGSEGV);
-}
-
-/*****************************************************************************/
-/*
- * dump the contents of an exception frame
- */
-static void show_backtrace_regs(struct pt_regs *frame)
-{
- unsigned long *reg;
- int loop;
-
- /* print the registers for this frame */
- printk("<-- %s Frame: @%p -->\n",
- frame->psr & PSR_S ? "Kernel Mode" : "User Mode",
- frame);
-
- reg = (unsigned long *) frame;
- for (loop = 0; loop < NR_PT_REGS; loop++) {
- printk("%s %08lx", regnames[loop + 0], reg[loop + 0]);
-
- if (loop == NR_PT_REGS - 1 || loop % 5 == 4)
- printk("\n");
- else
- printk(" | ");
- }
-
- printk("--------\n");
-} /* end show_backtrace_regs() */
-
-/*****************************************************************************/
-/*
- * generate a backtrace of the kernel stack
- */
-void show_backtrace(struct pt_regs *frame, unsigned long sp)
-{
- struct pt_regs *frame0;
- unsigned long tos = 0, stop = 0, base;
- int format;
-
- base = ((((unsigned long) frame) + 8191) & ~8191) - sizeof(struct user_context);
- frame0 = (struct pt_regs *) base;
-
- if (sp) {
- tos = sp;
- stop = (unsigned long) frame;
- }
-
- printk("\nProcess %s (pid: %d)\n\n", current->comm, current->pid);
-
- for (;;) {
- /* dump stack segment between frames */
- //printk("%08lx -> %08lx\n", tos, stop);
- format = 0;
- while (tos < stop) {
- if (format == 0)
- printk(" %04lx :", tos & 0xffff);
-
- printk(" %08lx", *(unsigned long *) tos);
-
- tos += 4;
- format++;
- if (format == 8) {
- printk("\n");
- format = 0;
- }
- }
-
- if (format > 0)
- printk("\n");
-
- /* dump frame 0 outside of the loop */
- if (frame == frame0)
- break;
-
- tos = frame->sp;
- if (((unsigned long) frame) + sizeof(*frame) != tos) {
- printk("-- TOS %08lx does not follow frame %p --\n",
- tos, frame);
- break;
- }
-
- show_backtrace_regs(frame);
-
- /* dump the stack between this frame and the next */
- stop = (unsigned long) frame->next_frame;
- if (stop != base &&
- (stop < tos ||
- stop > base ||
- (stop < base && stop + sizeof(*frame) > base) ||
- stop & 3)) {
- printk("-- next_frame %08lx is invalid (range %08lx-%08lx) --\n",
- stop, tos, base);
- break;
- }
-
- /* move to next frame */
- frame = frame->next_frame;
- }
-
- /* we can always dump frame 0, even if the rest of the stack is corrupt */
- show_backtrace_regs(frame0);
-
-} /* end show_backtrace() */
-
-/*****************************************************************************/
-/*
- * initialise traps
- */
-void __init trap_init (void)
-{
-} /* end trap_init() */
diff --git a/arch/frv/kernel/uaccess.c b/arch/frv/kernel/uaccess.c
deleted file mode 100644
index 8b360b4222a5..000000000000
--- a/arch/frv/kernel/uaccess.c
+++ /dev/null
@@ -1,100 +0,0 @@
-/* uaccess.c: userspace access functions
- *
- * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
- * Written by David Howells (dhowells@redhat.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.
- */
-
-#include <linux/mm.h>
-#include <linux/module.h>
-#include <linux/uaccess.h>
-
-/*****************************************************************************/
-/*
- * copy a null terminated string from userspace
- */
-long strncpy_from_user(char *dst, const char __user *src, long count)
-{
- unsigned long max;
- char *p, ch;
- long err = -EFAULT;
-
- BUG_ON(count < 0);
-
- p = dst;
-
-#ifndef CONFIG_MMU
- if ((unsigned long) src < memory_start)
- goto error;
-#endif
-
- if ((unsigned long) src >= get_addr_limit())
- goto error;
-
- max = get_addr_limit() - (unsigned long) src;
- if ((unsigned long) count > max) {
- memset(dst + max, 0, count - max);
- count = max;
- }
-
- err = 0;
- for (; count > 0; count--, p++, src++) {
- __get_user_asm(err, ch, src, "ub", "=r");
- if (err < 0)
- goto error;
- if (!ch)
- break;
- *p = ch;
- }
-
- err = p - dst; /* return length excluding NUL */
-
- error:
- if (count > 0)
- memset(p, 0, count); /* clear remainder of buffer [security] */
-
- return err;
-
-} /* end strncpy_from_user() */
-
-EXPORT_SYMBOL(strncpy_from_user);
-
-/*****************************************************************************/
-/*
- * Return the size of a string (including the ending 0)
- *
- * Return 0 on exception, a value greater than N if too long
- */
-long strnlen_user(const char __user *src, long count)
-{
- const char __user *p;
- long err = 0;
- char ch;
-
- BUG_ON(count < 0);
-
-#ifndef CONFIG_MMU
- if ((unsigned long) src < memory_start)
- return 0;
-#endif
-
- if ((unsigned long) src >= get_addr_limit())
- return 0;
-
- for (p = src; count > 0; count--, p++) {
- __get_user_asm(err, ch, p, "ub", "=r");
- if (err < 0)
- return 0;
- if (!ch)
- break;
- }
-
- return p - src + 1; /* return length including NUL */
-
-} /* end strnlen_user() */
-
-EXPORT_SYMBOL(strnlen_user);
diff --git a/arch/frv/kernel/vmlinux.lds.S b/arch/frv/kernel/vmlinux.lds.S
deleted file mode 100644
index 42806c512758..000000000000
--- a/arch/frv/kernel/vmlinux.lds.S
+++ /dev/null
@@ -1,136 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/* ld script to make FRV Linux kernel
- * Written by Martin Mares <mj@atrey.karlin.mff.cuni.cz>;
- */
-OUTPUT_FORMAT("elf32-frv", "elf32-frv", "elf32-frv")
-OUTPUT_ARCH(frv)
-ENTRY(_start)
-
-#include <asm-generic/vmlinux.lds.h>
-#include <asm/processor.h>
-#include <asm/page.h>
-#include <asm/cache.h>
-#include <asm/thread_info.h>
-
-jiffies = jiffies_64 + 4;
-
-__page_offset = CONFIG_PAGE_OFFSET; /* start of area covered by struct pages */
-__kernel_image_start = __page_offset; /* address at which kernel image resides */
-
-SECTIONS
-{
- . = __kernel_image_start;
-
- /* discardable initialisation code and data */
- . = ALIGN(PAGE_SIZE); /* Init code and data */
- __init_begin = .;
-
- _sinittext = .;
- .init.text : {
- HEAD_TEXT
-#ifndef CONFIG_DEBUG_INFO
- INIT_TEXT
- EXIT_TEXT
- EXIT_DATA
- *(.exitcall.exit)
-#endif
- }
- _einittext = .;
-
- INIT_DATA_SECTION(8)
- PERCPU_SECTION(L1_CACHE_BYTES)
-
- . = ALIGN(PAGE_SIZE);
- __init_end = .;
-
- .trap : {
- /* trap table management - read entry-table.S before modifying */
- . = ALIGN(8192);
- __trap_tables = .;
- *(.trap.user)
- *(.trap.kernel)
- . = ALIGN(4096);
- *(.trap.break)
- }
-
- /* Text and read-only data */
- . = ALIGN(4);
- _text = .;
- _stext = .;
- .text : {
- *(.text..start)
- *(.text..entry)
- *(.text..break)
- *(.text..tlbmiss)
- TEXT_TEXT
- SCHED_TEXT
- CPUIDLE_TEXT
- LOCK_TEXT
-#ifdef CONFIG_DEBUG_INFO
- INIT_TEXT
- EXIT_TEXT
- *(.exitcall.exit)
-#endif
- *(.fixup)
- *(.gnu.warning)
- *(.exitcall.exit)
- } = 0x9090
-
- _etext = .; /* End of text section */
-
- RODATA
-
- .rodata : {
- *(.trap.vector)
-
- /* this clause must not be modified - the ordering and adjacency are imperative */
- __trap_fixup_tables = .;
- *(.trap.fixup.user .trap.fixup.kernel)
-
- }
-
- EXCEPTION_TABLE(8)
-
- _sdata = .;
- .data : { /* Data */
- INIT_TASK_DATA(THREAD_SIZE)
- CACHELINE_ALIGNED_DATA(L1_CACHE_BYTES)
- DATA_DATA
- *(.data.*)
- EXIT_DATA
- CONSTRUCTORS
- }
-
- _edata = .; /* End of data section */
-
- BUG_TABLE
-
- /* GP section */
- . = ALIGN(L1_CACHE_BYTES);
- _gp = . + 2048;
- PROVIDE (gp = _gp);
-
- .sdata : { *(.sdata .sdata.*) }
-
- /* BSS */
- . = ALIGN(L1_CACHE_BYTES);
- __bss_start = .;
-
- .sbss : { *(.sbss .sbss.*) }
- .bss : { *(.bss .bss.*) }
- .bss..stack : { *(.bss) }
-
- __bss_stop = .;
- _end = . ;
- . = ALIGN(PAGE_SIZE);
- __kernel_image_end = .;
-
- STABS_DEBUG
- DWARF_DEBUG
-
- .comment 0 : { *(.comment) }
-
- DISCARDS
-}
-
-__kernel_image_size_no_bss = __bss_start - __kernel_image_start;