1 /* 2 * arch/sh/kernel/process.c 3 * 4 * This file handles the architecture-dependent parts of process handling.. 5 * 6 * Copyright (C) 1995 Linus Torvalds 7 * 8 * SuperH version: Copyright (C) 1999, 2000 Niibe Yutaka & Kaz Kojima 9 * Copyright (C) 2006 Lineo Solutions Inc. support SH4A UBC 10 * Copyright (C) 2002 - 2007 Paul Mundt 11 */ 12 #include <linux/module.h> 13 #include <linux/mm.h> 14 #include <linux/elfcore.h> 15 #include <linux/pm.h> 16 #include <linux/kallsyms.h> 17 #include <linux/kexec.h> 18 #include <linux/kdebug.h> 19 #include <linux/tick.h> 20 #include <linux/reboot.h> 21 #include <linux/fs.h> 22 #include <linux/preempt.h> 23 #include <asm/uaccess.h> 24 #include <asm/mmu_context.h> 25 #include <asm/pgalloc.h> 26 #include <asm/system.h> 27 #include <asm/ubc.h> 28 #include <asm/fpu.h> 29 30 static int hlt_counter; 31 int ubc_usercnt = 0; 32 33 void (*pm_idle)(void); 34 void (*pm_power_off)(void); 35 EXPORT_SYMBOL(pm_power_off); 36 37 static int __init nohlt_setup(char *__unused) 38 { 39 hlt_counter = 1; 40 return 1; 41 } 42 __setup("nohlt", nohlt_setup); 43 44 static int __init hlt_setup(char *__unused) 45 { 46 hlt_counter = 0; 47 return 1; 48 } 49 __setup("hlt", hlt_setup); 50 51 static void default_idle(void) 52 { 53 if (!hlt_counter) { 54 clear_thread_flag(TIF_POLLING_NRFLAG); 55 smp_mb__after_clear_bit(); 56 set_bl_bit(); 57 while (!need_resched()) 58 cpu_sleep(); 59 clear_bl_bit(); 60 set_thread_flag(TIF_POLLING_NRFLAG); 61 } else 62 while (!need_resched()) 63 cpu_relax(); 64 } 65 66 void cpu_idle(void) 67 { 68 set_thread_flag(TIF_POLLING_NRFLAG); 69 70 /* endless idle loop with no priority at all */ 71 while (1) { 72 void (*idle)(void) = pm_idle; 73 74 if (!idle) 75 idle = default_idle; 76 77 tick_nohz_stop_sched_tick(1); 78 while (!need_resched()) 79 idle(); 80 tick_nohz_restart_sched_tick(); 81 82 preempt_enable_no_resched(); 83 schedule(); 84 preempt_disable(); 85 check_pgt_cache(); 86 } 87 } 88 89 void machine_restart(char * __unused) 90 { 91 /* SR.BL=1 and invoke address error to let CPU reset (manual reset) */ 92 asm volatile("ldc %0, sr\n\t" 93 "mov.l @%1, %0" : : "r" (0x10000000), "r" (0x80000001)); 94 } 95 96 void machine_halt(void) 97 { 98 local_irq_disable(); 99 100 while (1) 101 cpu_sleep(); 102 } 103 104 void machine_power_off(void) 105 { 106 if (pm_power_off) 107 pm_power_off(); 108 } 109 110 void show_regs(struct pt_regs * regs) 111 { 112 printk("\n"); 113 printk("Pid : %d, Comm: %20s\n", task_pid_nr(current), current->comm); 114 print_symbol("PC is at %s\n", instruction_pointer(regs)); 115 printk("PC : %08lx SP : %08lx SR : %08lx ", 116 regs->pc, regs->regs[15], regs->sr); 117 #ifdef CONFIG_MMU 118 printk("TEA : %08x ", ctrl_inl(MMU_TEA)); 119 #else 120 printk(" "); 121 #endif 122 printk("%s\n", print_tainted()); 123 124 printk("R0 : %08lx R1 : %08lx R2 : %08lx R3 : %08lx\n", 125 regs->regs[0],regs->regs[1], 126 regs->regs[2],regs->regs[3]); 127 printk("R4 : %08lx R5 : %08lx R6 : %08lx R7 : %08lx\n", 128 regs->regs[4],regs->regs[5], 129 regs->regs[6],regs->regs[7]); 130 printk("R8 : %08lx R9 : %08lx R10 : %08lx R11 : %08lx\n", 131 regs->regs[8],regs->regs[9], 132 regs->regs[10],regs->regs[11]); 133 printk("R12 : %08lx R13 : %08lx R14 : %08lx\n", 134 regs->regs[12],regs->regs[13], 135 regs->regs[14]); 136 printk("MACH: %08lx MACL: %08lx GBR : %08lx PR : %08lx\n", 137 regs->mach, regs->macl, regs->gbr, regs->pr); 138 139 show_trace(NULL, (unsigned long *)regs->regs[15], regs); 140 } 141 142 /* 143 * Create a kernel thread 144 */ 145 146 /* 147 * This is the mechanism for creating a new kernel thread. 148 * 149 */ 150 extern void kernel_thread_helper(void); 151 __asm__(".align 5\n" 152 "kernel_thread_helper:\n\t" 153 "jsr @r5\n\t" 154 " nop\n\t" 155 "mov.l 1f, r1\n\t" 156 "jsr @r1\n\t" 157 " mov r0, r4\n\t" 158 ".align 2\n\t" 159 "1:.long do_exit"); 160 161 /* Don't use this in BL=1(cli). Or else, CPU resets! */ 162 int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) 163 { 164 struct pt_regs regs; 165 166 memset(®s, 0, sizeof(regs)); 167 regs.regs[4] = (unsigned long)arg; 168 regs.regs[5] = (unsigned long)fn; 169 170 regs.pc = (unsigned long)kernel_thread_helper; 171 regs.sr = (1 << 30); 172 173 /* Ok, create the new process.. */ 174 return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, 175 ®s, 0, NULL, NULL); 176 } 177 178 /* 179 * Free current thread data structures etc.. 180 */ 181 void exit_thread(void) 182 { 183 if (current->thread.ubc_pc) { 184 current->thread.ubc_pc = 0; 185 ubc_usercnt -= 1; 186 } 187 } 188 189 void flush_thread(void) 190 { 191 #if defined(CONFIG_SH_FPU) 192 struct task_struct *tsk = current; 193 /* Forget lazy FPU state */ 194 clear_fpu(tsk, task_pt_regs(tsk)); 195 clear_used_math(); 196 #endif 197 } 198 199 void release_thread(struct task_struct *dead_task) 200 { 201 /* do nothing */ 202 } 203 204 /* Fill in the fpu structure for a core dump.. */ 205 int dump_fpu(struct pt_regs *regs, elf_fpregset_t *fpu) 206 { 207 int fpvalid = 0; 208 209 #if defined(CONFIG_SH_FPU) 210 struct task_struct *tsk = current; 211 212 fpvalid = !!tsk_used_math(tsk); 213 if (fpvalid) { 214 unlazy_fpu(tsk, regs); 215 memcpy(fpu, &tsk->thread.fpu.hard, sizeof(*fpu)); 216 } 217 #endif 218 219 return fpvalid; 220 } 221 222 asmlinkage void ret_from_fork(void); 223 224 int copy_thread(int nr, unsigned long clone_flags, unsigned long usp, 225 unsigned long unused, 226 struct task_struct *p, struct pt_regs *regs) 227 { 228 struct thread_info *ti = task_thread_info(p); 229 struct pt_regs *childregs; 230 #if defined(CONFIG_SH_FPU) 231 struct task_struct *tsk = current; 232 233 unlazy_fpu(tsk, regs); 234 p->thread.fpu = tsk->thread.fpu; 235 copy_to_stopped_child_used_math(p); 236 #endif 237 238 childregs = task_pt_regs(p); 239 *childregs = *regs; 240 241 if (user_mode(regs)) { 242 childregs->regs[15] = usp; 243 ti->addr_limit = USER_DS; 244 } else { 245 childregs->regs[15] = (unsigned long)childregs; 246 ti->addr_limit = KERNEL_DS; 247 } 248 249 if (clone_flags & CLONE_SETTLS) 250 childregs->gbr = childregs->regs[0]; 251 252 childregs->regs[0] = 0; /* Set return value for child */ 253 254 p->thread.sp = (unsigned long) childregs; 255 p->thread.pc = (unsigned long) ret_from_fork; 256 257 p->thread.ubc_pc = 0; 258 259 return 0; 260 } 261 262 /* Tracing by user break controller. */ 263 static void ubc_set_tracing(int asid, unsigned long pc) 264 { 265 #if defined(CONFIG_CPU_SH4A) 266 unsigned long val; 267 268 val = (UBC_CBR_ID_INST | UBC_CBR_RW_READ | UBC_CBR_CE); 269 val |= (UBC_CBR_AIE | UBC_CBR_AIV_SET(asid)); 270 271 ctrl_outl(val, UBC_CBR0); 272 ctrl_outl(pc, UBC_CAR0); 273 ctrl_outl(0x0, UBC_CAMR0); 274 ctrl_outl(0x0, UBC_CBCR); 275 276 val = (UBC_CRR_RES | UBC_CRR_PCB | UBC_CRR_BIE); 277 ctrl_outl(val, UBC_CRR0); 278 279 /* Read UBC register that we wrote last, for checking update */ 280 val = ctrl_inl(UBC_CRR0); 281 282 #else /* CONFIG_CPU_SH4A */ 283 ctrl_outl(pc, UBC_BARA); 284 285 #ifdef CONFIG_MMU 286 ctrl_outb(asid, UBC_BASRA); 287 #endif 288 289 ctrl_outl(0, UBC_BAMRA); 290 291 if (current_cpu_data.type == CPU_SH7729 || 292 current_cpu_data.type == CPU_SH7710 || 293 current_cpu_data.type == CPU_SH7712) { 294 ctrl_outw(BBR_INST | BBR_READ | BBR_CPU, UBC_BBRA); 295 ctrl_outl(BRCR_PCBA | BRCR_PCTE, UBC_BRCR); 296 } else { 297 ctrl_outw(BBR_INST | BBR_READ, UBC_BBRA); 298 ctrl_outw(BRCR_PCBA, UBC_BRCR); 299 } 300 #endif /* CONFIG_CPU_SH4A */ 301 } 302 303 /* 304 * switch_to(x,y) should switch tasks from x to y. 305 * 306 */ 307 struct task_struct *__switch_to(struct task_struct *prev, 308 struct task_struct *next) 309 { 310 #if defined(CONFIG_SH_FPU) 311 unlazy_fpu(prev, task_pt_regs(prev)); 312 #endif 313 314 #ifdef CONFIG_MMU 315 /* 316 * Restore the kernel mode register 317 * k7 (r7_bank1) 318 */ 319 asm volatile("ldc %0, r7_bank" 320 : /* no output */ 321 : "r" (task_thread_info(next))); 322 #endif 323 324 /* If no tasks are using the UBC, we're done */ 325 if (ubc_usercnt == 0) 326 /* If no tasks are using the UBC, we're done */; 327 else if (next->thread.ubc_pc && next->mm) { 328 int asid = 0; 329 #ifdef CONFIG_MMU 330 asid |= cpu_asid(smp_processor_id(), next->mm); 331 #endif 332 ubc_set_tracing(asid, next->thread.ubc_pc); 333 } else { 334 #if defined(CONFIG_CPU_SH4A) 335 ctrl_outl(UBC_CBR_INIT, UBC_CBR0); 336 ctrl_outl(UBC_CRR_INIT, UBC_CRR0); 337 #else 338 ctrl_outw(0, UBC_BBRA); 339 ctrl_outw(0, UBC_BBRB); 340 #endif 341 } 342 343 return prev; 344 } 345 346 asmlinkage int sys_fork(unsigned long r4, unsigned long r5, 347 unsigned long r6, unsigned long r7, 348 struct pt_regs __regs) 349 { 350 #ifdef CONFIG_MMU 351 struct pt_regs *regs = RELOC_HIDE(&__regs, 0); 352 return do_fork(SIGCHLD, regs->regs[15], regs, 0, NULL, NULL); 353 #else 354 /* fork almost works, enough to trick you into looking elsewhere :-( */ 355 return -EINVAL; 356 #endif 357 } 358 359 asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp, 360 unsigned long parent_tidptr, 361 unsigned long child_tidptr, 362 struct pt_regs __regs) 363 { 364 struct pt_regs *regs = RELOC_HIDE(&__regs, 0); 365 if (!newsp) 366 newsp = regs->regs[15]; 367 return do_fork(clone_flags, newsp, regs, 0, 368 (int __user *)parent_tidptr, 369 (int __user *)child_tidptr); 370 } 371 372 /* 373 * This is trivial, and on the face of it looks like it 374 * could equally well be done in user mode. 375 * 376 * Not so, for quite unobvious reasons - register pressure. 377 * In user mode vfork() cannot have a stack frame, and if 378 * done by calling the "clone()" system call directly, you 379 * do not have enough call-clobbered registers to hold all 380 * the information you need. 381 */ 382 asmlinkage int sys_vfork(unsigned long r4, unsigned long r5, 383 unsigned long r6, unsigned long r7, 384 struct pt_regs __regs) 385 { 386 struct pt_regs *regs = RELOC_HIDE(&__regs, 0); 387 return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->regs[15], regs, 388 0, NULL, NULL); 389 } 390 391 /* 392 * sys_execve() executes a new program. 393 */ 394 asmlinkage int sys_execve(char __user *ufilename, char __user * __user *uargv, 395 char __user * __user *uenvp, unsigned long r7, 396 struct pt_regs __regs) 397 { 398 struct pt_regs *regs = RELOC_HIDE(&__regs, 0); 399 int error; 400 char *filename; 401 402 filename = getname(ufilename); 403 error = PTR_ERR(filename); 404 if (IS_ERR(filename)) 405 goto out; 406 407 error = do_execve(filename, uargv, uenvp, regs); 408 if (error == 0) { 409 task_lock(current); 410 current->ptrace &= ~PT_DTRACE; 411 task_unlock(current); 412 } 413 putname(filename); 414 out: 415 return error; 416 } 417 418 unsigned long get_wchan(struct task_struct *p) 419 { 420 unsigned long pc; 421 422 if (!p || p == current || p->state == TASK_RUNNING) 423 return 0; 424 425 /* 426 * The same comment as on the Alpha applies here, too ... 427 */ 428 pc = thread_saved_pc(p); 429 430 #ifdef CONFIG_FRAME_POINTER 431 if (in_sched_functions(pc)) { 432 unsigned long schedule_frame = (unsigned long)p->thread.sp; 433 return ((unsigned long *)schedule_frame)[21]; 434 } 435 #endif 436 437 return pc; 438 } 439 440 asmlinkage void break_point_trap(void) 441 { 442 /* Clear tracing. */ 443 #if defined(CONFIG_CPU_SH4A) 444 ctrl_outl(UBC_CBR_INIT, UBC_CBR0); 445 ctrl_outl(UBC_CRR_INIT, UBC_CRR0); 446 #else 447 ctrl_outw(0, UBC_BBRA); 448 ctrl_outw(0, UBC_BBRB); 449 #endif 450 current->thread.ubc_pc = 0; 451 ubc_usercnt -= 1; 452 453 force_sig(SIGTRAP, current); 454 } 455