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

pstack.c (1702B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * Simple pointer stack
      4 *
      5 * (c) 2010 Arnaldo Carvalho de Melo <acme@redhat.com>
      6 */
      7
      8#include "pstack.h"
      9#include "debug.h"
     10#include <linux/kernel.h>
     11#include <linux/zalloc.h>
     12#include <stdlib.h>
     13#include <string.h>
     14
     15struct pstack {
     16	unsigned short	top;
     17	unsigned short	max_nr_entries;
     18	void		*entries[];
     19};
     20
     21struct pstack *pstack__new(unsigned short max_nr_entries)
     22{
     23	struct pstack *pstack = zalloc((sizeof(*pstack) +
     24				       max_nr_entries * sizeof(void *)));
     25	if (pstack != NULL)
     26		pstack->max_nr_entries = max_nr_entries;
     27	return pstack;
     28}
     29
     30void pstack__delete(struct pstack *pstack)
     31{
     32	free(pstack);
     33}
     34
     35bool pstack__empty(const struct pstack *pstack)
     36{
     37	return pstack->top == 0;
     38}
     39
     40void pstack__remove(struct pstack *pstack, void *key)
     41{
     42	unsigned short i = pstack->top, last_index = pstack->top - 1;
     43
     44	while (i-- != 0) {
     45		if (pstack->entries[i] == key) {
     46			if (i < last_index)
     47				memmove(pstack->entries + i,
     48					pstack->entries + i + 1,
     49					(last_index - i) * sizeof(void *));
     50			--pstack->top;
     51			return;
     52		}
     53	}
     54	pr_err("%s: %p not on the pstack!\n", __func__, key);
     55}
     56
     57void pstack__push(struct pstack *pstack, void *key)
     58{
     59	if (pstack->top == pstack->max_nr_entries) {
     60		pr_err("%s: top=%d, overflow!\n", __func__, pstack->top);
     61		return;
     62	}
     63	pstack->entries[pstack->top++] = key;
     64}
     65
     66void *pstack__pop(struct pstack *pstack)
     67{
     68	void *ret;
     69
     70	if (pstack->top == 0) {
     71		pr_err("%s: underflow!\n", __func__);
     72		return NULL;
     73	}
     74
     75	ret = pstack->entries[--pstack->top];
     76	pstack->entries[pstack->top] = NULL;
     77	return ret;
     78}
     79
     80void *pstack__peek(struct pstack *pstack)
     81{
     82	if (pstack->top == 0)
     83		return NULL;
     84	return pstack->entries[pstack->top - 1];
     85}