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

list_debug.c (1897B)


      1/*
      2 * Copyright 2006, Red Hat, Inc., Dave Jones
      3 * Released under the General Public License (GPL).
      4 *
      5 * This file contains the linked list validation for DEBUG_LIST.
      6 */
      7
      8#include <linux/export.h>
      9#include <linux/list.h>
     10#include <linux/bug.h>
     11#include <linux/kernel.h>
     12#include <linux/rculist.h>
     13
     14/*
     15 * Check that the data structures for the list manipulations are reasonably
     16 * valid. Failures here indicate memory corruption (and possibly an exploit
     17 * attempt).
     18 */
     19
     20bool __list_add_valid(struct list_head *new, struct list_head *prev,
     21		      struct list_head *next)
     22{
     23	if (CHECK_DATA_CORRUPTION(next->prev != prev,
     24			"list_add corruption. next->prev should be prev (%px), but was %px. (next=%px).\n",
     25			prev, next->prev, next) ||
     26	    CHECK_DATA_CORRUPTION(prev->next != next,
     27			"list_add corruption. prev->next should be next (%px), but was %px. (prev=%px).\n",
     28			next, prev->next, prev) ||
     29	    CHECK_DATA_CORRUPTION(new == prev || new == next,
     30			"list_add double add: new=%px, prev=%px, next=%px.\n",
     31			new, prev, next))
     32		return false;
     33
     34	return true;
     35}
     36EXPORT_SYMBOL(__list_add_valid);
     37
     38bool __list_del_entry_valid(struct list_head *entry)
     39{
     40	struct list_head *prev, *next;
     41
     42	prev = entry->prev;
     43	next = entry->next;
     44
     45	if (CHECK_DATA_CORRUPTION(next == LIST_POISON1,
     46			"list_del corruption, %px->next is LIST_POISON1 (%px)\n",
     47			entry, LIST_POISON1) ||
     48	    CHECK_DATA_CORRUPTION(prev == LIST_POISON2,
     49			"list_del corruption, %px->prev is LIST_POISON2 (%px)\n",
     50			entry, LIST_POISON2) ||
     51	    CHECK_DATA_CORRUPTION(prev->next != entry,
     52			"list_del corruption. prev->next should be %px, but was %px. (prev=%px)\n",
     53			entry, prev->next, prev) ||
     54	    CHECK_DATA_CORRUPTION(next->prev != entry,
     55			"list_del corruption. next->prev should be %px, but was %px. (next=%px)\n",
     56			entry, next->prev, next))
     57		return false;
     58
     59	return true;
     60
     61}
     62EXPORT_SYMBOL(__list_del_entry_valid);