1--
2-- Copyright 2014, General Dynamics C4 Systems
3--
4-- This software may be distributed and modified according to the terms of
5-- the GNU General Public License version 2. Note that NO WARRANTY is provided.
6-- See "LICENSE_GPLv2.txt" for details.
7--
8-- @TAG(GD_GPL)
9--
10
11{-# LANGUAGE EmptyDataDecls, ForeignFunctionInterface, GeneralizedNewtypeDeriving #-}
12
13module SEL4.Machine.Hardware.ARM.Callbacks where
14
15import Prelude hiding (Word)
16import SEL4.Machine.RegisterSet
17import Foreign.Ptr
18import Data.Bits
19import Data.Word(Word8)
20
21
22data CallbackData
23
24type MachineData = Ptr CallbackData
25
26newtype PAddr = PAddr { fromPAddr :: Word }
27    deriving (Integral, Real, Show, Eq, Num, Bits, FiniteBits, Ord, Enum, Bounded)
28
29plusPtr :: PAddr -> Int -> PAddr
30plusPtr a b = a + (fromIntegral b)
31
32foreign import ccall unsafe "qemu_load_word_phys"
33    loadWordCallback :: Ptr CallbackData -> PAddr -> IO Word
34
35foreign import ccall unsafe "qemu_store_word_phys"
36    storeWordCallback :: Ptr CallbackData -> PAddr -> Word -> IO ()
37
38foreign import ccall unsafe "qemu_tlb_flush"
39    invalidateLocalTLBCallback :: Ptr CallbackData -> IO ()
40
41foreign import ccall unsafe "qemu_tlb_flush_asid"
42    invalidateLocalTLB_ASIDCallback :: Ptr CallbackData -> Word8 -> IO ()
43
44foreign import ccall unsafe "qemu_tlb_flush_vptr"
45    invalidateLocalTLB_VAASIDCallback :: Ptr CallbackData -> Word -> IO ()
46
47foreign import ccall unsafe "qemu_set_asid"
48    setHardwareASID :: Ptr CallbackData -> Word8 -> IO ()
49
50-- FIXME qemu_set_root is still expecting the pointer, not its mangled
51-- word version, per haskell-kernel-emulator/interface/callbacks.c
52foreign import ccall unsafe "qemu_set_root"
53    writeTTBR0 :: Ptr CallbackData -> Word -> IO ()
54
55foreign import ccall unsafe "qemu_arm_get_ifsr"
56    getIFSR :: Ptr CallbackData -> IO Word
57
58foreign import ccall unsafe "qemu_arm_get_dfsr"
59    getDFSR :: Ptr CallbackData -> IO Word
60
61foreign import ccall unsafe "qemu_arm_get_far"
62    getFAR :: Ptr CallbackData -> IO VPtr
63
64