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