1b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* 2b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland 3b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 4b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Licensed under the Apache License, Version 2.0 (the "License"); 5b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * you may not use this file except in compliance with the License. 6b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * You may obtain a copy of the License at 7b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 8b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * http://www.apache.org/licenses/LICENSE-2.0 9b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 10b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Unless required by applicable law or agreed to in writing, software 11b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * distributed under the License is distributed on an "AS IS" BASIS, 12b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * See the License for the specific language governing permissions and 14b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * limitations under the License. 15b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 16b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 17b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @file picokdbg.c 18b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 19b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * debug support knowledge base 20b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 21b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland 22b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * All rights reserved. 23b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 24b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * History: 25b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - 2009-04-20 -- initial version 26b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 27b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 28b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 29b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picoos.h" 30b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picoknow.h" 31b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picodbg.h" 32b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picokdbg.h" 33b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 34b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#ifdef __cplusplus 35b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenextern "C" { 36b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 37b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if 0 38b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 39b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 40b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 41b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if defined(PICO_DEBUG) 42b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 43b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 44b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @addtogroup picokdbg 45b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 46b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * <b> Pico Debug Support for knowledge base </b>\n 47b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 48b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 49b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @b Phones 50b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 51b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * overview of binary file format for dbg kb: 52b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 53b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen dbg-kb = phonesyms 54b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 55b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen phonesyms = {PHONESYM8}=256 56b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 57b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PHONESYM6: 8 bytes, symbol name (must be 0 terminated), the 58b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen corresponding ID corresponds to the offset in the 59b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen phonesyms array 60b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen*/ 61b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 62b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* maximum length of phonesym string including terminating 0 */ 63b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define KDBG_PHONESYMLEN_MAX 8 64b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 65b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 66b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef struct kdbg_subobj *kdbg_SubObj; 67b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 68b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef struct kdbg_subobj { 69b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 *phonesyms; 70b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} kdbg_subobj_t; 71b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 72b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 73b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t kdbgInitialize(register picoknow_KnowledgeBase this, 74b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_Common common) { 75b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen kdbg_subobj_t *kdbg; 76b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 77b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("start")); 78b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 79b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 80b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("2nd check failed")); 81b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoos_emRaiseException(common->em, PICO_ERR_OTHER, NULL, NULL); 82b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 83b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen kdbg = (kdbg_subobj_t *)this->subObj; 84b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen kdbg->phonesyms = this->base; 85b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 86b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 87b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 88b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 89b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t kdbgSubObjDeallocate(register picoknow_KnowledgeBase this, 90b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_MemoryManager mm) { 91b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL != this) { 92b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_deallocate(mm, (void *) &this->subObj); 93b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 94b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 95b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 96b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 97b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 98b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picokdbg_specializeDbgKnowledgeBase(picoknow_KnowledgeBase this, 99b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_Common common) { 100b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this) { 101b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_INFO(("no debug symbols loaded")); 102b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 103b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 104b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->subDeallocate = kdbgSubObjDeallocate; 105b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->subObj = picoos_allocate(common->mm, sizeof(kdbg_subobj_t)); 106b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this->subObj) { 107b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoos_emRaiseException(common->em, PICO_EXC_OUT_OF_MEM, 108b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen NULL, NULL); 109b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 110b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return kdbgInitialize(this, common); 111b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 112b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 113b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 114b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicokdbg_Dbg picokdbg_getDbg(picoknow_KnowledgeBase this) { 115b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this) { 116b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return NULL; 117b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 118b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return (picokdbg_Dbg)this->subObj; 119b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 120b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 121b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 122b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 123b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* Dbg methods */ 124b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 125b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicoos_uint8 picokdbg_getPhoneId(const picokdbg_Dbg this, 126b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen const picoos_char *phsym) { 127b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen kdbg_subobj_t *kdbg; 128b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 i; 129b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 130b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (this == NULL) 131b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return 0; 132b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 133b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen kdbg = (kdbg_subobj_t *)this; 134b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* sequential search */ 135b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (i = 0; i < 256; i++) { 136b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (!picoos_strcmp(phsym, 137b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (picoos_char *)&(kdbg->phonesyms[i * KDBG_PHONESYMLEN_MAX]))) 138b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return (picoos_uint8)i; 139b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 140b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return 0; 141b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 142b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 143b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 144b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicoos_char *picokdbg_getPhoneSym(const picokdbg_Dbg this, 145b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen const picoos_uint8 phid) { 146b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen kdbg_subobj_t *kdbg; 147b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 148b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (this == NULL) 149b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return NULL; 150b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 151b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen kdbg = (kdbg_subobj_t *)this; 152b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return (picoos_char *)&(kdbg->phonesyms[phid * KDBG_PHONESYMLEN_MAX]); 153b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 154b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 155b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 156b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 157b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#else 158b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 159b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* To prevent warning about "translation unit is empty" when 160b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen diagnostic output is disabled. */ 161b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void picokdbg_dummy(void) { 162b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokdbg_dummy(); 163b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 164b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 165b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 166b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif /* defined(PICO_DEBUG) */ 167b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 168b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#ifdef __cplusplus 169b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 170b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 171b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 172b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 173b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* end */ 174