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