+// SPDX-License-Identifier: GPL-2.0-or-later
+
/*
* Copyright (C) 2016-2020 by Marc Schink <dev@zapb.de>
- *
- * This program 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 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
#include <stddef.h>
#include <stdint.h>
#include <helper/log.h>
#include <helper/binarybuffer.h>
#include <helper/command.h>
#include <rtt/rtt.h>
+#include <target/rtt.h>
#include "target.h"
target_addr_t *address, size_t size, const char *id, bool *found,
void *user_data)
{
+ target_addr_t address_end = *address + size;
uint8_t buf[1024];
*found = false;
- size_t j = 0;
- size_t cb_offset = 0;
+ size_t id_matched_length = 0;
const size_t id_length = strlen(id);
LOG_INFO("rtt: Searching for control block '%s'", id);
- for (target_addr_t addr = 0; addr < size; addr = addr + sizeof(buf)) {
+ for (target_addr_t addr = *address; addr < address_end; addr += sizeof(buf)) {
int ret;
- const size_t buf_size = MIN(sizeof(buf), size - addr);
- ret = target_read_buffer(target, *address + addr, buf_size, buf);
+ const size_t buf_size = MIN(sizeof(buf), address_end - addr);
+ ret = target_read_buffer(target, addr, buf_size, buf);
if (ret != ERROR_OK)
return ret;
- size_t start = 0;
- size_t i = 0;
-
- while (i < buf_size) {
- if (buf[i] != id[j]) {
- start++;
- cb_offset++;
- i = start;
- j = 0;
-
- continue;
+ for (size_t buf_off = 0; buf_off < buf_size; buf_off++) {
+ if (id_matched_length > 0 &&
+ buf[buf_off] != id[id_matched_length]) {
+ /* Start from beginning */
+ id_matched_length = 0;
}
- i++;
- j++;
+ if (buf[buf_off] == id[id_matched_length])
+ id_matched_length++;
- if (j == id_length) {
- *address = *address + cb_offset;
+ if (id_matched_length == id_length) {
+ *address = addr + buf_off + 1 - id_length;
*found = true;
return ERROR_OK;
}