1 /*
2  * Copyright (c) 2014, Mentor Graphics Corporation
3  * Copyright 2019 NXP
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions are met:
8  *
9  * 1. Redistributions of source code must retain the above copyright notice,
10  *    this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright notice,
12  *    this list of conditions and the following disclaimer in the documentation
13  *    and/or other materials provided with the distribution.
14  * 3. Neither the name of Mentor Graphics Corporation nor the names of its
15  *    contributors may be used to endorse or promote products derived from this
16  *    software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28  * POSSIBILITY OF SUCH DAMAGE.
29  */
30 
31 /**************************************************************************
32  * FILE NAME
33  *
34  *       llist.c
35  *
36  * COMPONENT
37  *
38  *         OpenAMP stack.
39  *
40  * DESCRIPTION
41  *
42  *       Source file for basic linked list service.
43  *
44  **************************************************************************/
45 #include "llist.h"
46 
47 #define LIST_NULL ((void *)0)
48 /*!
49  * add_to_list
50  *
51  * Places new element at the start of the list.
52  *
53  * @param head - list head
54  * @param node - new element to add
55  *
56  */
add_to_list(struct llist ** head,struct llist * node)57 void add_to_list(struct llist **head, struct llist *node)
58 {
59     if (node == LIST_NULL)
60     {
61         return; /* coco validated: line never reached, add_to_list() is called from rpmsg_lite_create_ept() only and the
62                    node parameter not being null check is done before passing the parameter */
63     }
64 
65     if (*head != LIST_NULL)
66     {
67         /* Place the new element at the start of list. */
68         node->next    = *head;
69         node->prev    = LIST_NULL;
70         (*head)->prev = node;
71         *head         = node;
72     }
73     else
74     {
75         /* List is empty - assign new element to list head. */
76         *head         = node;
77         (*head)->next = LIST_NULL;
78         (*head)->prev = LIST_NULL;
79     }
80 }
81 
82 /*!
83  * remove_from_list
84  *
85  * Removes the given element from the list.
86  *
87  * @param head    - list head
88  * @param element - element to remove from list
89  *
90  */
remove_from_list(struct llist ** head,struct llist * node)91 void remove_from_list(struct llist **head, struct llist *node)
92 {
93     if ((*head == LIST_NULL) || (node == LIST_NULL))
94     {
95         return; /* coco validated: line never reached, remove_from_list() is called from rpmsg_lite_destroy_ept() only,
96                    the head and node parameters not being null check is done before passing these parameters */
97     }
98 
99     if (node == *head)
100     {
101         /* First element has to be removed. */
102         *head = (*head)->next;
103     }
104     else if (node->next == LIST_NULL)
105     {
106         /* Last element has to be removed. */
107         node->prev->next = node->next;
108     }
109     else
110     {
111         /* Intermediate element has to be removed. */
112         node->prev->next = node->next;
113         node->next->prev = node->prev;
114     }
115 }
116