summaryrefslogtreecommitdiff
path: root/src/analysis/scan/patterns/backends/bitap-int.h
blob: ea739b4e6456428fa98288c9a72ed4a4bbbbe865 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132

/* Chrysalide - Outil d'analyse de fichiers binaires
 * bitap-int.h - prototypes internes pour la méthode de recherche basée sur l'algorithme Bitap
 *
 * Copyright (C) 2022 Cyrille Bagard
 *
 *  This file is part of Chrysalide.
 *
 *  Chrysalide is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  Chrysalide is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
 */


#ifndef _ANALYSIS_SCAN_PATTERNS_BACKENDS_BITAP_INT_H
#define _ANALYSIS_SCAN_PATTERNS_BACKENDS_BITAP_INT_H


#include "bitap.h"


#include <immintrin.h>


#include "../backend-int.h"
#include "../../../../common/cpu.h"
#include "../../../../../config.h"



#define BITAP_ATOM_SIZE 7


#ifdef HAVE_AVX2

/* Suivi d'un groupe de chaînes */
typedef struct _grouped_strings_avx2_t
{
    __m256i pattern_masks[256];             /* Programmation de détections */
    __m256i found_masks;                    /* Masques multiples d'alerte  */

    __m256i R;                              /* Résultats courants          */

    size_t m[32];                           /* Taille des chaînes          */

    patid_t found_id[32];                   /* Indice des résultats        */

    size_t available;                       /* Nombre de places disponibles*/
    size_t used;                            /* Quantité de places utilisées*/

} grouped_strings_avx2_t;

/* Suivi de l'ensemble de chaînes */
typedef struct _group_manager_avx2_t
{
    grouped_strings_avx2_t **strings_8;     /* Chaînes de taille 8 max     */
    size_t count_8;                         /* Quantité de ces chaînes     */

} group_manager_avx2_t;

#endif

#ifdef HAVE_AVX512_F

/* Suivi d'un groupe de chaînes */
typedef struct _grouped_strings_avx512_t
{
    __m512i pattern_masks[256];             /* Programmation de détections */
    __m512i found_masks;                    /* Masques multiples d'alerte  */

    __m512i R;                              /* Résultats courants          */

    size_t m[64];                           /* Taille des chaînes          */

    patid_t found_id[64];                   /* Indice des résultats        */

    size_t used;                            /* Quantité de places utilisées*/
    size_t available;                       /* Nombre de places disponibles*/

} grouped_strings_avx512_t;

/* Suivi de l'ensemble de chaînes */
typedef struct _group_manager_avx512_t
{
    grouped_strings_avx512_t **strings_8;   /* Chaînes de taille 8 max     */
    size_t count_8;                         /* Quantité de ces chaînes     */

} group_manager_avx512_t;

#endif


/* Méthode de recherche basée sur l'algorithme Bitap (instance) */
struct _GBitapBackend
{
    GEngineBackend parent;                  /* A laisser en premier        */

    CPUSMIDFeature optimization;            /* Mode de calculs             */

#if defined HAVE_AVX2 || defined HAVE_AVX512_F
    union
    {
#   ifdef HAVE_AVX2
        group_manager_avx2_t manager_avx2;  /* Gestionnaire pour AVX2      */
#   endif
#   ifdef HAVE_AVX512_F
        group_manager_avx512_t manager_avx512;/* Gestionnaire pour AVX-512 */
#   endif
    };
#endif

};

/* Méthode de recherche basée sur l'algorithme Bitap (classe) */
struct _GBitapBackendClass
{
    GEngineBackendClass parent;             /* A laisser en premier        */

};



#endif  /* _ANALYSIS_SCAN_PATTERNS_BACKENDS_BITAP_INT_H */