forked from Minki/linux
[PATCH] CRIS update: misc patches
* Start threads with IRQs enabled. * Move symbol exports to arch specific file. * Prepare for real command line in the future. * Handle csum for partition that crosses flash boundary. * Set utsname. Signed-off-by: Mikael Starvik <starvik@axis.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
2e0cea1dec
commit
7cf32cad15
@ -13,7 +13,8 @@
|
||||
#include <asm/arch/sv_addr_ag.h>
|
||||
|
||||
#define RAM_INIT_MAGIC 0x56902387
|
||||
|
||||
#define COMMAND_LINE_MAGIC 0x87109563
|
||||
|
||||
;; Exported symbols
|
||||
|
||||
.globl _input_data
|
||||
@ -88,6 +89,12 @@ basse: move.d pc, r5
|
||||
cmp.d r2, r1
|
||||
bcs 1b
|
||||
nop
|
||||
|
||||
;; Save command line magic and address.
|
||||
move.d _cmd_line_magic, $r12
|
||||
move.d $r10, [$r12]
|
||||
move.d _cmd_line_addr, $r12
|
||||
move.d $r11, [$r12]
|
||||
|
||||
;; Do the decompression and save compressed size in _inptr
|
||||
|
||||
@ -98,7 +105,13 @@ basse: move.d pc, r5
|
||||
|
||||
move.d [_input_data], r9 ; flash address of compressed kernel
|
||||
add.d [_inptr], r9 ; size of compressed kernel
|
||||
|
||||
|
||||
;; Restore command line magic and address.
|
||||
move.d _cmd_line_magic, $r10
|
||||
move.d [$r10], $r10
|
||||
move.d _cmd_line_addr, $r11
|
||||
move.d [$r11], $r11
|
||||
|
||||
;; Enter the decompressed kernel
|
||||
move.d RAM_INIT_MAGIC, r8 ; Tell kernel that DRAM is initialized
|
||||
jump 0x40004000 ; kernel is linked to this address
|
||||
@ -107,5 +120,8 @@ basse: move.d pc, r5
|
||||
|
||||
_input_data:
|
||||
.dword 0 ; used by the decompressor
|
||||
|
||||
_cmd_line_magic:
|
||||
.dword 0
|
||||
_cmd_line_addr:
|
||||
.dword 0
|
||||
#include "../../lib/hw_settings.S"
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $Id: head.S,v 1.6 2003/04/09 08:12:43 pkj Exp $
|
||||
/* $Id: head.S,v 1.7 2005/03/07 12:11:06 starvik Exp $
|
||||
*
|
||||
* Rescue code, made to reside at the beginning of the
|
||||
* flash-memory. when it starts, it checks a partition
|
||||
@ -121,12 +121,13 @@
|
||||
;; 0x80000000 if loaded in flash (as it should be)
|
||||
;; since etrax actually starts at address 2 when booting from flash, we
|
||||
;; put a nop (2 bytes) here first so we dont accidentally skip the di
|
||||
|
||||
|
||||
nop
|
||||
di
|
||||
|
||||
jump in_cache ; enter cached area instead
|
||||
in_cache:
|
||||
in_cache:
|
||||
|
||||
|
||||
;; first put a jump test to give a possibility of upgrading the rescue code
|
||||
;; without erasing/reflashing the sector. we put a longword of -1 here and if
|
||||
@ -325,9 +326,29 @@ flash_ok:
|
||||
;; result will be in r0
|
||||
checksum:
|
||||
moveq 0, $r0
|
||||
1: addu.b [$r1+], $r0
|
||||
subq 1, $r2
|
||||
bne 1b
|
||||
moveq CONFIG_ETRAX_FLASH1_SIZE, $r6
|
||||
|
||||
;; If the first physical flash memory is exceeded wrap to the second one.
|
||||
btstq 26, $r1 ; Are we addressing first flash?
|
||||
bpl 1f
|
||||
nop
|
||||
clear.d $r6
|
||||
|
||||
1: test.d $r6 ; 0 = no wrapping
|
||||
beq 2f
|
||||
nop
|
||||
lslq 20, $r6 ; Convert MB to bytes
|
||||
sub.d $r1, $r6
|
||||
|
||||
2: addu.b [$r1+], $r0
|
||||
subq 1, $r6 ; Flash memory left
|
||||
beq 3f
|
||||
subq 1, $r2 ; Length left
|
||||
bne 2b
|
||||
nop
|
||||
ret
|
||||
nop
|
||||
|
||||
3: move.d MEM_CSE1_START, $r1 ; wrap to second flash
|
||||
ba 2b
|
||||
nop
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $Id: entry.S,v 1.23 2004/10/19 13:07:37 starvik Exp $
|
||||
/* $Id: entry.S,v 1.28 2005/06/20 05:06:30 starvik Exp $
|
||||
*
|
||||
* linux/arch/cris/entry.S
|
||||
*
|
||||
@ -7,6 +7,22 @@
|
||||
* Authors: Bjorn Wesen (bjornw@axis.com)
|
||||
*
|
||||
* $Log: entry.S,v $
|
||||
* Revision 1.28 2005/06/20 05:06:30 starvik
|
||||
* Remove unnecessary diff to kernel.org tree
|
||||
*
|
||||
* Revision 1.27 2005/03/04 08:16:16 starvik
|
||||
* Merge of Linux 2.6.11.
|
||||
*
|
||||
* Revision 1.26 2005/01/11 13:49:47 starvik
|
||||
* Added NMI handler.
|
||||
*
|
||||
* Revision 1.25 2004/12/27 11:18:32 starvik
|
||||
* Merge of Linux 2.6.10 (not functional yet).
|
||||
*
|
||||
* Revision 1.24 2004/12/22 10:41:23 starvik
|
||||
* Updates to make v10 compile with the latest SMP aware generic code (even
|
||||
* though v10 will never have SMP).
|
||||
*
|
||||
* Revision 1.23 2004/10/19 13:07:37 starvik
|
||||
* Merge of Linux 2.6.9
|
||||
*
|
||||
@ -279,6 +295,7 @@
|
||||
#ifdef CONFIG_PREEMPT
|
||||
; Check if preemptive kernel scheduling should be done
|
||||
_resume_kernel:
|
||||
di
|
||||
; Load current task struct
|
||||
movs.w -8192, $r0 ; THREAD_SIZE = 8192
|
||||
and.d $sp, $r0
|
||||
@ -291,12 +308,7 @@ _need_resched:
|
||||
bpl _Rexit
|
||||
nop
|
||||
; Ok, lets's do some preemptive kernel scheduling
|
||||
move.d PREEMPT_ACTIVE, $r10
|
||||
move.d $r10, [$r0+TI_preempt_count] ; Mark as active
|
||||
ei
|
||||
jsr schedule
|
||||
clear.d [$r0+TI_preempt_count] ; Mark as inactive
|
||||
di
|
||||
jsr preempt_schedule_irq
|
||||
; Load new task struct
|
||||
movs.w -8192, $r0 ; THREAD_SIZE = 8192
|
||||
and.d $sp, $r0
|
||||
@ -590,15 +602,15 @@ mmu_bus_fault:
|
||||
move.d $r0, [$sp+16]
|
||||
1: btstq 12, $r1 ; Refill?
|
||||
bpl 2f
|
||||
lsrq PMD_SHIFT, $r1 ; Get PMD index into PGD (bit 24-31)
|
||||
move.d [current_pgd], $r0 ; PGD for the current process
|
||||
lsrq 24, $r1 ; Get PGD index (bit 24-31)
|
||||
move.d [per_cpu__current_pgd], $r0 ; PGD for the current process
|
||||
move.d [$r0+$r1.d], $r0 ; Get PMD
|
||||
beq 2f
|
||||
nop
|
||||
and.w PAGE_MASK, $r0 ; Remove PMD flags
|
||||
move.d [R_MMU_CAUSE], $r1
|
||||
lsrq PAGE_SHIFT, $r1
|
||||
and.d 0x7ff, $r1 ; Get PTE index into PMD (bit 13-24)
|
||||
and.d 0x7ff, $r1 ; Get PTE index into PGD (bit 13-23)
|
||||
move.d [$r0+$r1.d], $r1 ; Get PTE
|
||||
beq 2f
|
||||
nop
|
||||
@ -656,11 +668,6 @@ hwbreakpoint:
|
||||
nop
|
||||
|
||||
IRQ1_interrupt:
|
||||
|
||||
#if defined(CONFIG_ETRAX_WATCHDOG) && !defined(CONFIG_SVINTO_SIM)
|
||||
;; If we receive a watchdog interrupt while it is not expected, then set
|
||||
;; up a canonical frame and dump register contents before dying.
|
||||
|
||||
;; this prologue MUST match the one in irq.h and the struct in ptregs.h!!!
|
||||
move $brp,[$sp=$sp-16]; instruction pointer and room for a fake SBFS frame
|
||||
push $srp
|
||||
@ -672,9 +679,16 @@ IRQ1_interrupt:
|
||||
push $r10 ; push orig_r10
|
||||
clear.d [$sp=$sp-4] ; frametype == 0, normal frame
|
||||
|
||||
;; We don't check that we actually were bit by the watchdog as opposed to
|
||||
;; an external NMI, since there is currently no handler for external NMI.
|
||||
|
||||
move.d [R_IRQ_MASK0_RD], $r1 ; External NMI or watchdog?
|
||||
and.d 0x80000000, $r1
|
||||
beq wdog
|
||||
move.d $sp, $r10
|
||||
jsr handle_nmi
|
||||
setf m ; Enable NMI again
|
||||
retb ; Return from NMI
|
||||
nop
|
||||
wdog:
|
||||
#if defined(CONFIG_ETRAX_WATCHDOG) && !defined(CONFIG_SVINTO_SIM)
|
||||
;; Check if we're waiting for reset to happen, as signalled by
|
||||
;; hard_reset_now setting cause_of_death to a magic value. If so, just
|
||||
;; get stuck until reset happens.
|
||||
@ -1118,6 +1132,10 @@ sys_call_table:
|
||||
.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
|
||||
|
||||
/*
|
||||
* NOTE!! This doesn't have to be exact - we just have
|
||||
|
@ -18,6 +18,10 @@
|
||||
*! Jul 21 1999 Bjorn Wesen eLinux port
|
||||
*!
|
||||
*! $Log: kgdb.c,v $
|
||||
*! Revision 1.6 2005/01/14 10:12:17 starvik
|
||||
*! KGDB on separate port.
|
||||
*! Console fixes from 2.4.
|
||||
*!
|
||||
*! Revision 1.5 2004/10/07 13:59:08 starvik
|
||||
*! Corrected call to set_int_vector
|
||||
*!
|
||||
@ -71,7 +75,7 @@
|
||||
*!
|
||||
*!---------------------------------------------------------------------------
|
||||
*!
|
||||
*! $Id: kgdb.c,v 1.5 2004/10/07 13:59:08 starvik Exp $
|
||||
*! $Id: kgdb.c,v 1.6 2005/01/14 10:12:17 starvik Exp $
|
||||
*!
|
||||
*! (C) Copyright 1999, Axis Communications AB, LUND, SWEDEN
|
||||
*!
|
||||
@ -225,6 +229,7 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/linkage.h>
|
||||
#include <linux/reboot.h>
|
||||
|
||||
#include <asm/setup.h>
|
||||
#include <asm/ptrace.h>
|
||||
@ -1344,12 +1349,11 @@ handle_exception (int sigval)
|
||||
}
|
||||
}
|
||||
|
||||
/* The jump is to the address 0x00000002. Performs a complete re-start
|
||||
from scratch. */
|
||||
/* Performs a complete re-start from scratch. */
|
||||
static void
|
||||
kill_restart ()
|
||||
{
|
||||
__asm__ volatile ("jump 2");
|
||||
machine_restart("");
|
||||
}
|
||||
|
||||
/********************************** Breakpoint *******************************/
|
||||
@ -1506,6 +1510,11 @@ kgdb_handle_serial:
|
||||
bne goback
|
||||
nop
|
||||
|
||||
move.d [reg+0x5E], $r10 ; Get DCCR
|
||||
btstq 8, $r10 ; Test the U-flag.
|
||||
bmi goback
|
||||
nop
|
||||
|
||||
;;
|
||||
;; Handle the communication
|
||||
;;
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $Id: process.c,v 1.9 2004/10/19 13:07:37 starvik Exp $
|
||||
/* $Id: process.c,v 1.12 2004/12/27 11:18:32 starvik Exp $
|
||||
*
|
||||
* linux/arch/cris/kernel/process.c
|
||||
*
|
||||
@ -101,6 +101,7 @@ int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
|
||||
regs.r11 = (unsigned long)fn;
|
||||
regs.r12 = (unsigned long)arg;
|
||||
regs.irp = (unsigned long)kernel_thread_helper;
|
||||
regs.dccr = 1 << I_DCCR_BITNR;
|
||||
|
||||
/* Ok, create the new process.. */
|
||||
return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, 0, NULL, NULL);
|
||||
|
@ -27,13 +27,13 @@ extern void __Udiv(void);
|
||||
extern void __Umod(void);
|
||||
extern void __Div(void);
|
||||
extern void __Mod(void);
|
||||
extern void __ashldi3(void);
|
||||
extern void __ashrdi3(void);
|
||||
extern void iounmap(void *addr);
|
||||
extern void __lshrdi3(void);
|
||||
extern void iounmap(volatile void * __iomem);
|
||||
|
||||
/* Platform dependent support */
|
||||
EXPORT_SYMBOL(dump_thread);
|
||||
EXPORT_SYMBOL(enable_irq);
|
||||
EXPORT_SYMBOL(disable_irq);
|
||||
EXPORT_SYMBOL(kernel_thread);
|
||||
EXPORT_SYMBOL(get_cmos_time);
|
||||
EXPORT_SYMBOL(loops_per_usec);
|
||||
@ -57,7 +57,9 @@ EXPORT_SYMBOL(__Udiv);
|
||||
EXPORT_SYMBOL(__Umod);
|
||||
EXPORT_SYMBOL(__Div);
|
||||
EXPORT_SYMBOL(__Mod);
|
||||
EXPORT_SYMBOL(__ashldi3);
|
||||
EXPORT_SYMBOL(__ashrdi3);
|
||||
EXPORT_SYMBOL(__lshrdi3);
|
||||
|
||||
/* Memory functions */
|
||||
EXPORT_SYMBOL(__ioremap);
|
||||
@ -69,23 +71,10 @@ EXPORT_SYMBOL(__down);
|
||||
EXPORT_SYMBOL(__down_interruptible);
|
||||
EXPORT_SYMBOL(__down_trylock);
|
||||
|
||||
/* Export shadow registers for the CPU I/O pins */
|
||||
EXPORT_SYMBOL(genconfig_shadow);
|
||||
EXPORT_SYMBOL(port_pa_data_shadow);
|
||||
EXPORT_SYMBOL(port_pa_dir_shadow);
|
||||
EXPORT_SYMBOL(port_pb_data_shadow);
|
||||
EXPORT_SYMBOL(port_pb_dir_shadow);
|
||||
EXPORT_SYMBOL(port_pb_config_shadow);
|
||||
EXPORT_SYMBOL(port_g_data_shadow);
|
||||
|
||||
/* Userspace access functions */
|
||||
EXPORT_SYMBOL(__copy_user_zeroing);
|
||||
EXPORT_SYMBOL(__copy_user);
|
||||
|
||||
/* Cache flush functions */
|
||||
EXPORT_SYMBOL(flush_etrax_cache);
|
||||
EXPORT_SYMBOL(prepare_rx_descriptor);
|
||||
|
||||
#undef memcpy
|
||||
#undef memset
|
||||
extern void * memset(void *, int, __kernel_size_t);
|
||||
|
@ -17,6 +17,7 @@
|
||||
#include <asm/pgtable.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/utsname.h>
|
||||
|
||||
#include <asm/setup.h>
|
||||
|
||||
@ -29,7 +30,7 @@ struct screen_info screen_info;
|
||||
extern int root_mountflags;
|
||||
extern char _etext, _edata, _end;
|
||||
|
||||
static char command_line[COMMAND_LINE_SIZE] = { 0, };
|
||||
char cris_command_line[COMMAND_LINE_SIZE] = { 0, };
|
||||
|
||||
extern const unsigned long text_start, edata; /* set by the linker script */
|
||||
extern unsigned long dram_start, dram_end;
|
||||
@ -147,34 +148,35 @@ setup_arch(char **cmdline_p)
|
||||
|
||||
paging_init();
|
||||
|
||||
/* We don't use a command line yet, so just re-initialize it without
|
||||
saving anything that might be there. */
|
||||
|
||||
*cmdline_p = command_line;
|
||||
*cmdline_p = cris_command_line;
|
||||
|
||||
#ifdef CONFIG_ETRAX_CMDLINE
|
||||
strlcpy(command_line, CONFIG_ETRAX_CMDLINE, COMMAND_LINE_SIZE);
|
||||
command_line[COMMAND_LINE_SIZE - 1] = '\0';
|
||||
if (!strcmp(cris_command_line, "")) {
|
||||
strlcpy(cris_command_line, CONFIG_ETRAX_CMDLINE, COMMAND_LINE_SIZE);
|
||||
cris_command_line[COMMAND_LINE_SIZE - 1] = '\0';
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Save command line for future references. */
|
||||
memcpy(saved_command_line, command_line, COMMAND_LINE_SIZE);
|
||||
memcpy(saved_command_line, cris_command_line, COMMAND_LINE_SIZE);
|
||||
saved_command_line[COMMAND_LINE_SIZE - 1] = '\0';
|
||||
#endif
|
||||
|
||||
/* give credit for the CRIS port */
|
||||
show_etrax_copyright();
|
||||
|
||||
/* Setup utsname */
|
||||
strcpy(system_utsname.machine, cris_machine_name);
|
||||
}
|
||||
|
||||
static void *c_start(struct seq_file *m, loff_t *pos)
|
||||
{
|
||||
/* We only got one CPU... */
|
||||
return *pos < 1 ? (void *)1 : NULL;
|
||||
return *pos < NR_CPUS ? (void *)(int)(*pos + 1): NULL;
|
||||
}
|
||||
|
||||
static void *c_next(struct seq_file *m, void *v, loff_t *pos)
|
||||
{
|
||||
++*pos;
|
||||
return NULL;
|
||||
return c_start(m, pos);
|
||||
}
|
||||
|
||||
static void c_stop(struct seq_file *m, void *v)
|
||||
|
@ -11,6 +11,8 @@ extern inline unsigned long rdvr(void) {
|
||||
return vr;
|
||||
}
|
||||
|
||||
#define cris_machine_name "cris"
|
||||
|
||||
/* read/write the user-mode stackpointer */
|
||||
|
||||
extern inline unsigned long rdusp(void) {
|
||||
|
@ -40,4 +40,7 @@ struct partitiontable_entry {
|
||||
#define PARTITION_TYPE_KERNEL 0x0002
|
||||
#define PARTITION_TYPE_JFFS 0x0003
|
||||
|
||||
/* The master mtd for the entire flash. */
|
||||
extern struct mtd_info* axisflash_mtd;
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user