183998Sbrooks/** 283998Sbrooks * \file 3139823Simp * \brief Dispatcher entry points. 4139823Simp */ 5139823Simp 683998Sbrooks/* 783998Sbrooks * Copyright (c) 2007, 2008, 2009, 2010, ETH Zurich. 883998Sbrooks * All rights reserved. 983998Sbrooks * 1083998Sbrooks * This file is distributed under the terms in the attached LICENSE file. 1184000Sbrooks * If you do not find this file, copies can be found by writing to: 1283998Sbrooks * ETH Zurich D-INFK, Universitaetstrasse 6, CH-8092 Zurich. Attn: Systems Group. 1384000Sbrooks */ 1483998Sbrooks 1584000Sbrooks#include <barrelfish/dispatch.h> 1683998Sbrooks#include <asmoffsets.h> 1784000Sbrooks 1884000Sbrooks .text 1983998Sbrooks .globl run_entry, pagefault_entry, disabled_pagefault_entry, trap_entry, lrpc_entry 2083998Sbrooks 2183998Sbrooksrun_entry: 2283998Sbrooks // Get dispatcher stack to rsp 2383998Sbrooks movq %rdi, %rsp 2483998Sbrooks addq $(OFFSETOF_DISP_PRIV_STACK_LIMIT), %rsp 2583998Sbrooks callq disp_run // Handle activation in C 2683998Sbrooks 2783998Sbrooks// 2883998Sbrooks// void pagefault_entry(vaddr_t fault_addr, uintptr_t error, vaddr_t ip) 2983998Sbrooks// 3083998Sbrookspagefault_entry: 3183998Sbrooks // Get dispatcher stack 3283998Sbrooks movq %rdi, %rsp 3383998Sbrooks addq $(OFFSETOF_DISP_PRIV_STACK_LIMIT), %rsp 3483998Sbrooks callq disp_pagefault // handle activation in C 3583998Sbrooks 3683998Sbrooks// 3783998Sbrooks// void disabled_pagefault_entry(vaddr_t fault_addr, uintptr_t error, vaddr_t ip) 3883998Sbrooks// 3983998Sbrooksdisabled_pagefault_entry: 4083998Sbrooks // Get trap stack 4183998Sbrooks movq %rdi, %rsp 4283998Sbrooks addq $(OFFSETOF_DISP_PRIV_TRAP_STACK_LIMIT), %rsp 4383998Sbrooks callq disp_pagefault_disabled // handle activation in C 4483998Sbrooks 4583998Sbrooks// 4683998Sbrooks// void trap_entry(uintptr_t irq, uintptr_t error, vaddr_t ip) 4783998Sbrooks// 4883998Sbrookstrap_entry: 4983998Sbrooks // Get trap stack 5083998Sbrooks movq %rdi, %rsp 5183998Sbrooks addq $(OFFSETOF_DISP_PRIV_TRAP_STACK_LIMIT), %rsp 5283998Sbrooks callq disp_trap // handle activation in C 5383998Sbrooks 5483998Sbrookslrpc_entry: 5583998Sbrooks /* register state: 5683998Sbrooks * rdi = epoffset 5783998Sbrooks * esi = bufpos of reserved space in endpoint 5883998Sbrooks * rdx, r10, r8, r9 = message body 5983998Sbrooks * rax = dispatcher 6083998Sbrooks */ 6183998Sbrooks 6283998Sbrooks /* shuffle registers to match calling parameters of disp_lrpc */ 6383998Sbrooks mov %r10, %rcx 6483998Sbrooks 6583998Sbrooks // Load dispatcher to rsp 6683998Sbrooks movq %rax, %rsp 6783998Sbrooks 6883998Sbrooks // Compute address of endpoint 6983998Sbrooks addq %rsp, %rdi 7083998Sbrooks subq $OFFSETOF_LMP_ENDPOINT_KERNPART, %rdi 7183998Sbrooks 7283998Sbrooks // Load dispatcher stack to rsp 7383998Sbrooks addq $(OFFSETOF_DISP_PRIV_STACK_LIMIT), %rsp 7483998Sbrooks 7583998Sbrooks // Align the stack 7683998Sbrooks subq $8, %rsp 7783998Sbrooks 7883998Sbrooks // Push dispatcher pointer to top of stack (7th function argument) 7983998Sbrooks pushq %rax 8083998Sbrooks 8183998Sbrooks callq disp_lrpc /* disp_lrpc(ep, bufpos, w1, w2, w3, w4, handle) */ 8283998Sbrooks