blob: 8c146b2a1e00aea210e9b5166b3b6b4753fc8406 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * Copyright 2003 PathScale, Inc.
3 *
4 * Licensed under the GPL
5 */
6
7#define __FRAME_OFFSETS
8#include "asm/ptrace.h"
9#include "linux/sched.h"
10#include "linux/errno.h"
11#include "asm/elf.h"
12
13/* XXX x86_64 */
14unsigned long not_ss;
15unsigned long not_ds;
16unsigned long not_es;
17
18#define SC_SS(r) (not_ss)
19#define SC_DS(r) (not_ds)
20#define SC_ES(r) (not_es)
21
22/* determines which flags the user has access to. */
23/* 1 = access 0 = no access */
24#define FLAG_MASK 0x44dd5UL
25
26int putreg(struct task_struct *child, int regno, unsigned long value)
27{
28 unsigned long tmp;
29
30#ifdef TIF_IA32
31 /* Some code in the 64bit emulation may not be 64bit clean.
32 Don't take any chances. */
33 if (test_tsk_thread_flag(child, TIF_IA32))
34 value &= 0xffffffff;
35#endif
36 switch (regno){
37 case FS:
38 case GS:
39 case DS:
40 case ES:
41 case SS:
42 case CS:
43 if (value && (value & 3) != 3)
44 return -EIO;
45 value &= 0xffff;
46 break;
47
48 case FS_BASE:
49 case GS_BASE:
50 if (!((value >> 48) == 0 || (value >> 48) == 0xffff))
51 return -EIO;
52 break;
53
54 case EFLAGS:
55 value &= FLAG_MASK;
56 tmp = PT_REGS_EFLAGS(&child->thread.regs) & ~FLAG_MASK;
57 value |= tmp;
58 break;
59 }
60
61 PT_REGS_SET(&child->thread.regs, regno, value);
62 return 0;
63}
64
65unsigned long getreg(struct task_struct *child, int regno)
66{
67 unsigned long retval = ~0UL;
68 switch (regno) {
69 case FS:
70 case GS:
71 case DS:
72 case ES:
73 case SS:
74 case CS:
75 retval = 0xffff;
76 /* fall through */
77 default:
78 retval &= PT_REG(&child->thread.regs, regno);
79#ifdef TIF_IA32
80 if (test_tsk_thread_flag(child, TIF_IA32))
81 retval &= 0xffffffff;
82#endif
83 }
84 return retval;
85}
86
87void arch_switch(void)
88{
89/* XXX
90 printk("arch_switch\n");
91*/
92}
93
94int is_syscall(unsigned long addr)
95{
96 panic("is_syscall");
97}
98
99int dump_fpu(struct pt_regs *regs, elf_fpregset_t *fpu )
100{
101 panic("dump_fpu");
102 return(1);
103}
104
105int get_fpregs(unsigned long buf, struct task_struct *child)
106{
107 panic("get_fpregs");
108 return(0);
109}
110
111int set_fpregs(unsigned long buf, struct task_struct *child)
112{
113 panic("set_fpregs");
114 return(0);
115}
116
117int get_fpxregs(unsigned long buf, struct task_struct *tsk)
118{
119 panic("get_fpxregs");
120 return(0);
121}
122
123int set_fpxregs(unsigned long buf, struct task_struct *tsk)
124{
125 panic("set_fxpregs");
126 return(0);
127}
128
129/*
130 * Overrides for Emacs so that we follow Linus's tabbing style.
131 * Emacs will notice this stuff at the end of the file and automatically
132 * adjust the settings for this buffer only. This must remain at the end
133 * of the file.
134 * ---------------------------------------------------------------------------
135 * Local variables:
136 * c-file-style: "linux"
137 * End:
138 */