mirror of
https://github.com/Dasharo/linux.git
synced 2026-03-06 15:25:10 -08:00
mn10300: add the MN10300/AM33 architecture to the kernel
Add architecture support for the MN10300/AM33 CPUs produced by MEI to the kernel. This patch also adds board support for the ASB2303 with the ASB2308 daughter board, and the ASB2305. The only processor supported is the MN103E010, which is an AM33v2 core plus on-chip devices. [akpm@linux-foundation.org: nuke cvs control strings] Signed-off-by: Masakazu Urade <urade.masakazu@jp.panasonic.com> Signed-off-by: Koichi Yasutake <yasutake.koichi@jp.panasonic.com> Signed-off-by: David Howells <dhowells@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
ef3d534754
commit
b920de1b77
149
Documentation/mn10300/ABI.txt
Normal file
149
Documentation/mn10300/ABI.txt
Normal file
@@ -0,0 +1,149 @@
|
||||
=========================
|
||||
MN10300 FUNCTION CALL ABI
|
||||
=========================
|
||||
|
||||
=======
|
||||
GENERAL
|
||||
=======
|
||||
|
||||
The MN10300/AM33 kernel runs in little-endian mode; big-endian mode is not
|
||||
supported.
|
||||
|
||||
The stack grows downwards, and should always be 32-bit aligned. There are
|
||||
separate stack pointer registers for userspace and the kernel.
|
||||
|
||||
|
||||
================
|
||||
ARGUMENT PASSING
|
||||
================
|
||||
|
||||
The first two arguments (assuming up to 32-bits per argument) to a function are
|
||||
passed in the D0 and D1 registers respectively; all other arguments are passed
|
||||
on the stack.
|
||||
|
||||
If 64-bit arguments are being passed, then they are never split between
|
||||
registers and the stack. If the first argument is a 64-bit value, it will be
|
||||
passed in D0:D1. If the first argument is not a 64-bit value, but the second
|
||||
is, the second will be passed entirely on the stack and D1 will be unused.
|
||||
|
||||
Arguments smaller than 32-bits are not coelesced within a register or a stack
|
||||
word. For example, two byte-sized arguments will always be passed in separate
|
||||
registers or word-sized stack slots.
|
||||
|
||||
|
||||
=================
|
||||
CALLING FUNCTIONS
|
||||
=================
|
||||
|
||||
The caller must allocate twelve bytes on the stack for the callee's use before
|
||||
it inserts a CALL instruction. The CALL instruction will write into the TOS
|
||||
word, but won't actually modify the stack pointer; similarly, the RET
|
||||
instruction reads from the TOS word of the stack, but doesn't move the stack
|
||||
pointer beyond it.
|
||||
|
||||
|
||||
Stack:
|
||||
| |
|
||||
| |
|
||||
|---------------| SP+20
|
||||
| 4th Arg |
|
||||
|---------------| SP+16
|
||||
| 3rd Arg |
|
||||
|---------------| SP+12
|
||||
| D1 Save Slot |
|
||||
|---------------| SP+8
|
||||
| D0 Save Slot |
|
||||
|---------------| SP+4
|
||||
| Return Addr |
|
||||
|---------------| SP
|
||||
| |
|
||||
| |
|
||||
|
||||
|
||||
The caller must leave space on the stack (hence an allocation of twelve bytes)
|
||||
in which the callee may store the first two arguments.
|
||||
|
||||
|
||||
============
|
||||
RETURN VALUE
|
||||
============
|
||||
|
||||
The return value is passed in D0 for an integer (or D0:D1 for a 64-bit value),
|
||||
or A0 for a pointer.
|
||||
|
||||
If the return value is a value larger than 64-bits, or is a structure or an
|
||||
array, then a hidden first argument will be passed to the callee by the caller:
|
||||
this will point to a piece of memory large enough to hold the result of the
|
||||
function. In this case, the callee will return the value in that piece of
|
||||
memory, and no value will be returned in D0 or A0.
|
||||
|
||||
|
||||
===================
|
||||
REGISTER CLOBBERING
|
||||
===================
|
||||
|
||||
The values in certain registers may be clobbered by the callee, and other
|
||||
values must be saved:
|
||||
|
||||
Clobber: D0-D1, A0-A1, E0-E3
|
||||
Save: D2-D3, A2-A3, E4-E7, SP
|
||||
|
||||
All other non-supervisor-only registers are clobberable (such as MDR, MCRL,
|
||||
MCRH).
|
||||
|
||||
|
||||
=================
|
||||
SPECIAL REGISTERS
|
||||
=================
|
||||
|
||||
Certain ordinary registers may carry special usage for the compiler:
|
||||
|
||||
A3: Frame pointer
|
||||
E2: TLS pointer
|
||||
|
||||
|
||||
==========
|
||||
KERNEL ABI
|
||||
==========
|
||||
|
||||
The kernel may use a slightly different ABI internally.
|
||||
|
||||
(*) E2
|
||||
|
||||
If CONFIG_MN10300_CURRENT_IN_E2 is defined, then the current task pointer
|
||||
will be kept in the E2 register, and that register will be marked
|
||||
unavailable for the compiler to use as a scratch register.
|
||||
|
||||
Normally the kernel uses something like:
|
||||
|
||||
MOV SP,An
|
||||
AND 0xFFFFE000,An
|
||||
MOV (An),Rm // Rm holds current
|
||||
MOV (yyy,Rm) // Access current->yyy
|
||||
|
||||
To find the address of current; but since this option permits current to
|
||||
be carried globally in an register, it can use:
|
||||
|
||||
MOV (yyy,E2) // Access current->yyy
|
||||
|
||||
instead.
|
||||
|
||||
|
||||
===============
|
||||
SYSTEM CALL ABI
|
||||
===============
|
||||
|
||||
System calls are called with the following convention:
|
||||
|
||||
REGISTER ENTRY EXIT
|
||||
=============== ======================= =======================
|
||||
D0 Syscall number Return value
|
||||
A0 1st syscall argument Saved
|
||||
D1 2nd syscall argument Saved
|
||||
A3 3rd syscall argument Saved
|
||||
A2 4th syscall argument Saved
|
||||
D3 5th syscall argument Saved
|
||||
D2 6th syscall argument Saved
|
||||
|
||||
All other registers are saved. The layout is a consequence of the way the MOVM
|
||||
instruction stores registers onto the stack.
|
||||
60
Documentation/mn10300/compartmentalisation.txt
Normal file
60
Documentation/mn10300/compartmentalisation.txt
Normal file
@@ -0,0 +1,60 @@
|
||||
=========================================
|
||||
PART-SPECIFIC SOURCE COMPARTMENTALISATION
|
||||
=========================================
|
||||
|
||||
The sources for various parts are compartmentalised at two different levels:
|
||||
|
||||
(1) Processor level
|
||||
|
||||
The "processor level" is a CPU core plus the other on-silicon
|
||||
peripherals.
|
||||
|
||||
Processor-specific header files are divided among directories in a similar
|
||||
way to the CPU level:
|
||||
|
||||
(*) include/asm-mn10300/proc-mn103e010/
|
||||
|
||||
Support for the AM33v2 CPU core.
|
||||
|
||||
The appropriate processor is selected by a CONFIG_MN10300_PROC_YYYY option
|
||||
from the "Processor support" choice menu in the arch/mn10300/Kconfig file.
|
||||
|
||||
|
||||
(2) Unit level
|
||||
|
||||
The "unit level" is a processor plus all the external peripherals
|
||||
controlled by that processor.
|
||||
|
||||
Unit-specific header files are divided among directories in a similar way
|
||||
to the CPU level; not only that, but specific sources may also be
|
||||
segregated into separate directories under the arch directory:
|
||||
|
||||
(*) include/asm-mn10300/unit-asb2303/
|
||||
(*) arch/mn10300/unit-asb2303/
|
||||
|
||||
Support for the ASB2303 board with an ASB2308 daughter board.
|
||||
|
||||
(*) include/asm-mn10300/unit-asb2305/
|
||||
(*) arch/mn10300/unit-asb2305/
|
||||
|
||||
Support for the ASB2305 board.
|
||||
|
||||
The appropriate processor is selected by a CONFIG_MN10300_UNIT_ZZZZ option
|
||||
from the "Unit type" choice menu in the arch/mn10300/Kconfig file.
|
||||
|
||||
|
||||
============
|
||||
COMPILE TIME
|
||||
============
|
||||
|
||||
When the kernel is compiled, symbolic links will be made in the asm header file
|
||||
directory for this arch:
|
||||
|
||||
include/asm-mn10300/proc => include/asm-mn10300/proc-YYYY/
|
||||
include/asm-mn10300/unit => include/asm-mn10300/unit-ZZZZ/
|
||||
|
||||
So that the header files contained in those directories can be accessed without
|
||||
lots of #ifdef-age.
|
||||
|
||||
The appropriate arch/mn10300/unit-ZZZZ directory will also be entered by the
|
||||
compilation process; all other unit-specific directories will be ignored.
|
||||
@@ -2614,6 +2614,15 @@ L: linux-kernel@vger.kernel.org
|
||||
W: http://www.linux-mm.org
|
||||
S: Maintained
|
||||
|
||||
MEI MN10300/AM33 PORT
|
||||
P: David Howells
|
||||
M: dhowells@redhat.com
|
||||
P: Koichi Yasutake
|
||||
M: yasutake.koichi@jp.panasonic.com
|
||||
L: linux-am33-list@redhat.com
|
||||
W: ftp://ftp.redhat.com/pub/redhat/gnupro/AM33/
|
||||
S: Maintained
|
||||
|
||||
MEMORY TECHNOLOGY DEVICES (MTD)
|
||||
P: David Woodhouse
|
||||
M: dwmw2@infradead.org
|
||||
|
||||
381
arch/mn10300/Kconfig
Normal file
381
arch/mn10300/Kconfig
Normal file
@@ -0,0 +1,381 @@
|
||||
#
|
||||
# For a description of the syntax of this configuration file,
|
||||
# see Documentation/kbuild/kconfig-language.txt.
|
||||
#
|
||||
|
||||
mainmenu "Linux Kernel Configuration"
|
||||
|
||||
config MN10300
|
||||
def_bool y
|
||||
|
||||
config AM33
|
||||
def_bool y
|
||||
|
||||
config MMU
|
||||
def_bool y
|
||||
|
||||
config HIGHMEM
|
||||
def_bool n
|
||||
|
||||
config NUMA
|
||||
def_bool n
|
||||
|
||||
config UID16
|
||||
def_bool y
|
||||
|
||||
config RWSEM_GENERIC_SPINLOCK
|
||||
def_bool y
|
||||
|
||||
config RWSEM_XCHGADD_ALGORITHM
|
||||
bool
|
||||
|
||||
config GENERIC_HARDIRQS_NO__DO_IRQ
|
||||
def_bool y
|
||||
|
||||
config GENERIC_CALIBRATE_DELAY
|
||||
def_bool y
|
||||
|
||||
config GENERIC_FIND_NEXT_BIT
|
||||
def_bool y
|
||||
|
||||
config GENERIC_HWEIGHT
|
||||
def_bool y
|
||||
|
||||
config GENERIC_TIME
|
||||
def_bool y
|
||||
|
||||
config GENERIC_BUG
|
||||
def_bool y
|
||||
|
||||
config QUICKLIST
|
||||
def_bool y
|
||||
|
||||
config ARCH_HAS_ILOG2_U32
|
||||
def_bool y
|
||||
|
||||
config ARCH_SUPPORTS_AOUT
|
||||
def_bool n
|
||||
|
||||
# Use the generic interrupt handling code in kernel/irq/
|
||||
config GENERIC_HARDIRQS
|
||||
def_bool y
|
||||
|
||||
config HOTPLUG_CPU
|
||||
def_bool n
|
||||
|
||||
mainmenu "Matsushita MN10300/AM33 Kernel Configuration"
|
||||
|
||||
source "init/Kconfig"
|
||||
|
||||
|
||||
menu "Matsushita MN10300 system setup"
|
||||
|
||||
choice
|
||||
prompt "Unit type"
|
||||
default MN10300_UNIT_ASB2303
|
||||
help
|
||||
This option specifies board for which the kernel will be
|
||||
compiled. It affects the external peripherals catered for.
|
||||
|
||||
config MN10300_UNIT_ASB2303
|
||||
bool "ASB2303"
|
||||
|
||||
config MN10300_UNIT_ASB2305
|
||||
bool "ASB2305"
|
||||
|
||||
endchoice
|
||||
|
||||
choice
|
||||
prompt "Processor support"
|
||||
default MN10300_PROC_MN103E010
|
||||
help
|
||||
This option specifies the processor for which the kernel will be
|
||||
compiled. It affects the on-chip peripherals catered for.
|
||||
|
||||
config MN10300_PROC_MN103E010
|
||||
bool "MN103E010"
|
||||
depends on MN10300_UNIT_ASB2303 || MN10300_UNIT_ASB2305
|
||||
select MN10300_PROC_HAS_TTYSM0
|
||||
select MN10300_PROC_HAS_TTYSM1
|
||||
select MN10300_PROC_HAS_TTYSM2
|
||||
|
||||
endchoice
|
||||
|
||||
choice
|
||||
prompt "Processor core support"
|
||||
default MN10300_CPU_AM33V2
|
||||
help
|
||||
This option specifies the processor core for which the kernel will be
|
||||
compiled. It affects the instruction set used.
|
||||
|
||||
config MN10300_CPU_AM33V2
|
||||
bool "AM33v2"
|
||||
|
||||
endchoice
|
||||
|
||||
config FPU
|
||||
bool "FPU present"
|
||||
default y
|
||||
depends on MN10300_PROC_MN103E010
|
||||
|
||||
choice
|
||||
prompt "CPU Caching mode"
|
||||
default MN10300_CACHE_WBACK
|
||||
help
|
||||
This option determines the caching mode for the kernel.
|
||||
|
||||
Write-Back caching mode involves the all reads and writes causing
|
||||
the affected cacheline to be read into the cache first before being
|
||||
operated upon. Memory is not then updated by a write until the cache
|
||||
is filled and a cacheline needs to be displaced from the cache to
|
||||
make room. Only at that point is it written back.
|
||||
|
||||
Write-Through caching only fetches cachelines from memory on a
|
||||
read. Writes always get written directly to memory. If the affected
|
||||
cacheline is also in cache, it will be updated too.
|
||||
|
||||
The final option is to turn of caching entirely.
|
||||
|
||||
config MN10300_CACHE_WBACK
|
||||
bool "Write-Back"
|
||||
|
||||
config MN10300_CACHE_WTHRU
|
||||
bool "Write-Through"
|
||||
|
||||
config MN10300_CACHE_DISABLED
|
||||
bool "Disabled"
|
||||
|
||||
endchoice
|
||||
|
||||
menu "Memory layout options"
|
||||
|
||||
config KERNEL_RAM_BASE_ADDRESS
|
||||
hex "Base address of kernel RAM"
|
||||
default "0x90000000"
|
||||
|
||||
config INTERRUPT_VECTOR_BASE
|
||||
hex "Base address of vector table"
|
||||
default "0x90000000"
|
||||
help
|
||||
The base address of the vector table will be programmed into
|
||||
the TBR register. It must be on 16MiB address boundary.
|
||||
|
||||
config KERNEL_TEXT_ADDRESS
|
||||
hex "Base address of kernel"
|
||||
default "0x90001000"
|
||||
|
||||
config KERNEL_ZIMAGE_BASE_ADDRESS
|
||||
hex "Base address of compressed vmlinux image"
|
||||
default "0x90700000"
|
||||
|
||||
endmenu
|
||||
|
||||
config PREEMPT
|
||||
bool "Preemptible Kernel"
|
||||
help
|
||||
This option reduces the latency of the kernel when reacting to
|
||||
real-time or interactive events by allowing a low priority process to
|
||||
be preempted even if it is in kernel mode executing a system call.
|
||||
This allows applications to run more reliably even when the system is
|
||||
under load.
|
||||
|
||||
Say Y here if you are building a kernel for a desktop, embedded
|
||||
or real-time system. Say N if you are unsure.
|
||||
|
||||
config PREEMPT_BKL
|
||||
bool "Preempt The Big Kernel Lock"
|
||||
depends on PREEMPT
|
||||
default y
|
||||
help
|
||||
This option reduces the latency of the kernel by making the
|
||||
big kernel lock preemptible.
|
||||
|
||||
Say Y here if you are building a kernel for a desktop system.
|
||||
Say N if you are unsure.
|
||||
|
||||
config MN10300_CURRENT_IN_E2
|
||||
bool "Hold current task address in E2 register"
|
||||
default y
|
||||
help
|
||||
This option removes the E2/R2 register from the set available to gcc
|
||||
for normal use and instead uses it to store the address of the
|
||||
current process's task_struct whilst in the kernel.
|
||||
|
||||
This means the kernel doesn't need to calculate the address each time
|
||||
"current" is used (take SP, AND with mask and dereference pointer
|
||||
just to get the address), and instead can just use E2+offset
|
||||
addressing each time.
|
||||
|
||||
This has no effect on userspace.
|
||||
|
||||
config MN10300_USING_JTAG
|
||||
bool "Using JTAG to debug kernel"
|
||||
default y
|
||||
help
|
||||
This options indicates that JTAG will be used to debug the kernel. It
|
||||
suppresses the use of certain hardware debugging features, such as
|
||||
single-stepping, which are taken over completely by the JTAG unit.
|
||||
|
||||
config MN10300_RTC
|
||||
bool "Using MN10300 RTC"
|
||||
depends on MN10300_PROC_MN103E010
|
||||
default n
|
||||
help
|
||||
|
||||
This option enables support for the RTC, thus enabling time to be
|
||||
tracked, even when system is powered down. This is available on-chip
|
||||
on the MN103E010.
|
||||
|
||||
config MN10300_WD_TIMER
|
||||
bool "Using MN10300 watchdog timer"
|
||||
default y
|
||||
help
|
||||
This options indicates that the watchdog timer will be used.
|
||||
|
||||
config PCI
|
||||
bool "Use PCI"
|
||||
depends on MN10300_UNIT_ASB2305
|
||||
default y
|
||||
help
|
||||
Some systems (such as the ASB2305) have PCI onboard. If you have one
|
||||
of these boards and you wish to use the PCI facilities, say Y here.
|
||||
|
||||
The PCI-HOWTO, available from
|
||||
<http://www.tldp.org/docs.html#howto>, contains valuable
|
||||
information about which PCI hardware does work under Linux and which
|
||||
doesn't.
|
||||
|
||||
source "drivers/pci/Kconfig"
|
||||
|
||||
source "drivers/pcmcia/Kconfig"
|
||||
|
||||
menu "MN10300 internal serial options"
|
||||
|
||||
config MN10300_PROC_HAS_TTYSM0
|
||||
bool
|
||||
default n
|
||||
|
||||
config MN10300_PROC_HAS_TTYSM1
|
||||
bool
|
||||
default n
|
||||
|
||||
config MN10300_PROC_HAS_TTYSM2
|
||||
bool
|
||||
default n
|
||||
|
||||
config MN10300_TTYSM
|
||||
bool "Support for ttySM serial ports"
|
||||
depends on MN10300
|
||||
default y
|
||||
select SERIAL_CORE
|
||||
help
|
||||
This option enables support for the on-chip serial ports that the
|
||||
MN10300 has available.
|
||||
|
||||
config MN10300_TTYSM_CONSOLE
|
||||
bool "Support for console on ttySM serial ports"
|
||||
depends on MN10300_TTYSM
|
||||
select SERIAL_CORE_CONSOLE
|
||||
help
|
||||
This option enables support for a console on the on-chip serial ports
|
||||
that the MN10300 has available.
|
||||
|
||||
#
|
||||
# /dev/ttySM0
|
||||
#
|
||||
config MN10300_TTYSM0
|
||||
bool "Enable SIF0 (/dev/ttySM0)"
|
||||
depends on MN10300_TTYSM && MN10300_PROC_HAS_TTYSM0
|
||||
help
|
||||
Enable access to SIF0 through /dev/ttySM0 or gdb-stub
|
||||
|
||||
choice
|
||||
prompt "Select the timer to supply the clock for SIF0"
|
||||
default MN10300_TTYSM0_TIMER8
|
||||
depends on MN10300_TTYSM0
|
||||
|
||||
config MN10300_TTYSM0_TIMER8
|
||||
bool "Use timer 8 (16-bit)"
|
||||
|
||||
config MN10300_TTYSM0_TIMER2
|
||||
bool "Use timer 2 (8-bit)"
|
||||
|
||||
endchoice
|
||||
|
||||
#
|
||||
# /dev/ttySM1
|
||||
#
|
||||
config MN10300_TTYSM1
|
||||
bool "Enable SIF1 (/dev/ttySM1)"
|
||||
depends on MN10300_TTYSM && MN10300_PROC_HAS_TTYSM1
|
||||
help
|
||||
Enable access to SIF1 through /dev/ttySM1 or gdb-stub
|
||||
|
||||
choice
|
||||
prompt "Select the timer to supply the clock for SIF1"
|
||||
default MN10300_TTYSM0_TIMER9
|
||||
depends on MN10300_TTYSM1
|
||||
|
||||
config MN10300_TTYSM1_TIMER9
|
||||
bool "Use timer 9 (16-bit)"
|
||||
|
||||
config MN10300_TTYSM1_TIMER3
|
||||
bool "Use timer 3 (8-bit)"
|
||||
|
||||
endchoice
|
||||
|
||||
#
|
||||
# /dev/ttySM2
|
||||
#
|
||||
config MN10300_TTYSM2
|
||||
bool "Enable SIF2 (/dev/ttySM2)"
|
||||
depends on MN10300_TTYSM && MN10300_PROC_HAS_TTYSM2
|
||||
help
|
||||
Enable access to SIF2 through /dev/ttySM2 or gdb-stub
|
||||
|
||||
choice
|
||||
prompt "Select the timer to supply the clock for SIF2"
|
||||
default MN10300_TTYSM0_TIMER10
|
||||
depends on MN10300_TTYSM2
|
||||
|
||||
config MN10300_TTYSM2_TIMER10
|
||||
bool "Use timer 10 (16-bit)"
|
||||
|
||||
endchoice
|
||||
|
||||
config MN10300_TTYSM2_CTS
|
||||
bool "Enable the use of the CTS line /dev/ttySM2"
|
||||
depends on MN10300_TTYSM2
|
||||
|
||||
endmenu
|
||||
|
||||
source "mm/Kconfig"
|
||||
|
||||
menu "Power management options"
|
||||
source kernel/power/Kconfig
|
||||
endmenu
|
||||
|
||||
endmenu
|
||||
|
||||
|
||||
menu "Executable formats"
|
||||
|
||||
source "fs/Kconfig.binfmt"
|
||||
|
||||
endmenu
|
||||
|
||||
source "net/Kconfig"
|
||||
|
||||
source "drivers/Kconfig"
|
||||
|
||||
source "fs/Kconfig"
|
||||
|
||||
source "arch/mn10300/Kconfig.debug"
|
||||
|
||||
source "security/Kconfig"
|
||||
|
||||
source "crypto/Kconfig"
|
||||
|
||||
source "lib/Kconfig"
|
||||
|
||||
source "arch/mn10300/oprofile/Kconfig"
|
||||
135
arch/mn10300/Kconfig.debug
Normal file
135
arch/mn10300/Kconfig.debug
Normal file
@@ -0,0 +1,135 @@
|
||||
menu "Kernel hacking"
|
||||
|
||||
source "lib/Kconfig.debug"
|
||||
|
||||
config DEBUG_STACKOVERFLOW
|
||||
bool "Check for stack overflows"
|
||||
depends on DEBUG_KERNEL
|
||||
|
||||
config DEBUG_DECOMPRESS_KERNEL
|
||||
bool "Using serial port during decompressing kernel"
|
||||
depends on DEBUG_KERNEL
|
||||
default n
|
||||
help
|
||||
If you say Y here you will confirm the start and the end of
|
||||
decompressing Linux seeing "Uncompressing Linux... " and
|
||||
"Ok, booting the kernel.\n" on console.
|
||||
|
||||
config KPROBES
|
||||
bool "Kprobes"
|
||||
depends on DEBUG_KERNEL
|
||||
help
|
||||
Kprobes allows you to trap at almost any kernel address and
|
||||
execute a callback function. register_kprobe() establishes
|
||||
a probepoint and specifies the callback. Kprobes is useful
|
||||
for kernel debugging, non-intrusive instrumentation and testing.
|
||||
If in doubt, say "N".
|
||||
|
||||
config GDBSTUB
|
||||
bool "Remote GDB kernel debugging"
|
||||
depends on DEBUG_KERNEL
|
||||
select DEBUG_INFO
|
||||
select FRAME_POINTER
|
||||
help
|
||||
If you say Y here, it will be possible to remotely debug the kernel
|
||||
using gdb. This enlarges your kernel ELF image disk size by several
|
||||
megabytes and requires a machine with more than 16 MB, better 32 MB
|
||||
RAM to avoid excessive linking time. This is only useful for kernel
|
||||
hackers. If unsure, say N.
|
||||
|
||||
config GDBSTUB_IMMEDIATE
|
||||
bool "Break into GDB stub immediately"
|
||||
depends on GDBSTUB
|
||||
help
|
||||
If you say Y here, GDB stub will break into the program as soon as
|
||||
possible, leaving the program counter at the beginning of
|
||||
start_kernel() in init/main.c.
|
||||
|
||||
config GDB_CONSOLE
|
||||
bool "Console output to GDB"
|
||||
depends on GDBSTUB
|
||||
help
|
||||
If you are using GDB for remote debugging over a serial port and
|
||||
would like kernel messages to be formatted into GDB $O packets so
|
||||
that GDB prints them as program output, say 'Y'.
|
||||
|
||||
config GDBSTUB_DEBUGGING
|
||||
bool "Debug GDB stub by messages to serial port"
|
||||
depends on GDBSTUB
|
||||
help
|
||||
This causes debugging messages to be displayed at various points
|
||||
during execution of the GDB stub routines. Such messages will be
|
||||
displayed on ttyS0 if that isn't the GDB stub's port, or ttySM0
|
||||
otherwise.
|
||||
|
||||
config GDBSTUB_DEBUG_ENTRY
|
||||
bool "Debug GDB stub entry"
|
||||
depends on GDBSTUB_DEBUGGING
|
||||
help
|
||||
This option causes information to be displayed about entry to or exit
|
||||
from the main GDB stub routine.
|
||||
|
||||
config GDBSTUB_DEBUG_PROTOCOL
|
||||
bool "Debug GDB stub protocol"
|
||||
depends on GDBSTUB_DEBUGGING
|
||||
help
|
||||
This option causes information to be displayed about the GDB remote
|
||||
protocol messages generated exchanged with GDB.
|
||||
|
||||
config GDBSTUB_DEBUG_IO
|
||||
bool "Debug GDB stub I/O"
|
||||
depends on GDBSTUB_DEBUGGING
|
||||
help
|
||||
This option causes information to be displayed about GDB stub's
|
||||
low-level I/O.
|
||||
|
||||
config GDBSTUB_DEBUG_BREAKPOINT
|
||||
bool "Debug GDB stub breakpoint management"
|
||||
depends on GDBSTUB_DEBUGGING
|
||||
help
|
||||
This option causes information to be displayed about GDB stub's
|
||||
breakpoint management.
|
||||
|
||||
choice
|
||||
prompt "GDB stub port"
|
||||
default GDBSTUB_TTYSM0
|
||||
depends on GDBSTUB
|
||||
help
|
||||
Select the serial port used for GDB-stub.
|
||||
|
||||
config GDBSTUB_ON_TTYSM0
|
||||
bool "/dev/ttySM0 [SIF0]"
|
||||
depends on MN10300_TTYSM0
|
||||
select GDBSTUB_ON_TTYSMx
|
||||
|
||||
config GDBSTUB_ON_TTYSM1
|
||||
bool "/dev/ttySM1 [SIF1]"
|
||||
depends on MN10300_TTYSM1
|
||||
select GDBSTUB_ON_TTYSMx
|
||||
|
||||
config GDBSTUB_ON_TTYSM2
|
||||
bool "/dev/ttySM2 [SIF2]"
|
||||
depends on MN10300_TTYSM2
|
||||
select GDBSTUB_ON_TTYSMx
|
||||
|
||||
config GDBSTUB_ON_TTYS0
|
||||
bool "/dev/ttyS0"
|
||||
select GDBSTUB_ON_TTYSx
|
||||
|
||||
config GDBSTUB_ON_TTYS1
|
||||
bool "/dev/ttyS1"
|
||||
select GDBSTUB_ON_TTYSx
|
||||
|
||||
endchoice
|
||||
|
||||
config GDBSTUB_ON_TTYSMx
|
||||
bool
|
||||
depends on GDBSTUB_ON_TTYSM0 || GDBSTUB_ON_TTYSM1 || GDBSTUB_ON_TTYSM2
|
||||
default y
|
||||
|
||||
config GDBSTUB_ON_TTYSx
|
||||
bool
|
||||
depends on GDBSTUB_ON_TTYS0 || GDBSTUB_ON_TTYS1
|
||||
default y
|
||||
|
||||
endmenu
|
||||
135
arch/mn10300/Makefile
Normal file
135
arch/mn10300/Makefile
Normal file
@@ -0,0 +1,135 @@
|
||||
###############################################################################
|
||||
#
|
||||
# MN10300 Kernel makefile system specifications
|
||||
#
|
||||
# Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
|
||||
# Modified 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 Licence
|
||||
# as published by the Free Software Foundation; either version
|
||||
# 2 of the Licence, or (at your option) any later version.
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
KBUILD_DEFCONFIG := asb2303_defconfig
|
||||
|
||||
CCSPECS := $(shell $(CC) -v 2>&1 | grep "^Reading specs from " | head -1 | cut -c20-)
|
||||
CCDIR := $(strip $(patsubst %/specs,%,$(CCSPECS)))
|
||||
KBUILD_CPPFLAGS += -nostdinc -I$(CCDIR)/include
|
||||
|
||||
LDFLAGS :=
|
||||
OBJCOPYFLAGS := -O binary -R .note -R .comment -S
|
||||
#LDFLAGS_vmlinux := -Map linkmap.txt
|
||||
CHECKFLAGS +=
|
||||
|
||||
PROCESSOR := unset
|
||||
UNIT := unset
|
||||
|
||||
KBUILD_CFLAGS += -mam33 -mmem-funcs -DCPU=AM33
|
||||
KBUILD_AFLAGS += -mam33 -DCPU=AM33
|
||||
|
||||
ifeq ($(CONFIG_MN10300_CURRENT_IN_E2),y)
|
||||
KBUILD_CFLAGS += -ffixed-e2 -fcall-saved-e5
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_MN10300_PROC_MN103E010),y)
|
||||
PROCESSOR := mn103e010
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_MN10300_UNIT_ASB2303),y)
|
||||
UNIT := asb2303
|
||||
endif
|
||||
ifeq ($(CONFIG_MN10300_UNIT_ASB2305),y)
|
||||
UNIT := asb2305
|
||||
endif
|
||||
|
||||
|
||||
head-y := arch/mn10300/kernel/head.o arch/mn10300/kernel/init_task.o
|
||||
|
||||
core-y += arch/mn10300/kernel/ arch/mn10300/mm/
|
||||
|
||||
ifneq ($(PROCESSOR),unset)
|
||||
core-y += arch/mn10300/proc-$(PROCESSOR)/
|
||||
endif
|
||||
ifneq ($(UNIT),unset)
|
||||
core-y += arch/mn10300/unit-$(UNIT)/
|
||||
endif
|
||||
libs-y += arch/mn10300/lib/
|
||||
|
||||
drivers-$(CONFIG_OPROFILE) += arch/mn10300/oprofile/
|
||||
|
||||
boot := arch/mn10300/boot
|
||||
|
||||
.PHONY: zImage
|
||||
|
||||
KBUILD_IMAGE := $(boot)/zImage
|
||||
CLEAN_FILES += $(boot)/zImage
|
||||
CLEAN_FILES += $(boot)/compressed/vmlinux
|
||||
CLEAN_FILES += $(boot)/compressed/vmlinux.bin
|
||||
CLEAN_FILES += $(boot)/compressed/vmlinux.bin.gz
|
||||
|
||||
zImage: vmlinux
|
||||
$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
|
||||
|
||||
all: zImage
|
||||
|
||||
bootstrap:
|
||||
$(Q)$(MAKEBOOT) bootstrap
|
||||
|
||||
archclean:
|
||||
$(Q)$(MAKE) $(clean)=arch/mn10300/proc-mn103e010
|
||||
$(Q)$(MAKE) $(clean)=arch/mn10300/unit-asb2303
|
||||
$(Q)$(MAKE) $(clean)=arch/mn10300/unit-asb2305
|
||||
|
||||
define archhelp
|
||||
echo '* zImage - Compressed kernel image (arch/$(ARCH)/boot/zImage)'
|
||||
endef
|
||||
|
||||
# If you make sure the .S files get compiled with debug info,
|
||||
# uncomment the following to disable optimisations
|
||||
# that are unhelpful whilst debugging.
|
||||
ifdef CONFIG_DEBUG_INFO
|
||||
#KBUILD_CFLAGS += -O1
|
||||
KBUILD_AFLAGS += -Wa,--gdwarf2
|
||||
endif
|
||||
|
||||
###################################################################################################
|
||||
#
|
||||
# juggle some symlinks in the MN10300 asm include dir
|
||||
#
|
||||
# Update machine proc and unit symlinks if something which affects
|
||||
# them changed. We use .proc / .unit to indicate when they were
|
||||
# updated last, otherwise make uses the target directory mtime.
|
||||
#
|
||||
###################################################################################################
|
||||
|
||||
# processor specific definitions
|
||||
include/asm-mn10300/.proc: $(wildcard include/config/proc/*.h) include/config/auto.conf
|
||||
@echo ' SYMLINK include/asm-mn10300/proc -> include/asm-mn10300/proc-$(PROCESSOR)'
|
||||
ifneq ($(KBUILD_SRC),)
|
||||
$(Q)mkdir -p include/asm-mn10300
|
||||
$(Q)ln -fsn $(srctree)/include/asm-mn10300/proc-$(PROCESSOR) include/asm-mn10300/proc
|
||||
else
|
||||
$(Q)ln -fsn proc-$(PROCESSOR) include/asm-mn10300/proc
|
||||
endif
|
||||
@touch $@
|
||||
|
||||
CLEAN_FILES += include/asm-mn10300/proc include/asm-mn10300/.proc
|
||||
|
||||
prepare: include/asm-mn10300/.proc
|
||||
|
||||
# unit specific definitions
|
||||
include/asm-mn10300/.unit: $(wildcard include/config/unit/*.h) include/config/auto.conf
|
||||
@echo ' SYMLINK include/asm-mn10300/unit -> include/asm-mn10300/unit-$(UNIT)'
|
||||
ifneq ($(KBUILD_SRC),)
|
||||
$(Q)mkdir -p include/asm-mn10300
|
||||
$(Q)ln -fsn $(srctree)/include/asm-mn10300/unit-$(UNIT) include/asm-mn10300/unit
|
||||
else
|
||||
$(Q)ln -fsn unit-$(UNIT) include/asm-mn10300/unit
|
||||
endif
|
||||
@touch $@
|
||||
|
||||
CLEAN_FILES += include/asm-mn10300/unit include/asm-mn10300/.unit
|
||||
|
||||
prepare: include/asm-mn10300/.unit
|
||||
1
arch/mn10300/boot/.gitignore
vendored
Normal file
1
arch/mn10300/boot/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
zImage
|
||||
28
arch/mn10300/boot/Makefile
Normal file
28
arch/mn10300/boot/Makefile
Normal file
@@ -0,0 +1,28 @@
|
||||
# MN10300 kernel compressor and wrapper
|
||||
#
|
||||
# Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd.
|
||||
# Copyright (C) 2007 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 Licence
|
||||
# as published by the Free Software Foundation; either version
|
||||
# 2 of the Licence, or (at your option) any later version.
|
||||
#
|
||||
|
||||
targets := vmlinux.bin zImage
|
||||
|
||||
subdir- := compressed
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
$(obj)/zImage: $(obj)/compressed/vmlinux FORCE
|
||||
$(call if_changed,objcopy)
|
||||
@echo 'Kernel: $@ is ready'
|
||||
|
||||
$(obj)/vmlinux.bin: $(obj)/compressed/vmlinux FORCE
|
||||
$(call if_changed,objcopy)
|
||||
|
||||
$(obj)/compressed/vmlinux: FORCE
|
||||
$(Q)$(MAKE) $(build)=$(obj)/compressed IMAGE_OFFSET=$(IMAGE_OFFSET) $@
|
||||
22
arch/mn10300/boot/compressed/Makefile
Normal file
22
arch/mn10300/boot/compressed/Makefile
Normal file
@@ -0,0 +1,22 @@
|
||||
#
|
||||
# Create a compressed vmlinux image from the original vmlinux
|
||||
#
|
||||
|
||||
targets := vmlinux vmlinux.bin vmlinux.bin.gz head.o misc.o piggy.o
|
||||
|
||||
LDFLAGS_vmlinux := -Ttext $(CONFIG_KERNEL_ZIMAGE_BASE_ADDRESS) -e startup_32
|
||||
|
||||
$(obj)/vmlinux: $(obj)/head.o $(obj)/misc.o $(obj)/piggy.o FORCE
|
||||
$(call if_changed,ld)
|
||||
@:
|
||||
|
||||
$(obj)/vmlinux.bin: vmlinux FORCE
|
||||
$(call if_changed,objcopy)
|
||||
|
||||
$(obj)/vmlinux.bin.gz: $(obj)/vmlinux.bin FORCE
|
||||
$(call if_changed,gzip)
|
||||
|
||||
LDFLAGS_piggy.o := -r --format binary --oformat elf32-am33lin -T
|
||||
|
||||
$(obj)/piggy.o: $(obj)/vmlinux.lds $(obj)/vmlinux.bin.gz FORCE
|
||||
$(call if_changed,ld)
|
||||
86
arch/mn10300/boot/compressed/head.S
Normal file
86
arch/mn10300/boot/compressed/head.S
Normal file
@@ -0,0 +1,86 @@
|
||||
/* Boot entry point for a compressed MN10300 kernel
|
||||
*
|
||||
* Copyright (C) 2007 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 Licence
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the Licence, or (at your option) any later version.
|
||||
*/
|
||||
.section .text
|
||||
|
||||
#define DEBUG
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/cpu-regs.h>
|
||||
|
||||
.globl startup_32
|
||||
startup_32:
|
||||
# first save off parameters from bootloader
|
||||
mov param_save_area,a0
|
||||
mov d0,(a0)
|
||||
mov d1,(4,a0)
|
||||
mov d2,(8,a0)
|
||||
|
||||
mov sp,a3
|
||||
mov decomp_stack+0x2000-4,a0
|
||||
mov a0,sp
|
||||
|
||||
# invalidate and enable both of the caches
|
||||
mov CHCTR,a0
|
||||
clr d0
|
||||
movhu d0,(a0) # turn off first
|
||||
mov CHCTR_ICINV|CHCTR_DCINV,d0
|
||||
movhu d0,(a0)
|
||||
setlb
|
||||
mov (a0),d0
|
||||
btst CHCTR_ICBUSY|CHCTR_DCBUSY,d0 # wait till not busy
|
||||
lne
|
||||
mov CHCTR_ICEN|CHCTR_DCEN|CHCTR_DCWTMD,d0 # writethru dcache
|
||||
movhu d0,(a0) # enable
|
||||
|
||||
# clear the BSS area
|
||||
mov __bss_start,a0
|
||||
mov _end,a1
|
||||
clr d0
|
||||
bssclear:
|
||||
cmp a1,a0
|
||||
bge bssclear_end
|
||||
movbu d0,(a0)
|
||||
inc a0
|
||||
bra bssclear
|
||||
bssclear_end:
|
||||
|
||||
# decompress the kernel
|
||||
call decompress_kernel[],0
|
||||
|
||||
# disable caches again
|
||||
mov CHCTR,a0
|
||||
clr d0
|
||||
movhu d0,(a0)
|
||||
setlb
|
||||
mov (a0),d0
|
||||
btst CHCTR_ICBUSY|CHCTR_DCBUSY,d0 # wait till not busy
|
||||
lne
|
||||
|
||||
mov param_save_area,a0
|
||||
mov (a0),d0
|
||||
mov (4,a0),d1
|
||||
mov (8,a0),d2
|
||||
|
||||
mov a3,sp
|
||||
mov CONFIG_KERNEL_TEXT_ADDRESS,a0
|
||||
jmp (a0)
|
||||
|
||||
.data
|
||||
.align 4
|
||||
param_save_area:
|
||||
.rept 3
|
||||
.word 0
|
||||
.endr
|
||||
|
||||
.section .bss
|
||||
.align 4
|
||||
decomp_stack:
|
||||
.space 0x2000
|
||||
429
arch/mn10300/boot/compressed/misc.c
Normal file
429
arch/mn10300/boot/compressed/misc.c
Normal file
@@ -0,0 +1,429 @@
|
||||
/* MN10300 Miscellaneous helper routines for kernel decompressor
|
||||
*
|
||||
* Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd.
|
||||
* Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
|
||||
* Modified by David Howells (dhowells@redhat.com)
|
||||
* - Derived from arch/x86/boot/compressed/misc_32.c
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public Licence
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the Licence, or (at your option) any later version.
|
||||
*/
|
||||
#include <linux/compiler.h>
|
||||
#include <asm/serial-regs.h>
|
||||
#include "misc.h"
|
||||
|
||||
#ifndef CONFIG_GDBSTUB_ON_TTYSx
|
||||
/* display 'Uncompressing Linux... ' messages on ttyS0 or ttyS1 */
|
||||
#if 1 /* ttyS0 */
|
||||
#define CYG_DEV_BASE 0xA6FB0000
|
||||
#else /* ttyS1 */
|
||||
#define CYG_DEV_BASE 0xA6FC0000
|
||||
#endif
|
||||
|
||||
#define CYG_DEV_THR (*((volatile __u8*)(CYG_DEV_BASE + 0x00)))
|
||||
#define CYG_DEV_MCR (*((volatile __u8*)(CYG_DEV_BASE + 0x10)))
|
||||
#define SIO_MCR_DTR 0x01
|
||||
#define SIO_MCR_RTS 0x02
|
||||
#define CYG_DEV_LSR (*((volatile __u8*)(CYG_DEV_BASE + 0x14)))
|
||||
#define SIO_LSR_THRE 0x20 /* transmitter holding register empty */
|
||||
#define SIO_LSR_TEMT 0x40 /* transmitter register empty */
|
||||
#define CYG_DEV_MSR (*((volatile __u8*)(CYG_DEV_BASE + 0x18)))
|
||||
#define SIO_MSR_CTS 0x10 /* clear to send */
|
||||
#define SIO_MSR_DSR 0x20 /* data set ready */
|
||||
|
||||
#define LSR_WAIT_FOR(STATE) \
|
||||
do { while (!(CYG_DEV_LSR & SIO_LSR_##STATE)) {} } while (0)
|
||||
#define FLOWCTL_QUERY(LINE) \
|
||||
({ CYG_DEV_MSR & SIO_MSR_##LINE; })
|
||||
#define FLOWCTL_WAIT_FOR(LINE) \
|
||||
do { while (!(CYG_DEV_MSR & SIO_MSR_##LINE)) {} } while (0)
|
||||
#define FLOWCTL_CLEAR(LINE) \
|
||||
do { CYG_DEV_MCR &= ~SIO_MCR_##LINE; } while (0)
|
||||
#define FLOWCTL_SET(LINE) \
|
||||
do { CYG_DEV_MCR |= SIO_MCR_##LINE; } while (0)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* gzip declarations
|
||||
*/
|
||||
|
||||
#define OF(args) args
|
||||
#define STATIC static
|
||||
|
||||
#undef memset
|
||||
#undef memcpy
|
||||
|
||||
static inline void *memset(const void *s, int c, size_t n)
|
||||
{
|
||||
int i;
|
||||
char *ss = (char *) s;
|
||||
|
||||
for (i = 0; i < n; i++)
|
||||
ss[i] = c;
|
||||
return (void *)s;
|
||||
}
|
||||
|
||||
#define memzero(s, n) memset((s), 0, (n))
|
||||
|
||||
static inline void *memcpy(void *__dest, const void *__src, size_t __n)
|
||||
{
|
||||
int i;
|
||||
const char *s = __src;
|
||||
char *d = __dest;
|
||||
|
||||
for (i = 0; i < __n; i++)
|
||||
d[i] = s[i];
|
||||
return __dest;
|
||||
}
|
||||
|
||||
typedef unsigned char uch;
|
||||
typedef unsigned short ush;
|
||||
typedef unsigned long ulg;
|
||||
|
||||
#define WSIZE 0x8000 /* Window size must be at least 32k, and a power of
|
||||
* two */
|
||||
|
||||
static uch *inbuf; /* input buffer */
|
||||
static uch window[WSIZE]; /* sliding window buffer */
|
||||
|
||||
static unsigned insize; /* valid bytes in inbuf */
|
||||
static unsigned inptr; /* index of next byte to be processed in inbuf */
|
||||
static unsigned outcnt; /* bytes in output buffer */
|
||||
|
||||
/* gzip flag byte */
|
||||
#define ASCII_FLAG 0x01 /* bit 0 set: file probably ASCII text */
|
||||
#define CONTINUATION 0x02 /* bit 1 set: continuation of multi-part gzip file */
|
||||
#define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */
|
||||
#define ORIG_NAME 0x08 /* bit 3 set: original file name present */
|
||||
#define COMMENT 0x10 /* bit 4 set: file comment present */
|
||||
#define ENCRYPTED 0x20 /* bit 5 set: file is encrypted */
|
||||
#define RESERVED 0xC0 /* bit 6,7: reserved */
|
||||
|
||||
/* Diagnostic functions */
|
||||
#ifdef DEBUG
|
||||
# define Assert(cond, msg) { if (!(cond)) error(msg); }
|
||||
# define Trace(x) fprintf x
|
||||
# define Tracev(x) { if (verbose) fprintf x ; }
|
||||
# define Tracevv(x) { if (verbose > 1) fprintf x ; }
|
||||
# define Tracec(c, x) { if (verbose && (c)) fprintf x ; }
|
||||
# define Tracecv(c, x) { if (verbose > 1 && (c)) fprintf x ; }
|
||||
#else
|
||||
# define Assert(cond, msg)
|
||||
# define Trace(x)
|
||||
# define Tracev(x)
|
||||
# define Tracevv(x)
|
||||
# define Tracec(c, x)
|
||||
# define Tracecv(c, x)
|
||||
#endif
|
||||
|
||||
static int fill_inbuf(void);
|
||||
static void flush_window(void);
|
||||
static void error(const char *) __attribute__((noreturn));
|
||||
static void kputs(const char *);
|
||||
|
||||
static inline unsigned char get_byte(void)
|
||||
{
|
||||
unsigned char ch = inptr < insize ? inbuf[inptr++] : fill_inbuf();
|
||||
|
||||
#if 0
|
||||
char hex[3];
|
||||
hex[0] = ((ch & 0x0f) > 9) ?
|
||||
((ch & 0x0f) + 'A' - 0xa) : ((ch & 0x0f) + '0');
|
||||
hex[1] = ((ch >> 4) > 9) ?
|
||||
((ch >> 4) + 'A' - 0xa) : ((ch >> 4) + '0');
|
||||
hex[2] = 0;
|
||||
kputs(hex);
|
||||
#endif
|
||||
return ch;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is set up by the setup-routine at boot-time
|
||||
*/
|
||||
#define EXT_MEM_K (*(unsigned short *)0x90002)
|
||||
#ifndef STANDARD_MEMORY_BIOS_CALL
|
||||
#define ALT_MEM_K (*(unsigned long *) 0x901e0)
|
||||
#endif
|
||||
#define SCREEN_INFO (*(struct screen_info *)0x90000)
|
||||
|
||||
static long bytes_out;
|
||||
static uch *output_data;
|
||||
static unsigned long output_ptr;
|
||||
|
||||
|
||||
static void *malloc(int size);
|
||||
|
||||
static inline void free(void *where)
|
||||
{ /* Don't care */
|
||||
}
|
||||
|
||||
static unsigned long free_mem_ptr = (unsigned long) &end;
|
||||
static unsigned long free_mem_end_ptr = (unsigned long) &end + 0x90000;
|
||||
|
||||
static inline void gzip_mark(void **ptr)
|
||||
{
|
||||
kputs(".");
|
||||
*ptr = (void *) free_mem_ptr;
|
||||
}
|
||||
|
||||
static inline void gzip_release(void **ptr)
|
||||
{
|
||||
free_mem_ptr = (unsigned long) *ptr;
|
||||
}
|
||||
|
||||
#define INPLACE_MOVE_ROUTINE 0x1000
|
||||
#define LOW_BUFFER_START 0x2000
|
||||
#define LOW_BUFFER_END 0x90000
|
||||
#define LOW_BUFFER_SIZE (LOW_BUFFER_END - LOW_BUFFER_START)
|
||||
#define HEAP_SIZE 0x3000
|
||||
static int high_loaded;
|
||||
static uch *high_buffer_start /* = (uch *)(((ulg)&end) + HEAP_SIZE)*/;
|
||||
|
||||
static char *vidmem = (char *)0xb8000;
|
||||
static int lines, cols;
|
||||
|
||||
#include "../../../../lib/inflate.c"
|
||||
|
||||
static void *malloc(int size)
|
||||
{
|
||||
void *p;
|
||||
|
||||
if (size < 0)
|
||||
error("Malloc error\n");
|
||||
if (!free_mem_ptr)
|
||||
error("Memory error\n");
|
||||
|
||||
free_mem_ptr = (free_mem_ptr + 3) & ~3; /* Align */
|
||||
|
||||
p = (void *) free_mem_ptr;
|
||||
free_mem_ptr += size;
|
||||
|
||||
if (free_mem_ptr >= free_mem_end_ptr)
|
||||
error("\nOut of memory\n");
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
static inline void scroll(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
memcpy(vidmem, vidmem + cols * 2, (lines - 1) * cols * 2);
|
||||
for (i = (lines - 1) * cols * 2; i < lines * cols * 2; i += 2)
|
||||
vidmem[i] = ' ';
|
||||
}
|
||||
|
||||
static inline void kputchar(unsigned char ch)
|
||||
{
|
||||
#ifdef CONFIG_MN10300_UNIT_ASB2305
|
||||
while (SC0STR & SC01STR_TBF)
|
||||
continue;
|
||||
|
||||
if (ch == 0x0a) {
|
||||
SC0TXB = 0x0d;
|
||||
while (SC0STR & SC01STR_TBF)
|
||||
continue;
|
||||
}
|
||||
|
||||
SC0TXB = ch;
|
||||
|
||||
#else
|
||||
while (SC1STR & SC01STR_TBF)
|
||||
continue;
|
||||
|
||||
if (ch == 0x0a) {
|
||||
SC1TXB = 0x0d;
|
||||
while (SC1STR & SC01STR_TBF)
|
||||
continue;
|
||||
}
|
||||
|
||||
SC1TXB = ch;
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
static void kputs(const char *s)
|
||||
{
|
||||
#ifdef CONFIG_DEBUG_DECOMPRESS_KERNEL
|
||||
#ifndef CONFIG_GDBSTUB_ON_TTYSx
|
||||
char ch;
|
||||
|
||||
FLOWCTL_SET(DTR);
|
||||
|
||||
while (*s) {
|
||||
LSR_WAIT_FOR(THRE);
|
||||
|
||||
ch = *s++;
|
||||
if (ch == 0x0a) {
|
||||
CYG_DEV_THR = 0x0d;
|
||||
LSR_WAIT_FOR(THRE);
|
||||
}
|
||||
CYG_DEV_THR = ch;
|
||||
}
|
||||
|
||||
FLOWCTL_CLEAR(DTR);
|
||||
#else
|
||||
|
||||
for (; *s; s++)
|
||||
kputchar(*s);
|
||||
|
||||
#endif
|
||||
#endif /* CONFIG_DEBUG_DECOMPRESS_KERNEL */
|
||||
}
|
||||
|
||||
/* ===========================================================================
|
||||
* Fill the input buffer. This is called only when the buffer is empty
|
||||
* and at least one byte is really needed.
|
||||
*/
|
||||
static int fill_inbuf()
|
||||
{
|
||||
if (insize != 0)
|
||||
error("ran out of input data\n");
|
||||
|
||||
inbuf = input_data;
|
||||
insize = input_len;
|
||||
inptr = 1;
|
||||
return inbuf[0];
|
||||
}
|
||||
|
||||
/* ===========================================================================
|
||||
* Write the output window window[0..outcnt-1] and update crc and bytes_out.
|
||||
* (Used for the decompressed data only.)
|
||||
*/
|
||||
static void flush_window_low(void)
|
||||
{
|
||||
ulg c = crc; /* temporary variable */
|
||||
unsigned n;
|
||||
uch *in, *out, ch;
|
||||
|
||||
in = window;
|
||||
out = &output_data[output_ptr];
|
||||
for (n = 0; n < outcnt; n++) {
|
||||
ch = *out++ = *in++;
|
||||
c = crc_32_tab[((int)c ^ ch) & 0xff] ^ (c >> 8);
|
||||
}
|
||||
crc = c;
|
||||
bytes_out += (ulg)outcnt;
|
||||
output_ptr += (ulg)outcnt;
|
||||
outcnt = 0;
|
||||
}
|
||||
|
||||
static void flush_window_high(void)
|
||||
{
|
||||
ulg c = crc; /* temporary variable */
|
||||
unsigned n;
|
||||
uch *in, ch;
|
||||
in = window;
|
||||
for (n = 0; n < outcnt; n++) {
|
||||
ch = *output_data++ = *in++;
|
||||
if ((ulg) output_data == LOW_BUFFER_END)
|
||||
output_data = high_buffer_start;
|
||||
c = crc_32_tab[((int)c ^ ch) & 0xff] ^ (c >> 8);
|
||||
}
|
||||
crc = c;
|
||||
bytes_out += (ulg)outcnt;
|
||||
outcnt = 0;
|
||||
}
|
||||
|
||||
static void flush_window(void)
|
||||
{
|
||||
if (high_loaded)
|
||||
flush_window_high();
|
||||
else
|
||||
flush_window_low();
|
||||
}
|
||||
|
||||
static void error(const char *x)
|
||||
{
|
||||
kputs("\n\n");
|
||||
kputs(x);
|
||||
kputs("\n\n -- System halted");
|
||||
|
||||
while (1)
|
||||
/* Halt */;
|
||||
}
|
||||
|
||||
#define STACK_SIZE (4096)
|
||||
|
||||
long user_stack[STACK_SIZE];
|
||||
|
||||
struct {
|
||||
long *a;
|
||||
short b;
|
||||
} stack_start = { &user_stack[STACK_SIZE], 0 };
|
||||
|
||||
void setup_normal_output_buffer(void)
|
||||
{
|
||||
#ifdef STANDARD_MEMORY_BIOS_CALL
|
||||
if (EXT_MEM_K < 1024)
|
||||
error("Less than 2MB of memory.\n");
|
||||
#else
|
||||
if ((ALT_MEM_K > EXT_MEM_K ? ALT_MEM_K : EXT_MEM_K) < 1024)
|
||||
error("Less than 2MB of memory.\n");
|
||||
#endif
|
||||
output_data = (char *) 0x100000; /* Points to 1M */
|
||||
}
|
||||
|
||||
struct moveparams {
|
||||
uch *low_buffer_start;
|
||||
int lcount;
|
||||
uch *high_buffer_start;
|
||||
int hcount;
|
||||
};
|
||||
|
||||
void setup_output_buffer_if_we_run_high(struct moveparams *mv)
|
||||
{
|
||||
high_buffer_start = (uch *)(((ulg) &end) + HEAP_SIZE);
|
||||
#ifdef STANDARD_MEMORY_BIOS_CALL
|
||||
if (EXT_MEM_K < (3 * 1024))
|
||||
error("Less than 4MB of memory.\n");
|
||||
#else
|
||||
if ((ALT_MEM_K > EXT_MEM_K ? ALT_MEM_K : EXT_MEM_K) < (3 * 1024))
|
||||
error("Less than 4MB of memory.\n");
|
||||
#endif
|
||||
mv->low_buffer_start = output_data = (char *) LOW_BUFFER_START;
|
||||
high_loaded = 1;
|
||||
free_mem_end_ptr = (long) high_buffer_start;
|
||||
if (0x100000 + LOW_BUFFER_SIZE > (ulg) high_buffer_start) {
|
||||
high_buffer_start = (uch *)(0x100000 + LOW_BUFFER_SIZE);
|
||||
mv->hcount = 0; /* say: we need not to move high_buffer */
|
||||
} else {
|
||||
mv->hcount = -1;
|
||||
}
|
||||
mv->high_buffer_start = high_buffer_start;
|
||||
}
|
||||
|
||||
void close_output_buffer_if_we_run_high(struct moveparams *mv)
|
||||
{
|
||||
mv->lcount = bytes_out;
|
||||
if (bytes_out > LOW_BUFFER_SIZE) {
|
||||
mv->lcount = LOW_BUFFER_SIZE;
|
||||
if (mv->hcount)
|
||||
mv->hcount = bytes_out - LOW_BUFFER_SIZE;
|
||||
} else {
|
||||
mv->hcount = 0;
|
||||
}
|
||||
}
|
||||
|
||||
#undef DEBUGFLAG
|
||||
#ifdef DEBUGFLAG
|
||||
int debugflag;
|
||||
#endif
|
||||
|
||||
int decompress_kernel(struct moveparams *mv)
|
||||
{
|
||||
#ifdef DEBUGFLAG
|
||||
while (!debugflag)
|
||||
barrier();
|
||||
#endif
|
||||
|
||||
output_data = (char *) CONFIG_KERNEL_TEXT_ADDRESS;
|
||||
|
||||
makecrc();
|
||||
kputs("Uncompressing Linux... ");
|
||||
gunzip();
|
||||
kputs("Ok, booting the kernel.\n");
|
||||
return 0;
|
||||
}
|
||||
18
arch/mn10300/boot/compressed/misc.h
Normal file
18
arch/mn10300/boot/compressed/misc.h
Normal file
@@ -0,0 +1,18 @@
|
||||
/* Internal definitions for the MN10300 kernel decompressor
|
||||
*
|
||||
* Copyright (C) 2007 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 Licence
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the Licence, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
extern int end;
|
||||
|
||||
/*
|
||||
* vmlinux.lds
|
||||
*/
|
||||
extern char input_data[];
|
||||
extern int input_len;
|
||||
9
arch/mn10300/boot/compressed/vmlinux.lds
Normal file
9
arch/mn10300/boot/compressed/vmlinux.lds
Normal file
@@ -0,0 +1,9 @@
|
||||
SECTIONS
|
||||
{
|
||||
.data : {
|
||||
input_len = .;
|
||||
LONG(input_data_end - input_data) input_data = .;
|
||||
*(.data)
|
||||
input_data_end = .;
|
||||
}
|
||||
}
|
||||
67
arch/mn10300/boot/install.sh
Normal file
67
arch/mn10300/boot/install.sh
Normal file
@@ -0,0 +1,67 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# arch/mn10300/boot/install -c.sh
|
||||
#
|
||||
# This file is subject to the terms and conditions of the GNU General Public
|
||||
# Licence. See the file "COPYING" in the main directory of this archive
|
||||
# for more details.
|
||||
#
|
||||
# Copyright (C) 1995 by Linus Torvalds
|
||||
#
|
||||
# Adapted from code in arch/i386/boot/Makefile by H. Peter Anvin
|
||||
#
|
||||
# "make install -c" script for i386 architecture
|
||||
#
|
||||
# Arguments:
|
||||
# $1 - kernel version
|
||||
# $2 - kernel image file
|
||||
# $3 - kernel map file
|
||||
# $4 - default install -c path (blank if root directory)
|
||||
# $5 - boot rom file
|
||||
#
|
||||
|
||||
# User may have a custom install -c script
|
||||
|
||||
rm -fr $4/../usr/include/linux $4/../usr/include/asm
|
||||
install -c -m 0755 $2 $4/vmlinuz
|
||||
install -c -m 0755 $5 $4/boot.rom
|
||||
install -c -m 0755 -d $4/../usr/include/linux
|
||||
cd $TOPDIR/include/linux
|
||||
for i in `find . -maxdepth 1 -name '*.h' -print`; do
|
||||
install -c -m 0644 $i $4/../usr/include/linux
|
||||
done
|
||||
install -c -m 0755 -d $4/../usr/include/linux/byteorder
|
||||
cd $TOPDIR/include/linux/byteorder
|
||||
for i in `find . -name '*.h' -print`; do
|
||||
install -c -m 0644 $i $4/../usr/include/linux/byteorder
|
||||
done
|
||||
install -c -m 0755 -d $4/../usr/include/linux/lockd
|
||||
cd $TOPDIR/include/linux/lockd
|
||||
for i in `find . -name '*.h' -print`; do
|
||||
install -c -m 0644 $i $4/../usr/include/linux/lockd
|
||||
done
|
||||
install -c -m 0755 -d $4/../usr/include/linux/netfilter_ipv4
|
||||
cd $TOPDIR/include/linux/netfilter_ipv4
|
||||
for i in `find . -name '*.h' -print`; do
|
||||
install -c -m 0644 $i $4/../usr/include/linux/netfilter_ipv4
|
||||
done
|
||||
install -c -m 0755 -d $4/../usr/include/linux/nfsd
|
||||
cd $TOPDIR/include/linux/nfsd
|
||||
for i in `find . -name '*.h' -print`; do
|
||||
install -c -m 0644 $i $4/../usr/include/linux/nfsd/$i
|
||||
done
|
||||
install -c -m 0755 -d $4/../usr/include/linux/raid
|
||||
cd $TOPDIR/include/linux/raid
|
||||
for i in `find . -name '*.h' -print`; do
|
||||
install -c -m 0644 $i $4/../usr/include/linux/raid
|
||||
done
|
||||
install -c -m 0755 -d $4/../usr/include/linux/sunrpc
|
||||
cd $TOPDIR/include/linux/sunrpc
|
||||
for i in `find . -name '*.h' -print`; do
|
||||
install -c -m 0644 $i $4/../usr/include/linux/sunrpc
|
||||
done
|
||||
install -c -m 0755 -d $4/../usr/include/asm
|
||||
cd $TOPDIR/include/asm
|
||||
for i in `find . -name '*.h' -print`; do
|
||||
install -c -m 0644 $i $4/../usr/include/asm
|
||||
done
|
||||
190
arch/mn10300/boot/tools/build.c
Normal file
190
arch/mn10300/boot/tools/build.c
Normal file
@@ -0,0 +1,190 @@
|
||||
/*
|
||||
* Copyright (C) 1991, 1992 Linus Torvalds
|
||||
* Copyright (C) 1997 Martin Mares
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file builds a disk-image from three different files:
|
||||
*
|
||||
* - bootsect: exactly 512 bytes of 8086 machine code, loads the rest
|
||||
* - setup: 8086 machine code, sets up system parm
|
||||
* - system: 80386 code for actual system
|
||||
*
|
||||
* It does some checking that all files are of the correct type, and
|
||||
* just writes the result to stdout, removing headers and padding to
|
||||
* the right amount. It also writes some system data to stderr.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Changes by tytso to allow root device specification
|
||||
* High loaded stuff by Hans Lermen & Werner Almesberger, Feb. 1996
|
||||
* Cross compiling fixes by Gertjan van Wingerde, July 1996
|
||||
* Rewritten by Martin Mares, April 1997
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/sysmacros.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <asm/boot.h>
|
||||
|
||||
#define DEFAULT_MAJOR_ROOT 0
|
||||
#define DEFAULT_MINOR_ROOT 0
|
||||
|
||||
/* Minimal number of setup sectors (see also bootsect.S) */
|
||||
#define SETUP_SECTS 4
|
||||
|
||||
uint8_t buf[1024];
|
||||
int fd;
|
||||
int is_big_kernel;
|
||||
|
||||
__attribute__((noreturn))
|
||||
void die(const char *str, ...)
|
||||
{
|
||||
va_list args;
|
||||
va_start(args, str);
|
||||
vfprintf(stderr, str, args);
|
||||
fputc('\n', stderr);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
void file_open(const char *name)
|
||||
{
|
||||
fd = open(name, O_RDONLY, 0);
|
||||
if (fd < 0)
|
||||
die("Unable to open `%s': %m", name);
|
||||
}
|
||||
|
||||
__attribute__((noreturn))
|
||||
void usage(void)
|
||||
{
|
||||
die("Usage: build [-b] bootsect setup system [rootdev] [> image]");
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
unsigned int i, c, sz, setup_sectors;
|
||||
uint32_t sys_size;
|
||||
uint8_t major_root, minor_root;
|
||||
struct stat sb;
|
||||
|
||||
if (argc > 2 && !strcmp(argv[1], "-b")) {
|
||||
is_big_kernel = 1;
|
||||
argc--, argv++;
|
||||
}
|
||||
if ((argc < 4) || (argc > 5))
|
||||
usage();
|
||||
if (argc > 4) {
|
||||
if (!strcmp(argv[4], "CURRENT")) {
|
||||
if (stat("/", &sb)) {
|
||||
perror("/");
|
||||
die("Couldn't stat /");
|
||||
}
|
||||
major_root = major(sb.st_dev);
|
||||
minor_root = minor(sb.st_dev);
|
||||
} else if (strcmp(argv[4], "FLOPPY")) {
|
||||
if (stat(argv[4], &sb)) {
|
||||
perror(argv[4]);
|
||||
die("Couldn't stat root device.");
|
||||
}
|
||||
major_root = major(sb.st_rdev);
|
||||
minor_root = minor(sb.st_rdev);
|
||||
} else {
|
||||
major_root = 0;
|
||||
minor_root = 0;
|
||||
}
|
||||
} else {
|
||||
major_root = DEFAULT_MAJOR_ROOT;
|
||||
minor_root = DEFAULT_MINOR_ROOT;
|
||||
}
|
||||
fprintf(stderr, "Root device is (%d, %d)\n", major_root, minor_root);
|
||||
|
||||
file_open(argv[1]);
|
||||
i = read(fd, buf, sizeof(buf));
|
||||
fprintf(stderr, "Boot sector %d bytes.\n", i);
|
||||
if (i != 512)
|
||||
die("Boot block must be exactly 512 bytes");
|
||||
if (buf[510] != 0x55 || buf[511] != 0xaa)
|
||||
die("Boot block hasn't got boot flag (0xAA55)");
|
||||
buf[508] = minor_root;
|
||||
buf[509] = major_root;
|
||||
if (write(1, buf, 512) != 512)
|
||||
die("Write call failed");
|
||||
close(fd);
|
||||
|
||||
/* Copy the setup code */
|
||||
file_open(argv[2]);
|
||||
for (i = 0; (c = read(fd, buf, sizeof(buf))) > 0; i += c)
|
||||
if (write(1, buf, c) != c)
|
||||
die("Write call failed");
|
||||
if (c != 0)
|
||||
die("read-error on `setup'");
|
||||
close(fd);
|
||||
|
||||
/* Pad unused space with zeros */
|
||||
setup_sectors = (i + 511) / 512;
|
||||
/* for compatibility with ancient versions of LILO. */
|
||||
if (setup_sectors < SETUP_SECTS)
|
||||
setup_sectors = SETUP_SECTS;
|
||||
fprintf(stderr, "Setup is %d bytes.\n", i);
|
||||
memset(buf, 0, sizeof(buf));
|
||||
while (i < setup_sectors * 512) {
|
||||
c = setup_sectors * 512 - i;
|
||||
if (c > sizeof(buf))
|
||||
c = sizeof(buf);
|
||||
if (write(1, buf, c) != c)
|
||||
die("Write call failed");
|
||||
i += c;
|
||||
}
|
||||
|
||||
file_open(argv[3]);
|
||||
if (fstat(fd, &sb))
|
||||
die("Unable to stat `%s': %m", argv[3]);
|
||||
sz = sb.st_size;
|
||||
fprintf(stderr, "System is %d kB\n", sz / 1024);
|
||||
sys_size = (sz + 15) / 16;
|
||||
/* 0x28000*16 = 2.5 MB, conservative estimate for the current maximum */
|
||||
if (sys_size > (is_big_kernel ? 0x28000 : DEF_SYSSIZE))
|
||||
die("System is too big. Try using %smodules.",
|
||||
is_big_kernel ? "" : "bzImage or ");
|
||||
if (sys_size > 0xffff)
|
||||
fprintf(stderr,
|
||||
"warning: kernel is too big for standalone boot "
|
||||
"from floppy\n");
|
||||
while (sz > 0) {
|
||||
int l, n;
|
||||
|
||||
l = (sz > sizeof(buf)) ? sizeof(buf) : sz;
|
||||
n = read(fd, buf, l);
|
||||
if (n != l) {
|
||||
if (n < 0)
|
||||
die("Error reading %s: %m", argv[3]);
|
||||
else
|
||||
die("%s: Unexpected EOF", argv[3]);
|
||||
}
|
||||
if (write(1, buf, l) != l)
|
||||
die("Write failed");
|
||||
sz -= l;
|
||||
}
|
||||
close(fd);
|
||||
|
||||
/* Write sizes to the bootsector */
|
||||
if (lseek(1, 497, SEEK_SET) != 497)
|
||||
die("Output: seek failed");
|
||||
buf[0] = setup_sectors;
|
||||
if (write(1, buf, 1) != 1)
|
||||
die("Write of setup sector count failed");
|
||||
if (lseek(1, 500, SEEK_SET) != 500)
|
||||
die("Output: seek failed");
|
||||
buf[0] = (sys_size & 0xff);
|
||||
buf[1] = ((sys_size >> 8) & 0xff);
|
||||
if (write(1, buf, 2) != 2)
|
||||
die("Write of image length failed");
|
||||
|
||||
return 0;
|
||||
}
|
||||
555
arch/mn10300/configs/asb2303_defconfig
Normal file
555
arch/mn10300/configs/asb2303_defconfig
Normal file
File diff suppressed because it is too large
Load Diff
27
arch/mn10300/kernel/Makefile
Normal file
27
arch/mn10300/kernel/Makefile
Normal file
@@ -0,0 +1,27 @@
|
||||
#
|
||||
# Makefile for the MN10300-specific core kernel code
|
||||
#
|
||||
extra-y := head.o init_task.o vmlinux.lds
|
||||
|
||||
obj-y := process.o semaphore.o signal.o entry.o fpu.o traps.o irq.o \
|
||||
ptrace.o setup.o time.o sys_mn10300.o io.o kthread.o \
|
||||
switch_to.o mn10300_ksyms.o kernel_execve.o
|
||||
|
||||
obj-$(CONFIG_MN10300_WD_TIMER) += mn10300-watchdog.o mn10300-watchdog-low.o
|
||||
|
||||
obj-$(CONFIG_FPU) += fpu-low.o
|
||||
|
||||
obj-$(CONFIG_MN10300_TTYSM) += mn10300-serial.o mn10300-serial-low.o \
|
||||
mn10300-debug.o
|
||||
obj-$(CONFIG_GDBSTUB) += gdb-stub.o gdb-low.o
|
||||
obj-$(CONFIG_GDBSTUB_ON_TTYSx) += gdb-io-serial.o gdb-io-serial-low.o
|
||||
obj-$(CONFIG_GDBSTUB_ON_TTYSMx) += gdb-io-ttysm.o gdb-io-ttysm-low.o
|
||||
|
||||
ifneq ($(CONFIG_MN10300_CACHE_DISABLED),y)
|
||||
obj-$(CONFIG_GDBSTUB) += gdb-cache.o
|
||||
endif
|
||||
|
||||
obj-$(CONFIG_MN10300_RTC) += rtc.o
|
||||
obj-$(CONFIG_PROFILE) += profile.o profile-low.o
|
||||
obj-$(CONFIG_MODULES) += module.o
|
||||
obj-$(CONFIG_KPROBES) += kprobes.o
|
||||
108
arch/mn10300/kernel/asm-offsets.c
Normal file
108
arch/mn10300/kernel/asm-offsets.c
Normal file
@@ -0,0 +1,108 @@
|
||||
/*
|
||||
* 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 <asm/ucontext.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/thread_info.h>
|
||||
#include <asm/ptrace.h>
|
||||
#include "sigframe.h"
|
||||
#include "mn10300-serial.h"
|
||||
|
||||
#define DEFINE(sym, val) \
|
||||
asm volatile("\n->" #sym " %0 " #val : : "i" (val))
|
||||
|
||||
#define BLANK() asm volatile("\n->")
|
||||
|
||||
#define OFFSET(sym, str, mem) \
|
||||
DEFINE(sym, offsetof(struct str, mem));
|
||||
|
||||
void foo(void)
|
||||
{
|
||||
OFFSET(SIGCONTEXT_d0, sigcontext, d0);
|
||||
OFFSET(SIGCONTEXT_d1, sigcontext, d1);
|
||||
BLANK();
|
||||
|
||||
OFFSET(TI_task, thread_info, task);
|
||||
OFFSET(TI_exec_domain, thread_info, exec_domain);
|
||||
OFFSET(TI_flags, thread_info, flags);
|
||||
OFFSET(TI_cpu, thread_info, cpu);
|
||||
OFFSET(TI_preempt_count, thread_info, preempt_count);
|
||||
OFFSET(TI_addr_limit, thread_info, addr_limit);
|
||||
OFFSET(TI_restart_block, thread_info, restart_block);
|
||||
BLANK();
|
||||
|
||||
OFFSET(REG_D0, pt_regs, d0);
|
||||
OFFSET(REG_D1, pt_regs, d1);
|
||||
OFFSET(REG_D2, pt_regs, d2);
|
||||
OFFSET(REG_D3, pt_regs, d3);
|
||||
OFFSET(REG_A0, pt_regs, a0);
|
||||
OFFSET(REG_A1, pt_regs, a1);
|
||||
OFFSET(REG_A2, pt_regs, a2);
|
||||
OFFSET(REG_A3, pt_regs, a3);
|
||||
OFFSET(REG_E0, pt_regs, e0);
|
||||
OFFSET(REG_E1, pt_regs, e1);
|
||||
OFFSET(REG_E2, pt_regs, e2);
|
||||
OFFSET(REG_E3, pt_regs, e3);
|
||||
OFFSET(REG_E4, pt_regs, e4);
|
||||
OFFSET(REG_E5, pt_regs, e5);
|
||||
OFFSET(REG_E6, pt_regs, e6);
|
||||
OFFSET(REG_E7, pt_regs, e7);
|
||||
OFFSET(REG_SP, pt_regs, sp);
|
||||
OFFSET(REG_EPSW, pt_regs, epsw);
|
||||
OFFSET(REG_PC, pt_regs, pc);
|
||||
OFFSET(REG_LAR, pt_regs, lar);
|
||||
OFFSET(REG_LIR, pt_regs, lir);
|
||||
OFFSET(REG_MDR, pt_regs, mdr);
|
||||
OFFSET(REG_MCVF, pt_regs, mcvf);
|
||||
OFFSET(REG_MCRL, pt_regs, mcrl);
|
||||
OFFSET(REG_MCRH, pt_regs, mcrh);
|
||||
OFFSET(REG_MDRQ, pt_regs, mdrq);
|
||||
OFFSET(REG_ORIG_D0, pt_regs, orig_d0);
|
||||
OFFSET(REG_NEXT, pt_regs, next);
|
||||
DEFINE(REG__END, sizeof(struct pt_regs));
|
||||
BLANK();
|
||||
|
||||
OFFSET(THREAD_UREGS, thread_struct, uregs);
|
||||
OFFSET(THREAD_PC, thread_struct, pc);
|
||||
OFFSET(THREAD_SP, thread_struct, sp);
|
||||
OFFSET(THREAD_A3, thread_struct, a3);
|
||||
OFFSET(THREAD_USP, thread_struct, usp);
|
||||
OFFSET(THREAD_FRAME, thread_struct, __frame);
|
||||
BLANK();
|
||||
|
||||
DEFINE(CLONE_VM_asm, CLONE_VM);
|
||||
DEFINE(CLONE_FS_asm, CLONE_FS);
|
||||
DEFINE(CLONE_FILES_asm, CLONE_FILES);
|
||||
DEFINE(CLONE_SIGHAND_asm, CLONE_SIGHAND);
|
||||
DEFINE(CLONE_UNTRACED_asm, CLONE_UNTRACED);
|
||||
DEFINE(SIGCHLD_asm, SIGCHLD);
|
||||
BLANK();
|
||||
|
||||
OFFSET(EXEC_DOMAIN_handler, exec_domain, handler);
|
||||
OFFSET(RT_SIGFRAME_sigcontext, rt_sigframe, uc.uc_mcontext);
|
||||
|
||||
DEFINE(PAGE_SIZE_asm, PAGE_SIZE);
|
||||
|
||||
OFFSET(__rx_buffer, mn10300_serial_port, rx_buffer);
|
||||
OFFSET(__rx_inp, mn10300_serial_port, rx_inp);
|
||||
OFFSET(__rx_outp, mn10300_serial_port, rx_outp);
|
||||
OFFSET(__tx_info_buffer, mn10300_serial_port, uart.info);
|
||||
OFFSET(__tx_xchar, mn10300_serial_port, tx_xchar);
|
||||
OFFSET(__tx_break, mn10300_serial_port, tx_break);
|
||||
OFFSET(__intr_flags, mn10300_serial_port, intr_flags);
|
||||
OFFSET(__rx_icr, mn10300_serial_port, rx_icr);
|
||||
OFFSET(__tx_icr, mn10300_serial_port, tx_icr);
|
||||
OFFSET(__tm_icr, mn10300_serial_port, _tmicr);
|
||||
OFFSET(__iobase, mn10300_serial_port, _iobase);
|
||||
|
||||
DEFINE(__UART_XMIT_SIZE, UART_XMIT_SIZE);
|
||||
OFFSET(__xmit_buffer, uart_info, xmit.buf);
|
||||
OFFSET(__xmit_head, uart_info, xmit.head);
|
||||
OFFSET(__xmit_tail, uart_info, xmit.tail);
|
||||
}
|
||||
721
arch/mn10300/kernel/entry.S
Normal file
721
arch/mn10300/kernel/entry.S
Normal file
File diff suppressed because it is too large
Load Diff
197
arch/mn10300/kernel/fpu-low.S
Normal file
197
arch/mn10300/kernel/fpu-low.S
Normal file
@@ -0,0 +1,197 @@
|
||||
/* MN10300 Low level FPU management operations
|
||||
*
|
||||
* Copyright (C) 2007 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 Licence
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the Licence, or (at your option) any later version.
|
||||
*/
|
||||
#include <asm/cpu-regs.h>
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# void fpu_init_state(void)
|
||||
# - initialise the FPU
|
||||
#
|
||||
###############################################################################
|
||||
.globl fpu_init_state
|
||||
.type fpu_init_state,@function
|
||||
fpu_init_state:
|
||||
mov epsw,d0
|
||||
or EPSW_FE,epsw
|
||||
|
||||
#ifdef CONFIG_MN10300_PROC_MN103E010
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
#endif
|
||||
fmov 0,fs0
|
||||
fmov fs0,fs1
|
||||
fmov fs0,fs2
|
||||
fmov fs0,fs3
|
||||
fmov fs0,fs4
|
||||
fmov fs0,fs5
|
||||
fmov fs0,fs6
|
||||
fmov fs0,fs7
|
||||
fmov fs0,fs8
|
||||
fmov fs0,fs9
|
||||
fmov fs0,fs10
|
||||
fmov fs0,fs11
|
||||
fmov fs0,fs12
|
||||
fmov fs0,fs13
|
||||
fmov fs0,fs14
|
||||
fmov fs0,fs15
|
||||
fmov fs0,fs16
|
||||
fmov fs0,fs17
|
||||
fmov fs0,fs18
|
||||
fmov fs0,fs19
|
||||
fmov fs0,fs20
|
||||
fmov fs0,fs21
|
||||
fmov fs0,fs22
|
||||
fmov fs0,fs23
|
||||
fmov fs0,fs24
|
||||
fmov fs0,fs25
|
||||
fmov fs0,fs26
|
||||
fmov fs0,fs27
|
||||
fmov fs0,fs28
|
||||
fmov fs0,fs29
|
||||
fmov fs0,fs30
|
||||
fmov fs0,fs31
|
||||
fmov FPCR_INIT,fpcr
|
||||
|
||||
#ifdef CONFIG_MN10300_PROC_MN103E010
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
#endif
|
||||
mov d0,epsw
|
||||
ret [],0
|
||||
|
||||
.size fpu_init_state,.-fpu_init_state
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# void fpu_save(struct fpu_state_struct *)
|
||||
# - save the fpu state
|
||||
# - note that an FPU Operational exception might occur during this process
|
||||
#
|
||||
###############################################################################
|
||||
.globl fpu_save
|
||||
.type fpu_save,@function
|
||||
fpu_save:
|
||||
mov epsw,d1
|
||||
or EPSW_FE,epsw /* enable the FPU so we can access it */
|
||||
|
||||
#ifdef CONFIG_MN10300_PROC_MN103E010
|
||||
nop
|
||||
nop
|
||||
#endif
|
||||
mov d0,a0
|
||||
fmov fs0,(a0+)
|
||||
fmov fs1,(a0+)
|
||||
fmov fs2,(a0+)
|
||||
fmov fs3,(a0+)
|
||||
fmov fs4,(a0+)
|
||||
fmov fs5,(a0+)
|
||||
fmov fs6,(a0+)
|
||||
fmov fs7,(a0+)
|
||||
fmov fs8,(a0+)
|
||||
fmov fs9,(a0+)
|
||||
fmov fs10,(a0+)
|
||||
fmov fs11,(a0+)
|
||||
fmov fs12,(a0+)
|
||||
fmov fs13,(a0+)
|
||||
fmov fs14,(a0+)
|
||||
fmov fs15,(a0+)
|
||||
fmov fs16,(a0+)
|
||||
fmov fs17,(a0+)
|
||||
fmov fs18,(a0+)
|
||||
fmov fs19,(a0+)
|
||||
fmov fs20,(a0+)
|
||||
fmov fs21,(a0+)
|
||||
fmov fs22,(a0+)
|
||||
fmov fs23,(a0+)
|
||||
fmov fs24,(a0+)
|
||||
fmov fs25,(a0+)
|
||||
fmov fs26,(a0+)
|
||||
fmov fs27,(a0+)
|
||||
fmov fs28,(a0+)
|
||||
fmov fs29,(a0+)
|
||||
fmov fs30,(a0+)
|
||||
fmov fs31,(a0+)
|
||||
fmov fpcr,d0
|
||||
mov d0,(a0)
|
||||
#ifdef CONFIG_MN10300_PROC_MN103E010
|
||||
nop
|
||||
nop
|
||||
#endif
|
||||
|
||||
mov d1,epsw
|
||||
ret [],0
|
||||
|
||||
.size fpu_save,.-fpu_save
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# void fpu_restore(struct fpu_state_struct *)
|
||||
# - restore the fpu state
|
||||
# - note that an FPU Operational exception might occur during this process
|
||||
#
|
||||
###############################################################################
|
||||
.globl fpu_restore
|
||||
.type fpu_restore,@function
|
||||
fpu_restore:
|
||||
mov epsw,d1
|
||||
or EPSW_FE,epsw /* enable the FPU so we can access it */
|
||||
|
||||
#ifdef CONFIG_MN10300_PROC_MN103E010
|
||||
nop
|
||||
nop
|
||||
#endif
|
||||
mov d0,a0
|
||||
fmov (a0+),fs0
|
||||
fmov (a0+),fs1
|
||||
fmov (a0+),fs2
|
||||
fmov (a0+),fs3
|
||||
fmov (a0+),fs4
|
||||
fmov (a0+),fs5
|
||||
fmov (a0+),fs6
|
||||
fmov (a0+),fs7
|
||||
fmov (a0+),fs8
|
||||
fmov (a0+),fs9
|
||||
fmov (a0+),fs10
|
||||
fmov (a0+),fs11
|
||||
fmov (a0+),fs12
|
||||
fmov (a0+),fs13
|
||||
fmov (a0+),fs14
|
||||
fmov (a0+),fs15
|
||||
fmov (a0+),fs16
|
||||
fmov (a0+),fs17
|
||||
fmov (a0+),fs18
|
||||
fmov (a0+),fs19
|
||||
fmov (a0+),fs20
|
||||
fmov (a0+),fs21
|
||||
fmov (a0+),fs22
|
||||
fmov (a0+),fs23
|
||||
fmov (a0+),fs24
|
||||
fmov (a0+),fs25
|
||||
fmov (a0+),fs26
|
||||
fmov (a0+),fs27
|
||||
fmov (a0+),fs28
|
||||
fmov (a0+),fs29
|
||||
fmov (a0+),fs30
|
||||
fmov (a0+),fs31
|
||||
mov (a0),d0
|
||||
fmov d0,fpcr
|
||||
#ifdef CONFIG_MN10300_PROC_MN103E010
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
#endif
|
||||
|
||||
mov d1,epsw
|
||||
ret [],0
|
||||
|
||||
.size fpu_restore,.-fpu_restore
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user