1ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao/*
2ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * Copyright 2011, The Android Open Source Project
3ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao *
4ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * Licensed under the Apache License, Version 2.0 (the "License");
5ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * you may not use this file except in compliance with the License.
6ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * You may obtain a copy of the License at
7ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao *
8ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao *     http://www.apache.org/licenses/LICENSE-2.0
9ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao *
10ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * Unless required by applicable law or agreed to in writing, software
11ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * distributed under the License is distributed on an "AS IS" BASIS,
12ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * See the License for the specific language governing permissions and
14ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao * limitations under the License.
15ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao */
16ee6cdb95525abc8c7766798148302306a100b774Shih-wei Liao
17cf6522329b7a93193fbef761386bdaa4a07206f8Logan Chien#ifndef ELF_SECTION_BITS_HXX
18cf6522329b7a93193fbef761386bdaa4a07206f8Logan Chien#define ELF_SECTION_BITS_HXX
19cf6522329b7a93193fbef761386bdaa4a07206f8Logan Chien
20cf6522329b7a93193fbef761386bdaa4a07206f8Logan Chien#include "utils/flush_cpu_cache.h"
21cf6522329b7a93193fbef761386bdaa4a07206f8Logan Chien#include "utils/helper.h"
22cf6522329b7a93193fbef761386bdaa4a07206f8Logan Chien
23cf6522329b7a93193fbef761386bdaa4a07206f8Logan Chien#include <llvm/Support/raw_ostream.h>
24cf6522329b7a93193fbef761386bdaa4a07206f8Logan Chien
25cf6522329b7a93193fbef761386bdaa4a07206f8Logan Chien#include <sys/mman.h>
26cf6522329b7a93193fbef761386bdaa4a07206f8Logan Chien
27cf6522329b7a93193fbef761386bdaa4a07206f8Logan Chientemplate <unsigned Bitwidth>
2874f7a939f44d926babd52f59978e6b093e4bb2d0Logan Chieninline void ELFSectionBits<Bitwidth>::print() const {
2974f7a939f44d926babd52f59978e6b093e4bb2d0Logan Chien  using namespace llvm;
30cf6522329b7a93193fbef761386bdaa4a07206f8Logan Chien
3174f7a939f44d926babd52f59978e6b093e4bb2d0Logan Chien  char const *section_type_str =
3274f7a939f44d926babd52f59978e6b093e4bb2d0Logan Chien    (sh->getType() == SHT_NOBITS) ? "NOBITS" : "PROGBITS";
33cf6522329b7a93193fbef761386bdaa4a07206f8Logan Chien
3474f7a939f44d926babd52f59978e6b093e4bb2d0Logan Chien  out() << '\n' << fillformat('=', 79) << '\n';
3574f7a939f44d926babd52f59978e6b093e4bb2d0Logan Chien  out().changeColor(raw_ostream::WHITE, true);
3674f7a939f44d926babd52f59978e6b093e4bb2d0Logan Chien  out() << "ELF " << section_type_str << ": " << sh->getName() << '\n';
3774f7a939f44d926babd52f59978e6b093e4bb2d0Logan Chien  out().resetColor();
3874f7a939f44d926babd52f59978e6b093e4bb2d0Logan Chien  out() << fillformat('-', 79) << '\n';
39cf6522329b7a93193fbef761386bdaa4a07206f8Logan Chien
4074f7a939f44d926babd52f59978e6b093e4bb2d0Logan Chien  out() << "  Size         : " << sh->getSize() << '\n';
4174f7a939f44d926babd52f59978e6b093e4bb2d0Logan Chien  out() << "  Start Address: " << (void *)chunk.getBuffer() << '\n';
4274f7a939f44d926babd52f59978e6b093e4bb2d0Logan Chien  out() << fillformat('-', 79) << '\n';
43cf6522329b7a93193fbef761386bdaa4a07206f8Logan Chien
4474f7a939f44d926babd52f59978e6b093e4bb2d0Logan Chien  chunk.print();
45cf6522329b7a93193fbef761386bdaa4a07206f8Logan Chien
4674f7a939f44d926babd52f59978e6b093e4bb2d0Logan Chien  out() << fillformat('=', 79) << '\n';
47cf6522329b7a93193fbef761386bdaa4a07206f8Logan Chien}
48cf6522329b7a93193fbef761386bdaa4a07206f8Logan Chien
49cf6522329b7a93193fbef761386bdaa4a07206f8Logan Chientemplate <unsigned Bitwidth>
5074f7a939f44d926babd52f59978e6b093e4bb2d0Logan Chieninline bool ELFSectionBits<Bitwidth>::protect() {
5174f7a939f44d926babd52f59978e6b093e4bb2d0Logan Chien  int prot = PROT_READ;
52cf6522329b7a93193fbef761386bdaa4a07206f8Logan Chien
5374f7a939f44d926babd52f59978e6b093e4bb2d0Logan Chien  if (sh->getFlags() & SHF_WRITE) {
5474f7a939f44d926babd52f59978e6b093e4bb2d0Logan Chien    prot |= PROT_WRITE;
55cf6522329b7a93193fbef761386bdaa4a07206f8Logan Chien  }
56cf6522329b7a93193fbef761386bdaa4a07206f8Logan Chien
5774f7a939f44d926babd52f59978e6b093e4bb2d0Logan Chien  if (sh->getFlags() & SHF_EXECINSTR) {
5874f7a939f44d926babd52f59978e6b093e4bb2d0Logan Chien    prot |= PROT_EXEC;
59cf6522329b7a93193fbef761386bdaa4a07206f8Logan Chien  }
60cf6522329b7a93193fbef761386bdaa4a07206f8Logan Chien
6174f7a939f44d926babd52f59978e6b093e4bb2d0Logan Chien  return chunk.protect(prot);
62cf6522329b7a93193fbef761386bdaa4a07206f8Logan Chien}
63cf6522329b7a93193fbef761386bdaa4a07206f8Logan Chien
64cf6522329b7a93193fbef761386bdaa4a07206f8Logan Chien#endif // ELF_SECTION_BITS_HXX
65