gh.c revision 4f551c8f6b89902a83328fbf50585ec7ee03ed5a
17227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna/* 27227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * gh.c 37227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * 47227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * DSP-BIOS Bridge driver support functions for TI OMAP processors. 57227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * 67227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * Copyright (C) 2005-2006 Texas Instruments, Inc. 77227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * 87227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * This package is free software; you can redistribute it and/or modify 97227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * it under the terms of the GNU General Public License version 2 as 107227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * published by the Free Software Foundation. 117227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * 127227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 137227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 147227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 157227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna */ 167227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna 177227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna#include <dspbridge/std.h> 187227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna 197227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna#include <dspbridge/host_os.h> 207227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna 217227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna#include <dspbridge/gs.h> 227227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna 237227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna#include <dspbridge/gh.h> 247227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna 257227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Lunastruct element { 267227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna struct element *next; 277227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna u8 data[1]; 287227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna}; 297227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna 307227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Lunastruct gh_t_hash_tab { 317227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna u16 max_bucket; 327227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna u16 val_size; 337227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna struct element **buckets; 347227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna u16(*hash) (void *, u16); 357227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna bool(*match) (void *, void *); 367227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna void (*delete) (void *); 377227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna}; 387227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna 397227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Lunastatic void noop(void *p); 407227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Lunastatic s32 cur_init; 417227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Lunastatic void myfree(void *ptr, s32 size); 427227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna 437227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna/* 447227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * ======== gh_create ======== 457227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna */ 467227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna 477227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Lunastruct gh_t_hash_tab *gh_create(u16 max_bucket, u16 val_size, 487227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna u16(*hash) (void *, u16), bool(*match) (void *, 497227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna void *), 507227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna void (*delete) (void *)) 517227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna{ 527227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna struct gh_t_hash_tab *hash_tab; 537227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna u16 i; 547227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna hash_tab = 557227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna (struct gh_t_hash_tab *)gs_alloc(sizeof(struct gh_t_hash_tab)); 567227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna if (hash_tab == NULL) 577227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna return NULL; 587227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna hash_tab->max_bucket = max_bucket; 597227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna hash_tab->val_size = val_size; 607227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna hash_tab->hash = hash; 617227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna hash_tab->match = match; 627227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna hash_tab->delete = delete == NULL ? noop : delete; 637227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna 647227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna hash_tab->buckets = (struct element **) 657227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna gs_alloc(sizeof(struct element *) * max_bucket); 667227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna if (hash_tab->buckets == NULL) { 677227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna gh_delete(hash_tab); 687227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna return NULL; 697227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna } 707227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna 717227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna for (i = 0; i < max_bucket; i++) 727227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna hash_tab->buckets[i] = NULL; 737227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna 747227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna return hash_tab; 757227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna} 767227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna 777227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna/* 787227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * ======== gh_delete ======== 797227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna */ 807227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Lunavoid gh_delete(struct gh_t_hash_tab *hash_tab) 817227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna{ 827227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna struct element *elem, *next; 837227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna u16 i; 847227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna 857227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna if (hash_tab != NULL) { 867227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna if (hash_tab->buckets != NULL) { 877227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna for (i = 0; i < hash_tab->max_bucket; i++) { 887227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna for (elem = hash_tab->buckets[i]; elem != NULL; 897227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna elem = next) { 907227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna next = elem->next; 917227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna (*hash_tab->delete) (elem->data); 927227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna myfree(elem, 937227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna sizeof(struct element) - 1 + 947227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna hash_tab->val_size); 957227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna } 967227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna } 977227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna 987227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna myfree(hash_tab->buckets, sizeof(struct element *) 997227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * hash_tab->max_bucket); 1007227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna } 1017227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna 1027227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna myfree(hash_tab, sizeof(struct gh_t_hash_tab)); 1037227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna } 1047227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna} 1057227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna 1067227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna/* 1077227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * ======== gh_exit ======== 1087227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna */ 1097227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna 1107227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Lunavoid gh_exit(void) 1117227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna{ 1127227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna if (cur_init-- == 1) 1137227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna gs_exit(); 1147227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna 1157227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna} 1167227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna 1177227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna/* 1187227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * ======== gh_find ======== 1197227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna */ 1207227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna 1217227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Lunavoid *gh_find(struct gh_t_hash_tab *hash_tab, void *key) 1227227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna{ 1237227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna struct element *elem; 1247227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna 1257227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna elem = hash_tab->buckets[(*hash_tab->hash) (key, hash_tab->max_bucket)]; 1267227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna 1277227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna for (; elem; elem = elem->next) { 1287227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna if ((*hash_tab->match) (key, elem->data)) 1297227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna return elem->data; 1307227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna } 1317227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna 1327227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna return NULL; 1337227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna} 1347227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna 1357227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna/* 1367227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * ======== gh_init ======== 1377227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna */ 1387227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna 1397227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Lunavoid gh_init(void) 1407227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna{ 1417227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna if (cur_init++ == 0) 1427227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna gs_init(); 1437227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna} 1447227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna 1457227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna/* 1467227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * ======== gh_insert ======== 1477227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna */ 1487227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna 1497227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Lunavoid *gh_insert(struct gh_t_hash_tab *hash_tab, void *key, void *value) 1507227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna{ 1517227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna struct element *elem; 1527227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna u16 i; 1537227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna char *src, *dst; 1547227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna 1557227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna elem = (struct element *)gs_alloc(sizeof(struct element) - 1 + 1567227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna hash_tab->val_size); 1577227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna if (elem != NULL) { 1587227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna 1597227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna dst = (char *)elem->data; 1607227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna src = (char *)value; 1617227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna for (i = 0; i < hash_tab->val_size; i++) 1627227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna *dst++ = *src++; 1637227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna 1647227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna i = (*hash_tab->hash) (key, hash_tab->max_bucket); 1657227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna elem->next = hash_tab->buckets[i]; 1667227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna hash_tab->buckets[i] = elem; 1677227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna 1687227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna return elem->data; 1697227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna } 1707227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna 1717227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna return NULL; 1727227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna} 1737227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna 1747227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna/* 1757227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * ======== noop ======== 1767227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna */ 1777227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna/* ARGSUSED */ 1787227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Lunastatic void noop(void *p) 1797227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna{ 1807227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna p = p; /* stifle compiler warning */ 1817227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna} 1827227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna 1837227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna/* 1847227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * ======== myfree ======== 1857227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna */ 1867227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Lunastatic void myfree(void *ptr, s32 size) 1877227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna{ 1887227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna gs_free(ptr); 1897227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna} 1907227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna 1914f551c8f6b89902a83328fbf50585ec7ee03ed5aFelipe Contreras#ifdef CONFIG_TIDSPBRIDGE_BACKTRACE 1927227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna/** 1937227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * gh_iterate() - This function goes through all the elements in the hash table 1947227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * looking for the dsp symbols. 1957227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * @hash_tab: Hash table 1967227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * @callback: pointer to callback function 1977227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * @user_data: User data, contains the find_symbol_context pointer 1987227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * 1997227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna */ 2007227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Lunavoid gh_iterate(struct gh_t_hash_tab *hash_tab, 2017227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna void (*callback)(void *, void *), void *user_data) 2027227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna{ 2037227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna struct element *elem; 2047227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna u32 i; 2057227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna 2067227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna if (hash_tab && hash_tab->buckets) 2077227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna for (i = 0; i < hash_tab->max_bucket; i++) { 2087227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna elem = hash_tab->buckets[i]; 2097227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna while (elem) { 2107227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna callback(&elem->data, user_data); 2117227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna elem = elem->next; 2127227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna } 2137227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna } 2147227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna} 2154f551c8f6b89902a83328fbf50585ec7ee03ed5aFelipe Contreras#endif 216