trap.c (295882) | trap.c (295893) |
---|---|
1/*- 2 * Copyright (c) 2015 Ruslan Bukin <br@bsdpad.com> 3 * All rights reserved. 4 * 5 * Portions of this software were developed by SRI International and the 6 * University of Cambridge Computer Laboratory under DARPA/AFRL contract 7 * FA8750-10-C-0237 ("CTSRD"), as part of the DARPA CRASH research programme. 8 * --- 19 unchanged lines hidden (view full) --- 28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32 * SUCH DAMAGE. 33 */ 34 35#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 2015 Ruslan Bukin <br@bsdpad.com> 3 * All rights reserved. 4 * 5 * Portions of this software were developed by SRI International and the 6 * University of Cambridge Computer Laboratory under DARPA/AFRL contract 7 * FA8750-10-C-0237 ("CTSRD"), as part of the DARPA CRASH research programme. 8 * --- 19 unchanged lines hidden (view full) --- 28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32 * SUCH DAMAGE. 33 */ 34 35#include <sys/cdefs.h> |
36__FBSDID("$FreeBSD: head/sys/riscv/riscv/trap.c 295882 2016-02-22 09:08:04Z skra $"); | 36__FBSDID("$FreeBSD: head/sys/riscv/riscv/trap.c 295893 2016-02-22 14:54:50Z br $"); |
37 38#include <sys/param.h> 39#include <sys/systm.h> 40#include <sys/kernel.h> 41#include <sys/lock.h> 42#include <sys/mutex.h> 43#include <sys/pioctl.h> 44#include <sys/bus.h> --- 220 unchanged lines hidden (view full) --- 265 curthread, frame->tf_sepc, frame); 266 267 switch(exception) { 268 case EXCP_LOAD_ACCESS_FAULT: 269 case EXCP_STORE_ACCESS_FAULT: 270 case EXCP_INSTR_ACCESS_FAULT: 271 data_abort(frame, 0); 272 break; | 37 38#include <sys/param.h> 39#include <sys/systm.h> 40#include <sys/kernel.h> 41#include <sys/lock.h> 42#include <sys/mutex.h> 43#include <sys/pioctl.h> 44#include <sys/bus.h> --- 220 unchanged lines hidden (view full) --- 265 curthread, frame->tf_sepc, frame); 266 267 switch(exception) { 268 case EXCP_LOAD_ACCESS_FAULT: 269 case EXCP_STORE_ACCESS_FAULT: 270 case EXCP_INSTR_ACCESS_FAULT: 271 data_abort(frame, 0); 272 break; |
273 case EXCP_INSTR_BREAKPOINT: 274#ifdef KDB 275 kdb_trap(exception, 0, frame); 276#else 277 dump_regs(frame); 278 panic("No debugger in kernel.\n"); 279#endif 280 case EXCP_INSTR_ILLEGAL: 281 dump_regs(frame); 282 panic("Illegal instruction at %x\n", frame->tf_sepc); 283 break; |
|
273 default: 274 dump_regs(frame); 275 panic("Unknown kernel exception %x badaddr %lx\n", 276 exception, frame->tf_sbadaddr); 277 } 278} 279 280void 281do_trap_user(struct trapframe *frame) 282{ 283 uint64_t exception; | 284 default: 285 dump_regs(frame); 286 panic("Unknown kernel exception %x badaddr %lx\n", 287 exception, frame->tf_sbadaddr); 288 } 289} 290 291void 292do_trap_user(struct trapframe *frame) 293{ 294 uint64_t exception; |
295 struct thread *td; |
|
284 | 296 |
297 td = curthread; 298 td->td_frame = frame; 299 |
|
285 exception = (frame->tf_scause & EXCP_MASK); 286 if (frame->tf_scause & EXCP_INTR) { 287 /* Interrupt */ 288 riscv_cpu_intr(frame); 289 return; 290 } 291 292 CTR3(KTR_TRAP, "do_trap_user: curthread: %p, sepc: %lx, frame: %p", --- 4 unchanged lines hidden (view full) --- 297 case EXCP_STORE_ACCESS_FAULT: 298 case EXCP_INSTR_ACCESS_FAULT: 299 data_abort(frame, 1); 300 break; 301 case EXCP_UMODE_ENV_CALL: 302 frame->tf_sepc += 4; /* Next instruction */ 303 svc_handler(frame); 304 break; | 300 exception = (frame->tf_scause & EXCP_MASK); 301 if (frame->tf_scause & EXCP_INTR) { 302 /* Interrupt */ 303 riscv_cpu_intr(frame); 304 return; 305 } 306 307 CTR3(KTR_TRAP, "do_trap_user: curthread: %p, sepc: %lx, frame: %p", --- 4 unchanged lines hidden (view full) --- 312 case EXCP_STORE_ACCESS_FAULT: 313 case EXCP_INSTR_ACCESS_FAULT: 314 data_abort(frame, 1); 315 break; 316 case EXCP_UMODE_ENV_CALL: 317 frame->tf_sepc += 4; /* Next instruction */ 318 svc_handler(frame); 319 break; |
320 case EXCP_INSTR_ILLEGAL: 321 call_trapsignal(td, SIGILL, ILL_ILLTRP, (void *)frame->tf_sepc); 322 userret(td, frame); 323 break; 324 case EXCP_INSTR_BREAKPOINT: 325 call_trapsignal(td, SIGTRAP, TRAP_BRKPT, (void *)frame->tf_sepc); 326 userret(td, frame); 327 break; |
|
305 default: 306 dump_regs(frame); 307 panic("Unknown userland exception %x badaddr %lx\n", 308 exception, frame->tf_sbadaddr); 309 } 310} | 328 default: 329 dump_regs(frame); 330 panic("Unknown userland exception %x badaddr %lx\n", 331 exception, frame->tf_sbadaddr); 332 } 333} |