1010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// found in the LICENSE file.
4010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if defined(__arm__)  // nacl_irt_icache is supported only on ARM.
6010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
7010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <errno.h>
8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <sys/syscall.h>
9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <stddef.h>
10010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "components/nacl/loader/nonsfi/irt_interfaces.h"
12010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace nacl {
14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace nonsfi {
15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace {
17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// TODO(mazda): Revisit the implementation to consider inlining the syscall
19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// with assembly when Non-SFI mode's IRT implementations get moved to the
20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// NaCl repository.
21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)int IrtClearCache(void* addr, size_t size) {
22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // The third argument of cacheflush is just ignored for now and should
23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // always be zero.
24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  int result = syscall(__ARM_NR_cacheflush,
25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                       addr, reinterpret_cast<intptr_t>(addr) + size, 0);
26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (result < 0)
27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return errno;
28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return 0;
29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}  // namespace
32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const nacl_irt_icache kIrtIcache = {
34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  IrtClearCache
35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)};
36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}  // namespace nonsfi
38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}  // namespace nacl
39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
41