|
Packit |
b1f7ae |
/*
|
|
Packit |
b1f7ae |
* Copyright (c) 2014-2017, Intel Corporation
|
|
Packit |
b1f7ae |
*
|
|
Packit |
b1f7ae |
* Redistribution and use in source and binary forms, with or without
|
|
Packit |
b1f7ae |
* modification, are permitted provided that the following conditions are met:
|
|
Packit |
b1f7ae |
*
|
|
Packit |
b1f7ae |
* * Redistributions of source code must retain the above copyright notice,
|
|
Packit |
b1f7ae |
* this list of conditions and the following disclaimer.
|
|
Packit |
b1f7ae |
* * Redistributions in binary form must reproduce the above copyright notice,
|
|
Packit |
b1f7ae |
* this list of conditions and the following disclaimer in the documentation
|
|
Packit |
b1f7ae |
* and/or other materials provided with the distribution.
|
|
Packit |
b1f7ae |
* * Neither the name of Intel Corporation nor the names of its contributors
|
|
Packit |
b1f7ae |
* may be used to endorse or promote products derived from this software
|
|
Packit |
b1f7ae |
* without specific prior written permission.
|
|
Packit |
b1f7ae |
*
|
|
Packit |
b1f7ae |
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
Packit |
b1f7ae |
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
Packit |
b1f7ae |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
Packit |
b1f7ae |
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
Packit |
b1f7ae |
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
Packit |
b1f7ae |
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
Packit |
b1f7ae |
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
Packit |
b1f7ae |
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
Packit |
b1f7ae |
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
Packit |
b1f7ae |
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
Packit |
b1f7ae |
* POSSIBILITY OF SUCH DAMAGE.
|
|
Packit |
b1f7ae |
*/
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
#include "pt_packet_decoder.h"
|
|
Packit |
b1f7ae |
#include "pt_decoder_function.h"
|
|
Packit |
b1f7ae |
#include "pt_packet.h"
|
|
Packit |
b1f7ae |
#include "pt_sync.h"
|
|
Packit |
b1f7ae |
#include "pt_config.h"
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
#include <string.h>
|
|
Packit |
b1f7ae |
#include <stdlib.h>
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
int pt_pkt_decoder_init(struct pt_packet_decoder *decoder,
|
|
Packit |
b1f7ae |
const struct pt_config *config)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
int errcode;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (!decoder || !config)
|
|
Packit |
b1f7ae |
return -pte_invalid;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
memset(decoder, 0, sizeof(*decoder));
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
errcode = pt_config_from_user(&decoder->config, config);
|
|
Packit |
b1f7ae |
if (errcode < 0)
|
|
Packit |
b1f7ae |
return errcode;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return 0;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
struct pt_packet_decoder *pt_pkt_alloc_decoder(const struct pt_config *config)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
struct pt_packet_decoder *decoder;
|
|
Packit |
b1f7ae |
int errcode;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
decoder = malloc(sizeof(*decoder));
|
|
Packit |
b1f7ae |
if (!decoder)
|
|
Packit |
b1f7ae |
return NULL;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
errcode = pt_pkt_decoder_init(decoder, config);
|
|
Packit |
b1f7ae |
if (errcode < 0) {
|
|
Packit |
b1f7ae |
free(decoder);
|
|
Packit |
b1f7ae |
return NULL;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return decoder;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
void pt_pkt_decoder_fini(struct pt_packet_decoder *decoder)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
(void) decoder;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
/* Nothing to do. */
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
void pt_pkt_free_decoder(struct pt_packet_decoder *decoder)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
pt_pkt_decoder_fini(decoder);
|
|
Packit |
b1f7ae |
free(decoder);
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
int pt_pkt_sync_forward(struct pt_packet_decoder *decoder)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
const uint8_t *pos, *sync;
|
|
Packit |
b1f7ae |
int errcode;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (!decoder)
|
|
Packit |
b1f7ae |
return -pte_invalid;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
sync = decoder->sync;
|
|
Packit |
b1f7ae |
pos = decoder->pos;
|
|
Packit |
b1f7ae |
if (!pos)
|
|
Packit |
b1f7ae |
pos = decoder->config.begin;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (pos == sync)
|
|
Packit |
b1f7ae |
pos += ptps_psb;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
errcode = pt_sync_forward(&sync, pos, &decoder->config);
|
|
Packit |
b1f7ae |
if (errcode < 0)
|
|
Packit |
b1f7ae |
return errcode;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
decoder->sync = sync;
|
|
Packit |
b1f7ae |
decoder->pos = sync;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return 0;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
int pt_pkt_sync_backward(struct pt_packet_decoder *decoder)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
const uint8_t *pos, *sync;
|
|
Packit |
b1f7ae |
int errcode;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (!decoder)
|
|
Packit |
b1f7ae |
return -pte_invalid;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
pos = decoder->pos;
|
|
Packit |
b1f7ae |
if (!pos)
|
|
Packit |
b1f7ae |
pos = decoder->config.end;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
errcode = pt_sync_backward(&sync, pos, &decoder->config);
|
|
Packit |
b1f7ae |
if (errcode < 0)
|
|
Packit |
b1f7ae |
return errcode;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
decoder->sync = sync;
|
|
Packit |
b1f7ae |
decoder->pos = sync;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return 0;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
int pt_pkt_sync_set(struct pt_packet_decoder *decoder, uint64_t offset)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
const uint8_t *begin, *end, *pos;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (!decoder)
|
|
Packit |
b1f7ae |
return -pte_invalid;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
begin = decoder->config.begin;
|
|
Packit |
b1f7ae |
end = decoder->config.end;
|
|
Packit |
b1f7ae |
pos = begin + offset;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (end < pos || pos < begin)
|
|
Packit |
b1f7ae |
return -pte_eos;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
decoder->sync = pos;
|
|
Packit |
b1f7ae |
decoder->pos = pos;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return 0;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
int pt_pkt_get_offset(struct pt_packet_decoder *decoder, uint64_t *offset)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
const uint8_t *begin, *pos;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (!decoder || !offset)
|
|
Packit |
b1f7ae |
return -pte_invalid;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
begin = decoder->config.begin;
|
|
Packit |
b1f7ae |
pos = decoder->pos;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (!pos)
|
|
Packit |
b1f7ae |
return -pte_nosync;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
*offset = pos - begin;
|
|
Packit |
b1f7ae |
return 0;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
int pt_pkt_get_sync_offset(struct pt_packet_decoder *decoder, uint64_t *offset)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
const uint8_t *begin, *sync;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (!decoder || !offset)
|
|
Packit |
b1f7ae |
return -pte_invalid;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
begin = decoder->config.begin;
|
|
Packit |
b1f7ae |
sync = decoder->sync;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (!sync)
|
|
Packit |
b1f7ae |
return -pte_nosync;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
*offset = sync - begin;
|
|
Packit |
b1f7ae |
return 0;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
const struct pt_config *
|
|
Packit |
b1f7ae |
pt_pkt_get_config(const struct pt_packet_decoder *decoder)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
if (!decoder)
|
|
Packit |
b1f7ae |
return NULL;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return &decoder->config;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
static inline int pkt_to_user(struct pt_packet *upkt, size_t size,
|
|
Packit |
b1f7ae |
const struct pt_packet *pkt)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
if (!upkt || !pkt)
|
|
Packit |
b1f7ae |
return -pte_internal;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (upkt == pkt)
|
|
Packit |
b1f7ae |
return 0;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
/* Zero out any unknown bytes. */
|
|
Packit |
b1f7ae |
if (sizeof(*pkt) < size) {
|
|
Packit |
b1f7ae |
memset(upkt + sizeof(*pkt), 0, size - sizeof(*pkt));
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
size = sizeof(*pkt);
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
memcpy(upkt, pkt, size);
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return 0;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
int pt_pkt_next(struct pt_packet_decoder *decoder, struct pt_packet *packet,
|
|
Packit |
b1f7ae |
size_t psize)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
const struct pt_decoder_function *dfun;
|
|
Packit |
b1f7ae |
struct pt_packet pkt, *ppkt;
|
|
Packit |
b1f7ae |
int errcode, size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (!packet || !decoder)
|
|
Packit |
b1f7ae |
return -pte_invalid;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
ppkt = psize == sizeof(pkt) ? packet : &pk;;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
errcode = pt_df_fetch(&dfun, decoder->pos, &decoder->config);
|
|
Packit |
b1f7ae |
if (errcode < 0)
|
|
Packit |
b1f7ae |
return errcode;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (!dfun)
|
|
Packit |
b1f7ae |
return -pte_internal;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (!dfun->packet)
|
|
Packit |
b1f7ae |
return -pte_internal;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
size = dfun->packet(decoder, ppkt);
|
|
Packit |
b1f7ae |
if (size < 0)
|
|
Packit |
b1f7ae |
return size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
errcode = pkt_to_user(packet, psize, ppkt);
|
|
Packit |
b1f7ae |
if (errcode < 0)
|
|
Packit |
b1f7ae |
return errcode;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
decoder->pos += size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return size;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
int pt_pkt_decode_unknown(struct pt_packet_decoder *decoder,
|
|
Packit |
b1f7ae |
struct pt_packet *packet)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
int size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (!decoder)
|
|
Packit |
b1f7ae |
return -pte_internal;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
size = pt_pkt_read_unknown(packet, decoder->pos, &decoder->config);
|
|
Packit |
b1f7ae |
if (size < 0)
|
|
Packit |
b1f7ae |
return size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return size;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
int pt_pkt_decode_pad(struct pt_packet_decoder *decoder,
|
|
Packit |
b1f7ae |
struct pt_packet *packet)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
(void) decoder;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (!packet)
|
|
Packit |
b1f7ae |
return -pte_internal;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
packet->type = ppt_pad;
|
|
Packit |
b1f7ae |
packet->size = ptps_pad;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return ptps_pad;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
int pt_pkt_decode_psb(struct pt_packet_decoder *decoder,
|
|
Packit |
b1f7ae |
struct pt_packet *packet)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
int size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (!decoder)
|
|
Packit |
b1f7ae |
return -pte_internal;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
size = pt_pkt_read_psb(decoder->pos, &decoder->config);
|
|
Packit |
b1f7ae |
if (size < 0)
|
|
Packit |
b1f7ae |
return size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
packet->type = ppt_psb;
|
|
Packit |
b1f7ae |
packet->size = (uint8_t) size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return size;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
int pt_pkt_decode_tip(struct pt_packet_decoder *decoder,
|
|
Packit |
b1f7ae |
struct pt_packet *packet)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
int size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (!decoder || !packet)
|
|
Packit |
b1f7ae |
return -pte_internal;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
size = pt_pkt_read_ip(&packet->payload.ip, decoder->pos,
|
|
Packit |
b1f7ae |
&decoder->config);
|
|
Packit |
b1f7ae |
if (size < 0)
|
|
Packit |
b1f7ae |
return size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
packet->type = ppt_tip;
|
|
Packit |
b1f7ae |
packet->size = (uint8_t) size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return size;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
int pt_pkt_decode_tnt_8(struct pt_packet_decoder *decoder,
|
|
Packit |
b1f7ae |
struct pt_packet *packet)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
int size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (!decoder || !packet)
|
|
Packit |
b1f7ae |
return -pte_internal;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
size = pt_pkt_read_tnt_8(&packet->payload.tnt, decoder->pos,
|
|
Packit |
b1f7ae |
&decoder->config);
|
|
Packit |
b1f7ae |
if (size < 0)
|
|
Packit |
b1f7ae |
return size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
packet->type = ppt_tnt_8;
|
|
Packit |
b1f7ae |
packet->size = (uint8_t) size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return size;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
int pt_pkt_decode_tnt_64(struct pt_packet_decoder *decoder,
|
|
Packit |
b1f7ae |
struct pt_packet *packet)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
int size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (!decoder || !packet)
|
|
Packit |
b1f7ae |
return -pte_internal;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
size = pt_pkt_read_tnt_64(&packet->payload.tnt, decoder->pos,
|
|
Packit |
b1f7ae |
&decoder->config);
|
|
Packit |
b1f7ae |
if (size < 0)
|
|
Packit |
b1f7ae |
return size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
packet->type = ppt_tnt_64;
|
|
Packit |
b1f7ae |
packet->size = (uint8_t) size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return size;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
int pt_pkt_decode_tip_pge(struct pt_packet_decoder *decoder,
|
|
Packit |
b1f7ae |
struct pt_packet *packet)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
int size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (!decoder || !packet)
|
|
Packit |
b1f7ae |
return -pte_internal;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
size = pt_pkt_read_ip(&packet->payload.ip, decoder->pos,
|
|
Packit |
b1f7ae |
&decoder->config);
|
|
Packit |
b1f7ae |
if (size < 0)
|
|
Packit |
b1f7ae |
return size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
packet->type = ppt_tip_pge;
|
|
Packit |
b1f7ae |
packet->size = (uint8_t) size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return size;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
int pt_pkt_decode_tip_pgd(struct pt_packet_decoder *decoder,
|
|
Packit |
b1f7ae |
struct pt_packet *packet)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
int size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (!decoder || !packet)
|
|
Packit |
b1f7ae |
return -pte_internal;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
size = pt_pkt_read_ip(&packet->payload.ip, decoder->pos,
|
|
Packit |
b1f7ae |
&decoder->config);
|
|
Packit |
b1f7ae |
if (size < 0)
|
|
Packit |
b1f7ae |
return size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
packet->type = ppt_tip_pgd;
|
|
Packit |
b1f7ae |
packet->size = (uint8_t) size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return size;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
int pt_pkt_decode_fup(struct pt_packet_decoder *decoder,
|
|
Packit |
b1f7ae |
struct pt_packet *packet)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
int size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (!decoder || !packet)
|
|
Packit |
b1f7ae |
return -pte_internal;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
size = pt_pkt_read_ip(&packet->payload.ip, decoder->pos,
|
|
Packit |
b1f7ae |
&decoder->config);
|
|
Packit |
b1f7ae |
if (size < 0)
|
|
Packit |
b1f7ae |
return size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
packet->type = ppt_fup;
|
|
Packit |
b1f7ae |
packet->size = (uint8_t) size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return size;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
int pt_pkt_decode_pip(struct pt_packet_decoder *decoder,
|
|
Packit |
b1f7ae |
struct pt_packet *packet)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
int size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (!decoder || !packet)
|
|
Packit |
b1f7ae |
return -pte_internal;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
size = pt_pkt_read_pip(&packet->payload.pip, decoder->pos,
|
|
Packit |
b1f7ae |
&decoder->config);
|
|
Packit |
b1f7ae |
if (size < 0)
|
|
Packit |
b1f7ae |
return size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
packet->type = ppt_pip;
|
|
Packit |
b1f7ae |
packet->size = (uint8_t) size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return size;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
int pt_pkt_decode_ovf(struct pt_packet_decoder *decoder,
|
|
Packit |
b1f7ae |
struct pt_packet *packet)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
(void) decoder;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (!packet)
|
|
Packit |
b1f7ae |
return -pte_internal;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
packet->type = ppt_ovf;
|
|
Packit |
b1f7ae |
packet->size = ptps_ovf;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return ptps_ovf;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
int pt_pkt_decode_mode(struct pt_packet_decoder *decoder,
|
|
Packit |
b1f7ae |
struct pt_packet *packet)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
int size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (!decoder || !packet)
|
|
Packit |
b1f7ae |
return -pte_internal;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
size = pt_pkt_read_mode(&packet->payload.mode, decoder->pos,
|
|
Packit |
b1f7ae |
&decoder->config);
|
|
Packit |
b1f7ae |
if (size < 0)
|
|
Packit |
b1f7ae |
return size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
packet->type = ppt_mode;
|
|
Packit |
b1f7ae |
packet->size = (uint8_t) size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return size;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
int pt_pkt_decode_psbend(struct pt_packet_decoder *decoder,
|
|
Packit |
b1f7ae |
struct pt_packet *packet)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
(void) decoder;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (!packet)
|
|
Packit |
b1f7ae |
return -pte_internal;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
packet->type = ppt_psbend;
|
|
Packit |
b1f7ae |
packet->size = ptps_psbend;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return ptps_psbend;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
int pt_pkt_decode_tsc(struct pt_packet_decoder *decoder,
|
|
Packit |
b1f7ae |
struct pt_packet *packet)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
int size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (!decoder || !packet)
|
|
Packit |
b1f7ae |
return -pte_internal;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
size = pt_pkt_read_tsc(&packet->payload.tsc, decoder->pos,
|
|
Packit |
b1f7ae |
&decoder->config);
|
|
Packit |
b1f7ae |
if (size < 0)
|
|
Packit |
b1f7ae |
return size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
packet->type = ppt_tsc;
|
|
Packit |
b1f7ae |
packet->size = (uint8_t) size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return size;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
int pt_pkt_decode_cbr(struct pt_packet_decoder *decoder,
|
|
Packit |
b1f7ae |
struct pt_packet *packet)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
int size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (!decoder || !packet)
|
|
Packit |
b1f7ae |
return -pte_internal;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
size = pt_pkt_read_cbr(&packet->payload.cbr, decoder->pos,
|
|
Packit |
b1f7ae |
&decoder->config);
|
|
Packit |
b1f7ae |
if (size < 0)
|
|
Packit |
b1f7ae |
return size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
packet->type = ppt_cbr;
|
|
Packit |
b1f7ae |
packet->size = (uint8_t) size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return size;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
int pt_pkt_decode_tma(struct pt_packet_decoder *decoder,
|
|
Packit |
b1f7ae |
struct pt_packet *packet)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
int size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (!decoder || !packet)
|
|
Packit |
b1f7ae |
return -pte_internal;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
size = pt_pkt_read_tma(&packet->payload.tma, decoder->pos,
|
|
Packit |
b1f7ae |
&decoder->config);
|
|
Packit |
b1f7ae |
if (size < 0)
|
|
Packit |
b1f7ae |
return size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
packet->type = ppt_tma;
|
|
Packit |
b1f7ae |
packet->size = (uint8_t) size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return size;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
int pt_pkt_decode_mtc(struct pt_packet_decoder *decoder,
|
|
Packit |
b1f7ae |
struct pt_packet *packet)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
int size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (!decoder || !packet)
|
|
Packit |
b1f7ae |
return -pte_internal;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
size = pt_pkt_read_mtc(&packet->payload.mtc, decoder->pos,
|
|
Packit |
b1f7ae |
&decoder->config);
|
|
Packit |
b1f7ae |
if (size < 0)
|
|
Packit |
b1f7ae |
return size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
packet->type = ppt_mtc;
|
|
Packit |
b1f7ae |
packet->size = (uint8_t) size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return size;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
int pt_pkt_decode_cyc(struct pt_packet_decoder *decoder,
|
|
Packit |
b1f7ae |
struct pt_packet *packet)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
int size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (!decoder || !packet)
|
|
Packit |
b1f7ae |
return -pte_internal;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
size = pt_pkt_read_cyc(&packet->payload.cyc, decoder->pos,
|
|
Packit |
b1f7ae |
&decoder->config);
|
|
Packit |
b1f7ae |
if (size < 0)
|
|
Packit |
b1f7ae |
return size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
packet->type = ppt_cyc;
|
|
Packit |
b1f7ae |
packet->size = (uint8_t) size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return size;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
int pt_pkt_decode_stop(struct pt_packet_decoder *decoder,
|
|
Packit |
b1f7ae |
struct pt_packet *packet)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
(void) decoder;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (!packet)
|
|
Packit |
b1f7ae |
return -pte_internal;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
packet->type = ppt_stop;
|
|
Packit |
b1f7ae |
packet->size = ptps_stop;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return ptps_stop;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
int pt_pkt_decode_vmcs(struct pt_packet_decoder *decoder,
|
|
Packit |
b1f7ae |
struct pt_packet *packet)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
int size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (!decoder || !packet)
|
|
Packit |
b1f7ae |
return -pte_internal;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
size = pt_pkt_read_vmcs(&packet->payload.vmcs, decoder->pos,
|
|
Packit |
b1f7ae |
&decoder->config);
|
|
Packit |
b1f7ae |
if (size < 0)
|
|
Packit |
b1f7ae |
return size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
packet->type = ppt_vmcs;
|
|
Packit |
b1f7ae |
packet->size = (uint8_t) size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return size;
|
|
Packit |
b1f7ae |
}
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
int pt_pkt_decode_mnt(struct pt_packet_decoder *decoder,
|
|
Packit |
b1f7ae |
struct pt_packet *packet)
|
|
Packit |
b1f7ae |
{
|
|
Packit |
b1f7ae |
int size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
if (!decoder || !packet)
|
|
Packit |
b1f7ae |
return -pte_internal;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
size = pt_pkt_read_mnt(&packet->payload.mnt, decoder->pos,
|
|
Packit |
b1f7ae |
&decoder->config);
|
|
Packit |
b1f7ae |
if (size < 0)
|
|
Packit |
b1f7ae |
return size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
packet->type = ppt_mnt;
|
|
Packit |
b1f7ae |
packet->size = (uint8_t) size;
|
|
Packit |
b1f7ae |
|
|
Packit |
b1f7ae |
return size;
|
|
Packit |
b1f7ae |
}
|