source: trunk/kernel/kern/core.h @ 360

Last change on this file since 360 was 279, checked in by alain, 7 years ago

1) Introduce independant command fields for the various devices in the thread descriptor.
2) Introduce a new dev_pic_enable_ipi() function in the generic PIC device
3) Fix two bugs identified by Maxime in the scheduler initialisation, and in the sched_select().
4) fix several bugs in the TSAR hal_kentry.S.
5) Introduce a third kgiet segment (besides kdata and kcode) in the TSAR bootloader.

File size: 7.6 KB
RevLine 
[1]1/*
2 * core.h - core descriptor and associated access functions définition
[19]3 *
[1]4 * Authors  Ghassan Almaless (2008,2009,2010,2011,2012)
[68]5 *          Alain Greiner (2016,2017)
[1]6 *
7 * Copyright (c) UPMC Sorbonne Universites
8 *
9 * This file is part of ALMOS-MKH.
10 *
11 * ALMOS-MKH is free software; you can redistribute it and/or modify it
12 * under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; version 2.0 of the License.
14 *
15 * ALMOS-MKH is distributed in the hope that it will be useful, but
16 * WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18 * General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with ALMOS-MKH; if not, write to the Free Software Foundation,
22 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
23 */
24
25#ifndef _CORE_H_
26#define _CORE_H_
27
[14]28#include <kernel_config.h>
[1]29#include <hal_types.h>
30#include <list.h>
31#include <rpc.h>
32#include <scheduler.h>
33
34/****  Forward declarations  ****/
35
36struct thread_s;
[5]37struct chdev_s;
[188]38enum   pic_impl_e;
[1]39
40/****************************************************************************************
[5]41 * This structure defines the core descriptor.
[188]42 * Besides the core identifiers (gid,lid), it contains an embedded private scheduler.
43 * It contains an architecture specific extension to store the interrupt vector(s).
44 * The core_init()function must allocate memory for this extension, depending on the
45 * PIC device implementation type.
[1]46 ***************************************************************************************/
47
48typedef struct core_s
49{
50        lid_t               lid;            /*! core local index in cluster                */
[19]51        gid_t               gid;            /*! core global identifier (hardware index)    */
[1]52        uint64_t            cycles;         /*! total number of cycles (from hard reset)   */
53        uint32_t            time_stamp;     /*! previous time stamp (read from register)   */
54        uint32_t            ticks_nr;       /*! number of elapsed ticks                    */
55        uint32_t            ticks_period;   /*! number of cycles between two ticks         */
56        uint32_t            usage;          /*! cumulated busy_percent (idle / total)      */
57        uint32_t            spurious_irqs;  /*! for instrumentation...                     */
58        struct thread_s   * thread_idle;    /*! pointer on idle thread descriptor          */
[19]59        struct thread_s   * fpu_owner;      /*! pointer on current FPU owner thread        */
[1]60    uint32_t            rand_last;      /*! last computed random value                 */
61        scheduler_t         scheduler;      /*! embedded private scheduler                 */
62
[188]63    void              * pic_extend;     /*! PIC implementation specific extension      */
[19]64}
[1]65core_t;
66
[188]67/****************************************************************************************
[1]68 * This macro returns a pointer on the calling core descriptor.
[188]69 ***************************************************************************************/
[1]70
71#define CURRENT_CORE  (CURRENT_THREAD->core)
72
73/***************************************************************************************
[188]74 * This function initializes a core descriptor.
[1]75 * It makes the association [gid] <=> [lid], as defined in arch_info, via the
76 * boot_info_t structure build by the bootloader in each cluster.
[188]77 * It allocates memory for the PIC infrastructure specific core extension.
78 * It does NOT initialize the <thread_idle> and the <pic_extend> fields,
79 * that must be completed later.
[1]80 ***************************************************************************************
81 * @ core      : pointer on core descriptor to initialise.
[188]82 * @ lid       : local core index in cluster.
83 * @ gid       : global core identifier (hardware index).
[1]84 **************************************************************************************/
[188]85void core_init( core_t          * core,
86                lid_t             lid,
87                gid_t             gid );
[1]88
89/***************************************************************************************
90 * This function returns a pseudo random number from the core descriptor
91 * private random generator.
92 ***************************************************************************************
93 * @ core       : pointer on core descriptor.
94 * @ returns the pseudo random value.
95 **************************************************************************************/
96inline uint32_t core_get_rand( core_t * core );
97
98/***************************************************************************************
[101]99 * This function returns the current date (seconds & micro-seconds) from
100 * the 64 bits calling core cycles counter.
[1]101 ***************************************************************************************
102 * @ core      : pointer on core descriptor.
103 * @ tm_s      : number of seconds.
104 * @ tm_us     : number of micro-seconds.
105 **************************************************************************************/
106void core_get_time( core_t   * core,
107                    uint32_t * tm_s,
108                    uint32_t * tm_us );
109
110/***************************************************************************************
111 * This function must be called at each TICK.
112 * It updates the  cycles and ticks counter in the calling core descriptor.
113 * It handles all pending alarms depending on the ticks counter value.
[19]114 * It handles the scheduling, depending on the ticks counter value.
[1]115 * It handles the global DQDT update, depending on the ticks counter vakue.
116 ***************************************************************************************
117 * @ core       : pointer on core descriptor.
118 **************************************************************************************/
119void core_clock( core_t * core );
120
121/***************************************************************************************
[19]122 * This function updates the usage statistics for the calling core descriptor,
[1]123 * based on the ratio between the idle_ticks and total_ticks.
124 ***************************************************************************************
125 * @ core       : pointer on core descriptor.
126 **************************************************************************************/
127void core_compute_stats( core_t * core );
128
129/***************************************************************************************
[16]130 * This function reset the usage statistics.
[1]131 ***************************************************************************************
132 * @ core       : pointer on core descriptor.
133 **************************************************************************************/
134void core_reset_stats( core_t * core );
135
136/***************************************************************************************
137 * This function set/reset a selected entry in one interrupt vector for a remote core.
138 * The written value is an extended pointer on the "source" device (or the XPTR_NULL
[19]139 * value in case of reset). As it uses remote access, this function can be called by
[1]140 * any thread in any cluster.
141 ***************************************************************************************
[5]142 * @ core       : local pointer on the core descriptor.
[1]143 * @ irq_type   : type of IRQ (HWI/WTI/PTI).
144 * @ irq_id     : index in the IRQ vector.
[5]145 * @ chdev      : local pointer on the "source" chdev descriptor.
[1]146 **************************************************************************************/
[5]147void core_set_irq_vector_entry( core_t          * core,
148                                uint32_t          irq_type,
149                                uint32_t          irq_id,
150                                struct chdev_s  * chdev );
[1]151
152
153#endif  /* _CORE_H_ */
Note: See TracBrowser for help on using the repository browser.