Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 181229
b: refs/heads/master
c: 94ea5e4
h: refs/heads/master
i:
  181227: 7d8c674
v: v3
  • Loading branch information
Paul Mundt committed Feb 23, 2010
1 parent bb9d310 commit e1ca4a1
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 3 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 7c1b2c6890a1a033dde4f6991c0a1fcd69cf58ce
refs/heads/master: 94ea5e449ae834af058ef005d16a8ad44fcf13d6
12 changes: 12 additions & 0 deletions trunk/arch/sh/include/asm/processor.h
Original file line number Diff line number Diff line change
Expand Up @@ -107,13 +107,25 @@ extern unsigned int xstate_size;
extern void free_thread_xstate(struct task_struct *);
extern struct kmem_cache *task_xstate_cachep;

/* arch/sh/mm/alignment.c */
extern int get_unalign_ctl(struct task_struct *, unsigned long addr);
extern int set_unalign_ctl(struct task_struct *, unsigned int val);

#define GET_UNALIGN_CTL(tsk, addr) get_unalign_ctl((tsk), (addr))
#define SET_UNALIGN_CTL(tsk, val) set_unalign_ctl((tsk), (val))

/* arch/sh/mm/init.c */
extern unsigned int mem_init_done;

/* arch/sh/kernel/setup.c */
const char *get_cpu_subtype(struct sh_cpuinfo *c);
extern const struct seq_operations cpuinfo_op;

/* thread_struct flags */
#define SH_THREAD_UAC_NOPRINT (1 << 0)
#define SH_THREAD_UAC_SIGBUS (1 << 1)
#define SH_THREAD_UAC_MASK (SH_THREAD_UAC_NOPRINT | SH_THREAD_UAC_SIGBUS)

/* processor boot mode configuration */
#define MODE_PIN0 (1 << 0)
#define MODE_PIN1 (1 << 1)
Expand Down
6 changes: 5 additions & 1 deletion trunk/arch/sh/include/asm/processor_32.h
Original file line number Diff line number Diff line change
Expand Up @@ -101,8 +101,11 @@ struct thread_struct {
unsigned long sp;
unsigned long pc;

/* Various thread flags, see SH_THREAD_xxx */
unsigned long flags;

/* Save middle states of ptrace breakpoints */
struct perf_event *ptrace_bps[HBP_NUM];
struct perf_event *ptrace_bps[HBP_NUM];

#ifdef CONFIG_SH_DSP
/* Dsp status information */
Expand All @@ -115,6 +118,7 @@ struct thread_struct {

#define INIT_THREAD { \
.sp = sizeof(init_stack) + (long) &init_stack, \
.flags = 0, \
}

/* Forward declaration, a strange C thing */
Expand Down
5 changes: 5 additions & 0 deletions trunk/arch/sh/include/asm/processor_64.h
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,10 @@ union thread_xstate {
struct thread_struct {
unsigned long sp;
unsigned long pc;

/* Various thread flags, see SH_THREAD_xxx */
unsigned long flags;

/* This stores the address of the pt_regs built during a context
switch, or of the register save area built for a kernel mode
exception. It is used for backtracing the stack of a sleeping task
Expand Down Expand Up @@ -138,6 +142,7 @@ struct thread_struct {
.trap_no = 0, \
.error_code = 0, \
.address = 0, \
.flags = 0, \
}

/*
Expand Down
30 changes: 29 additions & 1 deletion trunk/arch/sh/mm/alignment.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#include <linux/proc_fs.h>
#include <linux/uaccess.h>
#include <asm/alignment.h>
#include <asm/processor.h>

static unsigned long se_user;
static unsigned long se_sys;
Expand Down Expand Up @@ -59,9 +60,36 @@ void inc_unaligned_kernel_access(void)
se_sys++;
}

/*
* This defaults to the global policy which can be set from the command
* line, while processes can overload their preferences via prctl().
*/
unsigned int unaligned_user_action(void)
{
return se_usermode;
unsigned int action = se_usermode;

if (current->thread.flags & SH_THREAD_UAC_SIGBUS) {
action &= ~UM_FIXUP;
action |= UM_SIGNAL;
}

if (current->thread.flags & SH_THREAD_UAC_NOPRINT)
action &= ~UM_WARN;

return action;
}

int get_unalign_ctl(struct task_struct *tsk, unsigned long addr)
{
return put_user(tsk->thread.flags & SH_THREAD_UAC_MASK,
(unsigned int __user *)addr);
}

int set_unalign_ctl(struct task_struct *tsk, unsigned int val)
{
tsk->thread.flags = (tsk->thread.flags & ~SH_THREAD_UAC_MASK) |
(val & SH_THREAD_UAC_MASK);
return 0;
}

void unaligned_fixups_notify(struct task_struct *tsk, insn_size_t insn,
Expand Down

0 comments on commit e1ca4a1

Please sign in to comment.