cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

processor.h (3173B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * Process/processor support for the Hexagon architecture
      4 *
      5 * Copyright (c) 2010-2012, The Linux Foundation. All rights reserved.
      6 */
      7
      8#ifndef _ASM_PROCESSOR_H
      9#define _ASM_PROCESSOR_H
     10
     11#ifndef __ASSEMBLY__
     12
     13#include <asm/mem-layout.h>
     14#include <asm/registers.h>
     15#include <asm/hexagon_vm.h>
     16
     17/*  task_struct, defined elsewhere, is the "process descriptor" */
     18struct task_struct;
     19
     20extern void start_thread(struct pt_regs *, unsigned long, unsigned long);
     21
     22/*
     23 * thread_struct is supposed to be for context switch data.
     24 * Specifically, to hold the state necessary to perform switch_to...
     25 */
     26struct thread_struct {
     27	void *switch_sp;
     28};
     29
     30/*
     31 * initializes thread_struct
     32 * The only thing we have in there is switch_sp
     33 * which doesn't really need to be initialized.
     34 */
     35
     36#define INIT_THREAD { \
     37}
     38
     39#define cpu_relax() __vmyield()
     40
     41/*
     42 * Decides where the kernel will search for a free chunk of vm space during
     43 * mmaps.
     44 * See also arch_get_unmapped_area.
     45 * Doesn't affect if you have MAX_FIXED in the page flags set though...
     46 *
     47 * Apparently the convention is that ld.so will ask for "unmapped" private
     48 * memory to be allocated SOMEWHERE, but it also asks for memory explicitly
     49 * via MAP_FIXED at the lower * addresses starting at VA=0x0.
     50 *
     51 * If the two requests collide, you get authentic segfaulting action, so
     52 * you have to kick the "unmapped" base requests higher up.
     53 */
     54#define TASK_UNMAPPED_BASE	(PAGE_ALIGN(TASK_SIZE/3))
     55
     56
     57#define task_pt_regs(task) \
     58	((struct pt_regs *)(task_stack_page(task) + THREAD_SIZE) - 1)
     59
     60#define KSTK_EIP(tsk) (pt_elr(task_pt_regs(tsk)))
     61#define KSTK_ESP(tsk) (pt_psp(task_pt_regs(tsk)))
     62
     63/*  Free all resources held by a thread; defined in process.c  */
     64extern void release_thread(struct task_struct *dead_task);
     65
     66/* Get wait channel for task P.  */
     67extern unsigned long __get_wchan(struct task_struct *p);
     68
     69/*  The following stuff is pretty HEXAGON specific.  */
     70
     71/*  This is really just here for __switch_to.
     72    Offsets are pulled via asm-offsets.c  */
     73
     74/*
     75 * No real reason why VM and native switch stacks should be different.
     76 * Ultimately this should merge.  Note that Rev C. ABI called out only
     77 * R24-27 as callee saved GPRs needing explicit attention (R29-31 being
     78 * dealt with automagically by allocframe), but the current ABI has
     79 * more, R16-R27.  By saving more, the worst case is that we waste some
     80 * cycles if building with the old compilers.
     81 */
     82
     83struct hexagon_switch_stack {
     84	union {
     85		struct {
     86			unsigned long r16;
     87			unsigned long r17;
     88		};
     89		unsigned long long	r1716;
     90	};
     91	union {
     92		struct {
     93			unsigned long r18;
     94			unsigned long r19;
     95		};
     96		unsigned long long	r1918;
     97	};
     98	union {
     99		struct {
    100			unsigned long r20;
    101			unsigned long r21;
    102		};
    103		unsigned long long	r2120;
    104	};
    105	union {
    106		struct {
    107			unsigned long r22;
    108			unsigned long r23;
    109		};
    110		unsigned long long	r2322;
    111	};
    112	union {
    113		struct {
    114			unsigned long r24;
    115			unsigned long r25;
    116		};
    117		unsigned long long	r2524;
    118	};
    119	union {
    120		struct {
    121			unsigned long r26;
    122			unsigned long r27;
    123		};
    124		unsigned long long	r2726;
    125	};
    126
    127	unsigned long		fp;
    128	unsigned long		lr;
    129};
    130
    131#endif /* !__ASSEMBLY__ */
    132
    133#endif