112605Sgiacomo.travaglini@arm.com/*
213882Sgiacomo.travaglini@arm.com * Copyright (c) 2018-2019 ARM Limited
312605Sgiacomo.travaglini@arm.com * All rights reserved
412605Sgiacomo.travaglini@arm.com *
512605Sgiacomo.travaglini@arm.com * The license below extends only to copyright in the software and shall
612605Sgiacomo.travaglini@arm.com * not be construed as granting a license to any other intellectual
712605Sgiacomo.travaglini@arm.com * property including but not limited to intellectual property relating
812605Sgiacomo.travaglini@arm.com * to a hardware implementation of the functionality of the software
912605Sgiacomo.travaglini@arm.com * licensed hereunder.  You may use the software subject to the license
1012605Sgiacomo.travaglini@arm.com * terms below provided that you ensure that this notice is replicated
1112605Sgiacomo.travaglini@arm.com * unmodified and in its entirety in all distributions of the software,
1212605Sgiacomo.travaglini@arm.com * modified or unmodified, in source code or in binary form.
1312605Sgiacomo.travaglini@arm.com *
1412605Sgiacomo.travaglini@arm.com * Redistribution and use in source and binary forms, with or without
1512605Sgiacomo.travaglini@arm.com * modification, are permitted provided that the following conditions are
1612605Sgiacomo.travaglini@arm.com * met: redistributions of source code must retain the above copyright
1712605Sgiacomo.travaglini@arm.com * notice, this list of conditions and the following disclaimer;
1812605Sgiacomo.travaglini@arm.com * redistributions in binary form must reproduce the above copyright
1912605Sgiacomo.travaglini@arm.com * notice, this list of conditions and the following disclaimer in the
2012605Sgiacomo.travaglini@arm.com * documentation and/or other materials provided with the distribution;
2112605Sgiacomo.travaglini@arm.com * neither the name of the copyright holders nor the names of its
2212605Sgiacomo.travaglini@arm.com * contributors may be used to endorse or promote products derived from
2312605Sgiacomo.travaglini@arm.com * this software without specific prior written permission.
2412605Sgiacomo.travaglini@arm.com *
2512605Sgiacomo.travaglini@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2612605Sgiacomo.travaglini@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2712605Sgiacomo.travaglini@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2812605Sgiacomo.travaglini@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2912605Sgiacomo.travaglini@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3012605Sgiacomo.travaglini@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3112605Sgiacomo.travaglini@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3212605Sgiacomo.travaglini@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3312605Sgiacomo.travaglini@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3412605Sgiacomo.travaglini@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3512605Sgiacomo.travaglini@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3612605Sgiacomo.travaglini@arm.com *
3712605Sgiacomo.travaglini@arm.com * Authors: Giacomo Travaglini
3812605Sgiacomo.travaglini@arm.com */
3912605Sgiacomo.travaglini@arm.com
4012605Sgiacomo.travaglini@arm.com#ifndef __ARCH_ARM_TLBI_HH__
4112605Sgiacomo.travaglini@arm.com#define __ARCH_ARM_TLBI_HH__
4212605Sgiacomo.travaglini@arm.com
4312605Sgiacomo.travaglini@arm.com#include "arch/arm/system.hh"
4412605Sgiacomo.travaglini@arm.com#include "arch/arm/tlb.hh"
4512605Sgiacomo.travaglini@arm.com#include "cpu/thread_context.hh"
4612605Sgiacomo.travaglini@arm.com
4712605Sgiacomo.travaglini@arm.com/**
4812605Sgiacomo.travaglini@arm.com * @file
4912605Sgiacomo.travaglini@arm.com * The file contains the definition of a set of TLB Invalidate
5012605Sgiacomo.travaglini@arm.com * Instructions. Those are the ISA interface for TLB flushing
5112605Sgiacomo.travaglini@arm.com * operations.
5212605Sgiacomo.travaglini@arm.com */
5312605Sgiacomo.travaglini@arm.comnamespace ArmISA {
5412605Sgiacomo.travaglini@arm.com
5512605Sgiacomo.travaglini@arm.comclass TLBIOp
5612605Sgiacomo.travaglini@arm.com{
5712605Sgiacomo.travaglini@arm.com  public:
5812605Sgiacomo.travaglini@arm.com    TLBIOp(ExceptionLevel _targetEL, bool _secure)
5912605Sgiacomo.travaglini@arm.com      : secureLookup(_secure), targetEL(_targetEL)
6012605Sgiacomo.travaglini@arm.com    {}
6112605Sgiacomo.travaglini@arm.com
6212605Sgiacomo.travaglini@arm.com    virtual ~TLBIOp() {}
6312605Sgiacomo.travaglini@arm.com    virtual void operator()(ThreadContext* tc) {}
6412605Sgiacomo.travaglini@arm.com
6512605Sgiacomo.travaglini@arm.com    /**
6612605Sgiacomo.travaglini@arm.com     * Broadcast the TLB Invalidate operation to all
6712605Sgiacomo.travaglini@arm.com     * TLBs in the Arm system.
6812605Sgiacomo.travaglini@arm.com     * @param tc Thread Context
6912605Sgiacomo.travaglini@arm.com     */
7012605Sgiacomo.travaglini@arm.com    void
7112605Sgiacomo.travaglini@arm.com    broadcast(ThreadContext *tc)
7212605Sgiacomo.travaglini@arm.com    {
7312605Sgiacomo.travaglini@arm.com        System *sys = tc->getSystemPtr();
7412605Sgiacomo.travaglini@arm.com        for (int x = 0; x < sys->numContexts(); x++) {
7512605Sgiacomo.travaglini@arm.com            ThreadContext *oc = sys->getThreadContext(x);
7612605Sgiacomo.travaglini@arm.com            (*this)(oc);
7712605Sgiacomo.travaglini@arm.com        }
7812605Sgiacomo.travaglini@arm.com    }
7912605Sgiacomo.travaglini@arm.com
8012605Sgiacomo.travaglini@arm.com  protected:
8112605Sgiacomo.travaglini@arm.com    bool secureLookup;
8212605Sgiacomo.travaglini@arm.com    ExceptionLevel targetEL;
8312605Sgiacomo.travaglini@arm.com};
8412605Sgiacomo.travaglini@arm.com
8512605Sgiacomo.travaglini@arm.com/** TLB Invalidate All */
8612605Sgiacomo.travaglini@arm.comclass TLBIALL : public TLBIOp
8712605Sgiacomo.travaglini@arm.com{
8812605Sgiacomo.travaglini@arm.com  public:
8912605Sgiacomo.travaglini@arm.com    TLBIALL(ExceptionLevel _targetEL, bool _secure)
9012605Sgiacomo.travaglini@arm.com      : TLBIOp(_targetEL, _secure)
9112605Sgiacomo.travaglini@arm.com    {}
9212605Sgiacomo.travaglini@arm.com
9312605Sgiacomo.travaglini@arm.com    void operator()(ThreadContext* tc) override;
9412605Sgiacomo.travaglini@arm.com};
9512605Sgiacomo.travaglini@arm.com
9612605Sgiacomo.travaglini@arm.com/** Instruction TLB Invalidate All */
9712605Sgiacomo.travaglini@arm.comclass ITLBIALL : public TLBIOp
9812605Sgiacomo.travaglini@arm.com{
9912605Sgiacomo.travaglini@arm.com  public:
10012605Sgiacomo.travaglini@arm.com    ITLBIALL(ExceptionLevel _targetEL, bool _secure)
10112605Sgiacomo.travaglini@arm.com      : TLBIOp(_targetEL, _secure)
10212605Sgiacomo.travaglini@arm.com    {}
10312605Sgiacomo.travaglini@arm.com
10412605Sgiacomo.travaglini@arm.com    void broadcast(ThreadContext *tc) = delete;
10512605Sgiacomo.travaglini@arm.com
10612605Sgiacomo.travaglini@arm.com    void operator()(ThreadContext* tc) override;
10712605Sgiacomo.travaglini@arm.com};
10812605Sgiacomo.travaglini@arm.com
10912605Sgiacomo.travaglini@arm.com/** Data TLB Invalidate All */
11012605Sgiacomo.travaglini@arm.comclass DTLBIALL : public TLBIOp
11112605Sgiacomo.travaglini@arm.com{
11212605Sgiacomo.travaglini@arm.com  public:
11312605Sgiacomo.travaglini@arm.com    DTLBIALL(ExceptionLevel _targetEL, bool _secure)
11412605Sgiacomo.travaglini@arm.com      : TLBIOp(_targetEL, _secure)
11512605Sgiacomo.travaglini@arm.com    {}
11612605Sgiacomo.travaglini@arm.com
11712605Sgiacomo.travaglini@arm.com    void broadcast(ThreadContext *tc) = delete;
11812605Sgiacomo.travaglini@arm.com
11912605Sgiacomo.travaglini@arm.com    void operator()(ThreadContext* tc) override;
12012605Sgiacomo.travaglini@arm.com};
12112605Sgiacomo.travaglini@arm.com
12212605Sgiacomo.travaglini@arm.com/** TLB Invalidate by ASID match */
12312605Sgiacomo.travaglini@arm.comclass TLBIASID : public TLBIOp
12412605Sgiacomo.travaglini@arm.com{
12512605Sgiacomo.travaglini@arm.com  public:
12612605Sgiacomo.travaglini@arm.com    TLBIASID(ExceptionLevel _targetEL, bool _secure, uint16_t _asid)
12712605Sgiacomo.travaglini@arm.com      : TLBIOp(_targetEL, _secure), asid(_asid)
12812605Sgiacomo.travaglini@arm.com    {}
12912605Sgiacomo.travaglini@arm.com
13012605Sgiacomo.travaglini@arm.com    void operator()(ThreadContext* tc) override;
13112605Sgiacomo.travaglini@arm.com
13212605Sgiacomo.travaglini@arm.com  protected:
13312605Sgiacomo.travaglini@arm.com    uint16_t asid;
13412605Sgiacomo.travaglini@arm.com};
13512605Sgiacomo.travaglini@arm.com
13612605Sgiacomo.travaglini@arm.com/** Instruction TLB Invalidate by ASID match */
13712605Sgiacomo.travaglini@arm.comclass ITLBIASID : public TLBIOp
13812605Sgiacomo.travaglini@arm.com{
13912605Sgiacomo.travaglini@arm.com  public:
14012605Sgiacomo.travaglini@arm.com    ITLBIASID(ExceptionLevel _targetEL, bool _secure, uint16_t _asid)
14112605Sgiacomo.travaglini@arm.com      : TLBIOp(_targetEL, _secure), asid(_asid)
14212605Sgiacomo.travaglini@arm.com    {}
14312605Sgiacomo.travaglini@arm.com
14412605Sgiacomo.travaglini@arm.com    void broadcast(ThreadContext *tc) = delete;
14512605Sgiacomo.travaglini@arm.com
14612605Sgiacomo.travaglini@arm.com    void operator()(ThreadContext* tc) override;
14712605Sgiacomo.travaglini@arm.com
14812605Sgiacomo.travaglini@arm.com  protected:
14912605Sgiacomo.travaglini@arm.com    uint16_t asid;
15012605Sgiacomo.travaglini@arm.com};
15112605Sgiacomo.travaglini@arm.com
15212605Sgiacomo.travaglini@arm.com/** Data TLB Invalidate by ASID match */
15312605Sgiacomo.travaglini@arm.comclass DTLBIASID : public TLBIOp
15412605Sgiacomo.travaglini@arm.com{
15512605Sgiacomo.travaglini@arm.com  public:
15612605Sgiacomo.travaglini@arm.com    DTLBIASID(ExceptionLevel _targetEL, bool _secure, uint16_t _asid)
15712605Sgiacomo.travaglini@arm.com      : TLBIOp(_targetEL, _secure), asid(_asid)
15812605Sgiacomo.travaglini@arm.com    {}
15912605Sgiacomo.travaglini@arm.com
16012605Sgiacomo.travaglini@arm.com    void broadcast(ThreadContext *tc) = delete;
16112605Sgiacomo.travaglini@arm.com
16212605Sgiacomo.travaglini@arm.com    void operator()(ThreadContext* tc) override;
16312605Sgiacomo.travaglini@arm.com
16412605Sgiacomo.travaglini@arm.com  protected:
16512605Sgiacomo.travaglini@arm.com    uint16_t asid;
16612605Sgiacomo.travaglini@arm.com};
16712605Sgiacomo.travaglini@arm.com
16812605Sgiacomo.travaglini@arm.com/** TLB Invalidate All, Non-Secure */
16912605Sgiacomo.travaglini@arm.comclass TLBIALLN : public TLBIOp
17012605Sgiacomo.travaglini@arm.com{
17112605Sgiacomo.travaglini@arm.com  public:
17213882Sgiacomo.travaglini@arm.com    TLBIALLN(ExceptionLevel _targetEL)
17313882Sgiacomo.travaglini@arm.com      : TLBIOp(_targetEL, false)
17412605Sgiacomo.travaglini@arm.com    {}
17512605Sgiacomo.travaglini@arm.com
17612605Sgiacomo.travaglini@arm.com    void operator()(ThreadContext* tc) override;
17712605Sgiacomo.travaglini@arm.com};
17812605Sgiacomo.travaglini@arm.com
17912605Sgiacomo.travaglini@arm.com/** TLB Invalidate by VA, All ASID */
18012605Sgiacomo.travaglini@arm.comclass TLBIMVAA : public TLBIOp
18112605Sgiacomo.travaglini@arm.com{
18212605Sgiacomo.travaglini@arm.com  public:
18312605Sgiacomo.travaglini@arm.com    TLBIMVAA(ExceptionLevel _targetEL, bool _secure,
18413882Sgiacomo.travaglini@arm.com             Addr _addr)
18513882Sgiacomo.travaglini@arm.com      : TLBIOp(_targetEL, _secure), addr(_addr)
18612605Sgiacomo.travaglini@arm.com    {}
18712605Sgiacomo.travaglini@arm.com
18812605Sgiacomo.travaglini@arm.com    void operator()(ThreadContext* tc) override;
18912605Sgiacomo.travaglini@arm.com
19012605Sgiacomo.travaglini@arm.com  protected:
19112605Sgiacomo.travaglini@arm.com    Addr addr;
19212605Sgiacomo.travaglini@arm.com};
19312605Sgiacomo.travaglini@arm.com
19412605Sgiacomo.travaglini@arm.com/** TLB Invalidate by VA */
19512605Sgiacomo.travaglini@arm.comclass TLBIMVA : public TLBIOp
19612605Sgiacomo.travaglini@arm.com{
19712605Sgiacomo.travaglini@arm.com  public:
19812605Sgiacomo.travaglini@arm.com    TLBIMVA(ExceptionLevel _targetEL, bool _secure,
19912605Sgiacomo.travaglini@arm.com            Addr _addr, uint16_t _asid)
20012605Sgiacomo.travaglini@arm.com      : TLBIOp(_targetEL, _secure), addr(_addr), asid(_asid)
20112605Sgiacomo.travaglini@arm.com    {}
20212605Sgiacomo.travaglini@arm.com
20312605Sgiacomo.travaglini@arm.com    void operator()(ThreadContext* tc) override;
20412605Sgiacomo.travaglini@arm.com
20512605Sgiacomo.travaglini@arm.com  protected:
20612605Sgiacomo.travaglini@arm.com    Addr addr;
20712605Sgiacomo.travaglini@arm.com    uint16_t asid;
20812605Sgiacomo.travaglini@arm.com};
20912605Sgiacomo.travaglini@arm.com
21012605Sgiacomo.travaglini@arm.com/** Instruction TLB Invalidate by VA */
21112605Sgiacomo.travaglini@arm.comclass ITLBIMVA : public TLBIOp
21212605Sgiacomo.travaglini@arm.com{
21312605Sgiacomo.travaglini@arm.com  public:
21412605Sgiacomo.travaglini@arm.com    ITLBIMVA(ExceptionLevel _targetEL, bool _secure,
21512605Sgiacomo.travaglini@arm.com             Addr _addr, uint16_t _asid)
21612605Sgiacomo.travaglini@arm.com      : TLBIOp(_targetEL, _secure), addr(_addr), asid(_asid)
21712605Sgiacomo.travaglini@arm.com    {}
21812605Sgiacomo.travaglini@arm.com
21912605Sgiacomo.travaglini@arm.com    void broadcast(ThreadContext *tc) = delete;
22012605Sgiacomo.travaglini@arm.com
22112605Sgiacomo.travaglini@arm.com    void operator()(ThreadContext* tc) override;
22212605Sgiacomo.travaglini@arm.com
22312605Sgiacomo.travaglini@arm.com  protected:
22412605Sgiacomo.travaglini@arm.com    Addr addr;
22512605Sgiacomo.travaglini@arm.com    uint16_t asid;
22612605Sgiacomo.travaglini@arm.com};
22712605Sgiacomo.travaglini@arm.com
22812605Sgiacomo.travaglini@arm.com/** Data TLB Invalidate by VA */
22912605Sgiacomo.travaglini@arm.comclass DTLBIMVA : public TLBIOp
23012605Sgiacomo.travaglini@arm.com{
23112605Sgiacomo.travaglini@arm.com  public:
23212605Sgiacomo.travaglini@arm.com    DTLBIMVA(ExceptionLevel _targetEL, bool _secure,
23312605Sgiacomo.travaglini@arm.com             Addr _addr, uint16_t _asid)
23412605Sgiacomo.travaglini@arm.com      : TLBIOp(_targetEL, _secure), addr(_addr), asid(_asid)
23512605Sgiacomo.travaglini@arm.com    {}
23612605Sgiacomo.travaglini@arm.com
23712605Sgiacomo.travaglini@arm.com    void broadcast(ThreadContext *tc) = delete;
23812605Sgiacomo.travaglini@arm.com
23912605Sgiacomo.travaglini@arm.com    void operator()(ThreadContext* tc) override;
24012605Sgiacomo.travaglini@arm.com
24112605Sgiacomo.travaglini@arm.com  protected:
24212605Sgiacomo.travaglini@arm.com    Addr addr;
24312605Sgiacomo.travaglini@arm.com    uint16_t asid;
24412605Sgiacomo.travaglini@arm.com};
24512605Sgiacomo.travaglini@arm.com
24612605Sgiacomo.travaglini@arm.com/** TLB Invalidate by Intermediate Physical Address */
24712605Sgiacomo.travaglini@arm.comclass TLBIIPA : public TLBIOp
24812605Sgiacomo.travaglini@arm.com{
24912605Sgiacomo.travaglini@arm.com  public:
25012605Sgiacomo.travaglini@arm.com    TLBIIPA(ExceptionLevel _targetEL, bool _secure, Addr _addr)
25112605Sgiacomo.travaglini@arm.com      : TLBIOp(_targetEL, _secure), addr(_addr)
25212605Sgiacomo.travaglini@arm.com    {}
25312605Sgiacomo.travaglini@arm.com
25412605Sgiacomo.travaglini@arm.com    void operator()(ThreadContext* tc) override;
25512605Sgiacomo.travaglini@arm.com
25612605Sgiacomo.travaglini@arm.com  protected:
25712605Sgiacomo.travaglini@arm.com    Addr addr;
25812605Sgiacomo.travaglini@arm.com};
25912605Sgiacomo.travaglini@arm.com
26012605Sgiacomo.travaglini@arm.com} // namespace ArmISA
26112605Sgiacomo.travaglini@arm.com
26212605Sgiacomo.travaglini@arm.com#endif //__ARCH_ARM_TLBI_HH__
263