Merge branch 'master' into sam460ex
This commit is contained in:
@@ -69,7 +69,7 @@ if $(HAIKU_BUILD_FEATURE_SSL) {
|
|||||||
HAIKU_ICU_GCC_2_PACKAGE = icu-4.8.1.1-r1a4-x86-gcc2-2012-08-29.zip ;
|
HAIKU_ICU_GCC_2_PACKAGE = icu-4.8.1.1-r1a4-x86-gcc2-2012-08-29.zip ;
|
||||||
HAIKU_ICU_GCC_4_PACKAGE = icu-4.8.1.1-r1a4-x86-gcc4-2012-08-29.zip ;
|
HAIKU_ICU_GCC_4_PACKAGE = icu-4.8.1.1-r1a4-x86-gcc4-2012-08-29.zip ;
|
||||||
HAIKU_ICU_PPC_PACKAGE = icu-4.8.1-ppc-2011-08-20.zip ;
|
HAIKU_ICU_PPC_PACKAGE = icu-4.8.1-ppc-2011-08-20.zip ;
|
||||||
HAIKU_ICU_ARM_PACKAGE = icu-4.8.1.1-arm-2012-11-16.zip ;
|
HAIKU_ICU_ARM_PACKAGE = icu-4.8.1.1-arm-2012-11-21.zip ;
|
||||||
HAIKU_ICU_X86_64_PACKAGE = icu-4.8.1.1-x86_64-2012-07-30.zip ;
|
HAIKU_ICU_X86_64_PACKAGE = icu-4.8.1.1-x86_64-2012-07-30.zip ;
|
||||||
|
|
||||||
if $(TARGET_ARCH) = ppc || $(TARGET_ARCH) = x86 || $(TARGET_ARCH) = arm || $(TARGET_ARCH) = x86_64 {
|
if $(TARGET_ARCH) = ppc || $(TARGET_ARCH) = x86 || $(TARGET_ARCH) = arm || $(TARGET_ARCH) = x86_64 {
|
||||||
@@ -79,7 +79,7 @@ if $(TARGET_ARCH) = ppc || $(TARGET_ARCH) = x86 || $(TARGET_ARCH) = arm || $(TAR
|
|||||||
HAIKU_ICU_DEVEL_PACKAGE = icu-devel-4.8.1-ppc-2011-12-19.zip ;
|
HAIKU_ICU_DEVEL_PACKAGE = icu-devel-4.8.1-ppc-2011-12-19.zip ;
|
||||||
} else if $(TARGET_ARCH) = arm {
|
} else if $(TARGET_ARCH) = arm {
|
||||||
icu_package = $(HAIKU_ICU_ARM_PACKAGE) ;
|
icu_package = $(HAIKU_ICU_ARM_PACKAGE) ;
|
||||||
HAIKU_ICU_DEVEL_PACKAGE = icu-devel-4.8.1.1-arm-2012-11-16.zip ;
|
HAIKU_ICU_DEVEL_PACKAGE = icu-devel-4.8.1.1-arm-2012-11-21.zip ;
|
||||||
} else if $(TARGET_ARCH) = x86_64 {
|
} else if $(TARGET_ARCH) = x86_64 {
|
||||||
icu_package = $(HAIKU_ICU_X86_64_PACKAGE) ;
|
icu_package = $(HAIKU_ICU_X86_64_PACKAGE) ;
|
||||||
HAIKU_ICU_DEVEL_PACKAGE = icu-devel-4.8.1.1-x86_64-2012-07-30.zip ;
|
HAIKU_ICU_DEVEL_PACKAGE = icu-devel-4.8.1.1-x86_64-2012-07-30.zip ;
|
||||||
@@ -408,8 +408,10 @@ if $(TARGET_ARCH) = x86 {
|
|||||||
|
|
||||||
# Freetype
|
# Freetype
|
||||||
local freetypeBaseURL = $(baseURL)/lib ;
|
local freetypeBaseURL = $(baseURL)/lib ;
|
||||||
if $(TARGET_ARCH) = ppc || $(TARGET_ARCH) = x86 || $(TARGET_ARCH) = x86_64 {
|
if $(TARGET_ARCH) = ppc || $(TARGET_ARCH) = x86 || $(TARGET_ARCH) = x86_64 || $(TARGET_ARCH) = arm {
|
||||||
if $(TARGET_ARCH) = ppc {
|
if $(TARGET_ARCH) = arm {
|
||||||
|
HAIKU_FREETYPE_FILE = freetype-2.4.9-arm-2012-11-21.zip ;
|
||||||
|
} else if $(TARGET_ARCH) = ppc {
|
||||||
HAIKU_FREETYPE_FILE = freetype-2.4.9-ppc-gcc4-2012-06-26.zip ;
|
HAIKU_FREETYPE_FILE = freetype-2.4.9-ppc-gcc4-2012-06-26.zip ;
|
||||||
} else if $(TARGET_ARCH) = x86_64 {
|
} else if $(TARGET_ARCH) = x86_64 {
|
||||||
HAIKU_FREETYPE_FILE = freetype-2.4.9-x86_64-2012-08-04.zip ;
|
HAIKU_FREETYPE_FILE = freetype-2.4.9-x86_64-2012-08-04.zip ;
|
||||||
@@ -538,8 +540,10 @@ if $(HAIKU_BUILD_FEATURE_WEBKIT) {
|
|||||||
|
|
||||||
# libpng
|
# libpng
|
||||||
local libpngBaseURL = $(baseURL)/lib ;
|
local libpngBaseURL = $(baseURL)/lib ;
|
||||||
if $(TARGET_ARCH) = ppc || $(TARGET_ARCH) = x86 || $(TARGET_ARCH) = x86_64 {
|
if $(TARGET_ARCH) = ppc || $(TARGET_ARCH) = x86 || $(TARGET_ARCH) = x86_64 || $(TARGET_ARCH) = arm {
|
||||||
if $(TARGET_ARCH) = ppc {
|
if $(TARGET_ARCH) = arm {
|
||||||
|
HAIKU_LIBPNG_FILE = libpng-1.5.12-arm-2012-11-21.zip ;
|
||||||
|
} else if $(TARGET_ARCH) = ppc {
|
||||||
HAIKU_LIBPNG_FILE = libpng-1.5.12-ppc-gcc4-2012-08-27.zip ;
|
HAIKU_LIBPNG_FILE = libpng-1.5.12-ppc-gcc4-2012-08-27.zip ;
|
||||||
} else if $(TARGET_ARCH) = x86_64 {
|
} else if $(TARGET_ARCH) = x86_64 {
|
||||||
HAIKU_LIBPNG_FILE = libpng-1.5.12-x86_64-2012-11-18.zip ;
|
HAIKU_LIBPNG_FILE = libpng-1.5.12-x86_64-2012-11-18.zip ;
|
||||||
@@ -580,8 +584,10 @@ if $(TARGET_ARCH) = ppc || $(TARGET_ARCH) = x86 || $(TARGET_ARCH) = x86_64 {
|
|||||||
|
|
||||||
# jpeg
|
# jpeg
|
||||||
local jpegBaseURL = $(baseURL)/lib ;
|
local jpegBaseURL = $(baseURL)/lib ;
|
||||||
if $(TARGET_ARCH) = ppc || $(TARGET_ARCH) = x86 || $(TARGET_ARCH) = x86_64 {
|
if $(TARGET_ARCH) = ppc || $(TARGET_ARCH) = x86 || $(TARGET_ARCH) = x86_64 || $(TARGET_ARCH) = arm {
|
||||||
if $(TARGET_ARCH) = ppc {
|
if $(TARGET_ARCH) = arm {
|
||||||
|
HAIKU_JPEG_FILE = jpeg-8d-arm-2012-11-21.zip ;
|
||||||
|
} else if $(TARGET_ARCH) = ppc {
|
||||||
HAIKU_JPEG_FILE = jpeg-8d-ppc-gcc4-2012-08-27.zip ;
|
HAIKU_JPEG_FILE = jpeg-8d-ppc-gcc4-2012-08-27.zip ;
|
||||||
} else if $(TARGET_ARCH) = x86_64 {
|
} else if $(TARGET_ARCH) = x86_64 {
|
||||||
HAIKU_JPEG_FILE = jpeg-8d-x86_64-2012-11-18.zip ;
|
HAIKU_JPEG_FILE = jpeg-8d-x86_64-2012-11-18.zip ;
|
||||||
@@ -622,8 +628,10 @@ if $(TARGET_ARCH) = ppc || $(TARGET_ARCH) = x86 || $(TARGET_ARCH) = x86_64 {
|
|||||||
|
|
||||||
# zlib
|
# zlib
|
||||||
local zlibBaseURL = $(baseURL)/lib ;
|
local zlibBaseURL = $(baseURL)/lib ;
|
||||||
if $(TARGET_ARCH) = ppc || $(TARGET_ARCH) = x86 || $(TARGET_ARCH) = x86_64 {
|
if $(TARGET_ARCH) = ppc || $(TARGET_ARCH) = x86 || $(TARGET_ARCH) = x86_64 || $(TARGET_ARCH) = arm {
|
||||||
if $(TARGET_ARCH) = ppc {
|
if $(TARGET_ARCH) = arm {
|
||||||
|
HAIKU_ZLIB_FILE = zlib-1.2.7-arm-2012-11-21.zip ;
|
||||||
|
} else if $(TARGET_ARCH) = ppc {
|
||||||
HAIKU_ZLIB_FILE = zlib-1.2.7-ppc-gcc4-2012-10-30.zip ;
|
HAIKU_ZLIB_FILE = zlib-1.2.7-ppc-gcc4-2012-10-30.zip ;
|
||||||
} else if $(TARGET_ARCH) = x86_64 {
|
} else if $(TARGET_ARCH) = x86_64 {
|
||||||
HAIKU_ZLIB_FILE = zlib-1.2.7-x86_64-2012-11-18.zip ;
|
HAIKU_ZLIB_FILE = zlib-1.2.7-x86_64-2012-11-18.zip ;
|
||||||
|
|||||||
@@ -16,6 +16,8 @@
|
|||||||
|
|
||||||
* Research stack unwinding to implement backtrace support for KDL & friends.
|
* Research stack unwinding to implement backtrace support for KDL & friends.
|
||||||
|
|
||||||
|
* B_MAX_CPU_COUNT should be fixed to be a more sensible future-proof value then 1
|
||||||
|
|
||||||
* Add KDL hangman to the boot floppy image for more enjoyment during porting....
|
* Add KDL hangman to the boot floppy image for more enjoyment during porting....
|
||||||
|
|
||||||
* Userland...........
|
* Userland...........
|
||||||
|
|||||||
@@ -41,6 +41,11 @@
|
|||||||
#ifndef __X86EMU_X86EMUI_H
|
#ifndef __X86EMU_X86EMUI_H
|
||||||
#define __X86EMU_X86EMUI_H
|
#define __X86EMU_X86EMUI_H
|
||||||
|
|
||||||
|
// Haiku workaround - don't want to compile all of the debugging code even
|
||||||
|
// when doing a debug build, it's unnecessary unless you're trying to debug
|
||||||
|
// x86emu itself.
|
||||||
|
#undef DEBUG
|
||||||
|
|
||||||
/* If we are compiling in C++ mode, we can compile some functions as
|
/* If we are compiling in C++ mode, we can compile some functions as
|
||||||
* inline to increase performance (however the code size increases quite
|
* inline to increase performance (however the code size increases quite
|
||||||
* dramatically in this case).
|
* dramatically in this case).
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ typedef struct {
|
|||||||
#define DUALHEAD_BITS (3<<6)
|
#define DUALHEAD_BITS (3<<6)
|
||||||
#define DUALHEAD_CAPABLE (1<<8)
|
#define DUALHEAD_CAPABLE (1<<8)
|
||||||
#define TV_BITS (3<<9)
|
#define TV_BITS (3<<9)
|
||||||
#define TV_MON (0<<9
|
#define TV_MON (0<<9)
|
||||||
#define TV_PAL (1<<9)
|
#define TV_PAL (1<<9)
|
||||||
#define TV_NTSC (2<<9)
|
#define TV_NTSC (2<<9)
|
||||||
#define TV_CAPABLE (1<<11)
|
#define TV_CAPABLE (1<<11)
|
||||||
|
|||||||
@@ -14,4 +14,4 @@
|
|||||||
//#define ATOMIC64_FUNCS_ARE_SYSCALLS
|
//#define ATOMIC64_FUNCS_ARE_SYSCALLS
|
||||||
|
|
||||||
|
|
||||||
#endif /* _KERNEL_ARCH_M68K_CONFIG_H */
|
#endif /* _KERNEL_ARCH_ARM_CONFIG_H */
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
SubDir HAIKU_TOP src add-ons kernel bus_managers isa arch arm ;
|
||||||
|
|
||||||
|
SubDirHdrs [ FDirName $(SUBDIR) $(DOTDOT) $(DOTDOT) ] ;
|
||||||
|
|
||||||
|
UsePrivateHeaders kernel [ FDirName kernel arch arm ] ;
|
||||||
|
UsePrivateHeaders [ FDirName kernel boot platform $(TARGET_BOOT_PLATFORM) ] ;
|
||||||
|
|
||||||
|
KernelStaticLibrary isa_arch_bus_manager :
|
||||||
|
isa_dma.c
|
||||||
|
isa_controller.c
|
||||||
|
;
|
||||||
|
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2007 Haiku, Inc.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*
|
||||||
|
* arch-specific config manager
|
||||||
|
*
|
||||||
|
* Authors (in chronological order):
|
||||||
|
* François Revol ([email protected])
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <KernelExport.h>
|
||||||
|
#include "ISA.h"
|
||||||
|
#include "arch_cpu.h"
|
||||||
|
#include "isa_arch.h"
|
||||||
|
|
||||||
|
//#define TRACE_ISA
|
||||||
|
#ifdef TRACE_ISA
|
||||||
|
# define TRACE(x) dprintf x
|
||||||
|
#else
|
||||||
|
# define TRACE(x) ;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
uint8
|
||||||
|
arch_isa_read_io_8(int mapped_io_addr)
|
||||||
|
{
|
||||||
|
uint8 value = in8(mapped_io_addr);
|
||||||
|
|
||||||
|
TRACE(("isa_read8(%x->%x)\n", mapped_io_addr, value));
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
arch_isa_write_io_8(int mapped_io_addr, uint8 value)
|
||||||
|
{
|
||||||
|
TRACE(("isa_write8(%x->%x)\n", value, mapped_io_addr));
|
||||||
|
|
||||||
|
out8(value, mapped_io_addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint16
|
||||||
|
arch_isa_read_io_16(int mapped_io_addr)
|
||||||
|
{
|
||||||
|
return in16(mapped_io_addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
arch_isa_write_io_16(int mapped_io_addr, uint16 value)
|
||||||
|
{
|
||||||
|
out16(value, mapped_io_addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint32
|
||||||
|
arch_isa_read_io_32(int mapped_io_addr)
|
||||||
|
{
|
||||||
|
return in32(mapped_io_addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
arch_isa_write_io_32(int mapped_io_addr, uint32 value)
|
||||||
|
{
|
||||||
|
out32(value, mapped_io_addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void *
|
||||||
|
arch_isa_ram_address(const void *physical_address_in_system_memory)
|
||||||
|
{
|
||||||
|
// this is what the BeOS kernel does
|
||||||
|
return (void *)physical_address_in_system_memory;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
arch_isa_init(void)
|
||||||
|
{
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2007 Haiku, Inc.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*
|
||||||
|
* arch-specific config manager
|
||||||
|
*
|
||||||
|
* Authors (in chronological order):
|
||||||
|
* François Revol ([email protected])
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <KernelExport.h>
|
||||||
|
#include "ISA.h"
|
||||||
|
#include "arch_cpu.h"
|
||||||
|
#include "isa_arch.h"
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
arch_start_isa_dma(long channel, void *buf, long transfer_count,
|
||||||
|
uchar mode, uchar e_mode)
|
||||||
|
{
|
||||||
|
// ToDo: implement this?!
|
||||||
|
return B_NOT_ALLOWED;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
SubDir HAIKU_TOP src add-ons kernel cpu arm ;
|
||||||
|
|
||||||
@@ -869,11 +869,20 @@ hda_hw_init(hda_controller* controller)
|
|||||||
controller->pci_info.device, controller->pci_info.function,
|
controller->pci_info.device, controller->pci_info.function,
|
||||||
PCI_command, 2);
|
PCI_command, 2);
|
||||||
if (!(cmd & PCI_command_master)) {
|
if (!(cmd & PCI_command_master)) {
|
||||||
(gPci->write_pci_config)(controller->pci_info.bus,
|
|
||||||
controller->pci_info.device, controller->pci_info.function,
|
|
||||||
PCI_command, 2, cmd | PCI_command_master);
|
|
||||||
dprintf("hda: enabling PCI bus mastering\n");
|
dprintf("hda: enabling PCI bus mastering\n");
|
||||||
|
cmd |= PCI_command_master;
|
||||||
}
|
}
|
||||||
|
if (!(cmd & PCI_command_memory)) {
|
||||||
|
dprintf("hda: enabling PCI memory access\n");
|
||||||
|
cmd |= PCI_command_memory;
|
||||||
|
}
|
||||||
|
if ((cmd & PCI_command_int_disable)) {
|
||||||
|
dprintf("hda: enabling PCI interrupts\n");
|
||||||
|
cmd &= ~PCI_command_int_disable;
|
||||||
|
}
|
||||||
|
(gPci->write_pci_config)(controller->pci_info.bus,
|
||||||
|
controller->pci_info.device, controller->pci_info.function,
|
||||||
|
PCI_command, 2, cmd);
|
||||||
|
|
||||||
if (get_module(B_PCI_X86_MODULE_NAME, (module_info**)&sPCIx86Module)
|
if (get_module(B_PCI_X86_MODULE_NAME, (module_info**)&sPCIx86Module)
|
||||||
!= B_OK)
|
!= B_OK)
|
||||||
|
|||||||
@@ -7,15 +7,16 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
#include <drivers/device_manager.h>
|
#include <drivers/device_manager.h>
|
||||||
#include <drivers/KernelExport.h>
|
#include <drivers/KernelExport.h>
|
||||||
#include <drivers/Drivers.h>
|
#include <drivers/Drivers.h>
|
||||||
#include <kernel/OS.h>
|
#include <kernel/OS.h>
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
|
|
||||||
//#define TRACE_NORFLASH
|
//#define TRACE_NORFLASH
|
||||||
#ifdef TRACE_NORFLASH
|
#ifdef TRACE_NORFLASH
|
||||||
@@ -24,11 +25,14 @@
|
|||||||
#define TRACE(x...)
|
#define TRACE(x...)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#define NORFLASH_DEVICE_MODULE_NAME "drivers/disk/norflash/device_v1"
|
#define NORFLASH_DEVICE_MODULE_NAME "drivers/disk/norflash/device_v1"
|
||||||
#define NORFLASH_DRIVER_MODULE_NAME "drivers/disk/norflash/driver_v1"
|
#define NORFLASH_DRIVER_MODULE_NAME "drivers/disk/norflash/driver_v1"
|
||||||
|
|
||||||
|
|
||||||
#define NORFLASH_ADDR 0x00000000
|
#define NORFLASH_ADDR 0x00000000
|
||||||
|
|
||||||
|
|
||||||
struct nor_driver_info {
|
struct nor_driver_info {
|
||||||
device_node *node;
|
device_node *node;
|
||||||
size_t blocksize;
|
size_t blocksize;
|
||||||
@@ -38,42 +42,15 @@ struct nor_driver_info {
|
|||||||
void *mapped;
|
void *mapped;
|
||||||
};
|
};
|
||||||
|
|
||||||
static device_manager_info* sDeviceManager;
|
|
||||||
|
|
||||||
static const char *sTabTab = "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t";
|
static device_manager_info *sDeviceManager;
|
||||||
#define DS "%.*s"
|
|
||||||
#define DA depth - 1, sTabTab
|
|
||||||
|
|
||||||
static void
|
|
||||||
dump_hex(const char *data, int32 len, int depth = 1)
|
|
||||||
{
|
|
||||||
char str[128];
|
|
||||||
char astr[32];
|
|
||||||
char *p;
|
|
||||||
int l;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < len; ) {
|
|
||||||
p = str;
|
|
||||||
l = sizeof(str);
|
|
||||||
for (; i < len && (p == str || (i % 16 != 0)); i++) {
|
|
||||||
snprintf(p, l - 1, "%02x ", data[i]);
|
|
||||||
l -= strlen(p);
|
|
||||||
p += strlen(p);
|
|
||||||
astr[i % 16] = isprint(data[i]) ? data[i] : '.';
|
|
||||||
astr[i % 16] = isprint(data[i]) ? data[i] : '.';
|
|
||||||
astr[(i % 16) + 1] = '\0';
|
|
||||||
}
|
|
||||||
dprintf(DS" %-48.48s %s\n", DA, str, astr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static status_t
|
static status_t
|
||||||
nor_init_device(void* _info, void** _cookie)
|
nor_init_device(void *_info, void **_cookie)
|
||||||
{
|
{
|
||||||
TRACE("init_device\n");
|
TRACE("init_device\n");
|
||||||
nor_driver_info* info = (nor_driver_info*)_info;
|
nor_driver_info *info = (nor_driver_info*)_info;
|
||||||
|
|
||||||
info->mapped = NULL;
|
info->mapped = NULL;
|
||||||
info->blocksize = 128 * 1024;
|
info->blocksize = 128 * 1024;
|
||||||
@@ -89,10 +66,10 @@ nor_init_device(void* _info, void** _cookie)
|
|||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
nor_uninit_device(void* _cookie)
|
nor_uninit_device(void *_cookie)
|
||||||
{
|
{
|
||||||
TRACE("uninit_device\n");
|
TRACE("uninit_device\n");
|
||||||
nor_driver_info* info = (nor_driver_info*)_cookie;
|
nor_driver_info *info = (nor_driver_info*)_cookie;
|
||||||
if (info)
|
if (info)
|
||||||
delete_area(info->id);
|
delete_area(info->id);
|
||||||
}
|
}
|
||||||
@@ -100,7 +77,7 @@ nor_uninit_device(void* _cookie)
|
|||||||
|
|
||||||
static status_t
|
static status_t
|
||||||
nor_open(void *deviceCookie, const char *path, int openMode,
|
nor_open(void *deviceCookie, const char *path, int openMode,
|
||||||
void **_cookie)
|
void **_cookie)
|
||||||
{
|
{
|
||||||
TRACE("open(%s)\n", path);
|
TRACE("open(%s)\n", path);
|
||||||
*_cookie = deviceCookie;
|
*_cookie = deviceCookie;
|
||||||
@@ -127,11 +104,11 @@ nor_free(void *_cookie)
|
|||||||
static status_t
|
static status_t
|
||||||
nor_ioctl(void *cookie, uint32 op, void *buffer, size_t length)
|
nor_ioctl(void *cookie, uint32 op, void *buffer, size_t length)
|
||||||
{
|
{
|
||||||
nor_driver_info* info = (nor_driver_info*)cookie;
|
nor_driver_info *info = (nor_driver_info*)cookie;
|
||||||
TRACE("ioctl(%ld,%lu)\n", op, length);
|
TRACE("ioctl(%ld,%lu)\n", op, length);
|
||||||
|
|
||||||
switch(op) {
|
switch (op) {
|
||||||
case B_GET_GEOMETRY:
|
case B_GET_GEOMETRY:
|
||||||
{
|
{
|
||||||
device_geometry *deviceGeometry = (device_geometry*)buffer;
|
device_geometry *deviceGeometry = (device_geometry*)buffer;
|
||||||
deviceGeometry->removable = false;
|
deviceGeometry->removable = false;
|
||||||
@@ -146,9 +123,10 @@ nor_ioctl(void *cookie, uint32 op, void *buffer, size_t length)
|
|||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case B_GET_DEVICE_NAME:
|
|
||||||
strlcpy((char*)buffer, "NORFlash", length);
|
case B_GET_DEVICE_NAME:
|
||||||
break;
|
strlcpy((char*)buffer, "NORFlash", length);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
@@ -158,7 +136,7 @@ nor_ioctl(void *cookie, uint32 op, void *buffer, size_t length)
|
|||||||
static status_t
|
static status_t
|
||||||
nor_read(void *_cookie, off_t position, void *data, size_t *numbytes)
|
nor_read(void *_cookie, off_t position, void *data, size_t *numbytes)
|
||||||
{
|
{
|
||||||
nor_driver_info* info = (nor_driver_info*)_cookie;
|
nor_driver_info *info = (nor_driver_info*)_cookie;
|
||||||
TRACE("read(%Ld,%lu)\n", position, *numbytes);
|
TRACE("read(%Ld,%lu)\n", position, *numbytes);
|
||||||
|
|
||||||
if (position + *numbytes > info->totalsize)
|
if (position + *numbytes > info->totalsize)
|
||||||
@@ -166,10 +144,6 @@ nor_read(void *_cookie, off_t position, void *data, size_t *numbytes)
|
|||||||
|
|
||||||
memcpy(data, info->mapped + position, *numbytes);
|
memcpy(data, info->mapped + position, *numbytes);
|
||||||
|
|
||||||
#ifdef TRACE_NORFLASH
|
|
||||||
dump_hex((const char*)(info->mapped + position), *numbytes, 1);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -210,7 +184,7 @@ nor_init_driver(device_node *node, void **cookie)
|
|||||||
{
|
{
|
||||||
TRACE("init_driver\n");
|
TRACE("init_driver\n");
|
||||||
|
|
||||||
nor_driver_info* info = (nor_driver_info*)malloc(sizeof(nor_driver_info));
|
nor_driver_info *info = (nor_driver_info*)malloc(sizeof(nor_driver_info));
|
||||||
if (info == NULL)
|
if (info == NULL)
|
||||||
return B_NO_MEMORY;
|
return B_NO_MEMORY;
|
||||||
|
|
||||||
@@ -227,16 +201,16 @@ static void
|
|||||||
nor_uninit_driver(void *_cookie)
|
nor_uninit_driver(void *_cookie)
|
||||||
{
|
{
|
||||||
TRACE("uninit_driver\n");
|
TRACE("uninit_driver\n");
|
||||||
nor_driver_info* info = (nor_driver_info*)_cookie;
|
nor_driver_info *info = (nor_driver_info*)_cookie;
|
||||||
free(info);
|
free(info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static status_t
|
static status_t
|
||||||
nor_register_child_devices(void* _cookie)
|
nor_register_child_devices(void *_cookie)
|
||||||
{
|
{
|
||||||
TRACE("register_child_devices\n");
|
TRACE("register_child_devices\n");
|
||||||
nor_driver_info* info = (nor_driver_info*)_cookie;
|
nor_driver_info *info = (nor_driver_info*)_cookie;
|
||||||
status_t status;
|
status_t status;
|
||||||
|
|
||||||
status = sDeviceManager->publish_device(info->node, "disk/nor/0/raw",
|
status = sDeviceManager->publish_device(info->node, "disk/nor/0/raw",
|
||||||
@@ -245,6 +219,7 @@ nor_register_child_devices(void* _cookie)
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct device_module_info sNORFlashDiskDevice = {
|
struct device_module_info sNORFlashDiskDevice = {
|
||||||
{
|
{
|
||||||
NORFLASH_DEVICE_MODULE_NAME,
|
NORFLASH_DEVICE_MODULE_NAME,
|
||||||
@@ -286,12 +261,14 @@ struct driver_module_info sNORFlashDiskDriver = {
|
|||||||
NULL, // removed
|
NULL, // removed
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
module_dependency module_dependencies[] = {
|
module_dependency module_dependencies[] = {
|
||||||
{ B_DEVICE_MANAGER_MODULE_NAME, (module_info**)&sDeviceManager },
|
{ B_DEVICE_MANAGER_MODULE_NAME, (module_info**)&sDeviceManager },
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
module_info* modules[] = {
|
|
||||||
|
module_info *modules[] = {
|
||||||
(module_info*)&sNORFlashDiskDriver,
|
(module_info*)&sNORFlashDiskDriver,
|
||||||
(module_info*)&sNORFlashDiskDevice,
|
(module_info*)&sNORFlashDiskDevice,
|
||||||
NULL
|
NULL
|
||||||
|
|||||||
@@ -14,8 +14,6 @@
|
|||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include <syslog.h>
|
|
||||||
|
|
||||||
#include <Application.h>
|
#include <Application.h>
|
||||||
#include <Directory.h>
|
#include <Directory.h>
|
||||||
#include <File.h>
|
#include <File.h>
|
||||||
@@ -125,9 +123,6 @@ PlainTextCatalog::PlainTextCatalog(const char *signature, const char *language,
|
|||||||
}
|
}
|
||||||
|
|
||||||
fInitCheck = status;
|
fInitCheck = status;
|
||||||
log_team(LOG_DEBUG,
|
|
||||||
"trying to load default-catalog(sig=%s, lang=%s) results in %s",
|
|
||||||
signature, language, strerror(fInitCheck));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -161,10 +156,8 @@ PlainTextCatalog::ReadFromFile(const char *path)
|
|||||||
path = fPath.String();
|
path = fPath.String();
|
||||||
|
|
||||||
catalogFile.open(path, std::fstream::in);
|
catalogFile.open(path, std::fstream::in);
|
||||||
if (!catalogFile.is_open()) {
|
if (!catalogFile.is_open())
|
||||||
log_team(LOG_DEBUG, "couldn't open catalog at %s", path);
|
|
||||||
return B_ENTRY_NOT_FOUND;
|
return B_ENTRY_NOT_FOUND;
|
||||||
}
|
|
||||||
|
|
||||||
// Now read all the data from the file
|
// Now read all the data from the file
|
||||||
|
|
||||||
@@ -177,50 +170,35 @@ PlainTextCatalog::ReadFromFile(const char *path)
|
|||||||
ss >> arcver;
|
ss >> arcver;
|
||||||
if (ss.fail()) {
|
if (ss.fail()) {
|
||||||
// can't convert to int
|
// can't convert to int
|
||||||
log_team(LOG_DEBUG,
|
|
||||||
"Unable to extract archive version ( string: %s ) from %s",
|
|
||||||
currentItem.c_str(), path);
|
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (arcver != kCatArchiveVersion) {
|
if (arcver != kCatArchiveVersion) {
|
||||||
// wrong version
|
// wrong version
|
||||||
log_team(LOG_DEBUG,
|
|
||||||
"Wrong archive version ! Got %d instead of %d from %s", arcver,
|
|
||||||
kCatArchiveVersion, path);
|
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
}
|
||||||
} else {
|
} else
|
||||||
log_team(LOG_DEBUG, "Unable to read from catalog %s", path);
|
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
|
||||||
|
|
||||||
if (std::getline(catalogFile, currentItem, '\t').good()) {
|
if (std::getline(catalogFile, currentItem, '\t').good()) {
|
||||||
// Get the language
|
// Get the language
|
||||||
fLanguageName = currentItem.c_str() ;
|
fLanguageName = currentItem.c_str() ;
|
||||||
} else {
|
} else
|
||||||
log_team(LOG_DEBUG, "Unable to get language from %s", path);
|
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
|
||||||
|
|
||||||
if (std::getline(catalogFile, currentItem, '\t').good()) {
|
if (std::getline(catalogFile, currentItem, '\t').good()) {
|
||||||
// Get the signature
|
// Get the signature
|
||||||
fSignature = currentItem.c_str() ;
|
fSignature = currentItem.c_str() ;
|
||||||
} else {
|
} else
|
||||||
log_team(LOG_DEBUG, "Unable to get signature from %s", path);
|
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
|
||||||
|
|
||||||
if (std::getline(catalogFile, currentItem).good()) {
|
if (std::getline(catalogFile, currentItem).good()) {
|
||||||
// Get the fingerprint
|
// Get the fingerprint
|
||||||
std::istringstream ss(currentItem);
|
std::istringstream ss(currentItem);
|
||||||
uint32 foundFingerprint;
|
uint32 foundFingerprint;
|
||||||
ss >> foundFingerprint;
|
ss >> foundFingerprint;
|
||||||
if (ss.fail()) {
|
if (ss.fail())
|
||||||
log_team(LOG_DEBUG, "Unable to get fingerprint (%s) from %s",
|
|
||||||
currentItem.c_str(), path);
|
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
|
||||||
|
|
||||||
if (fFingerprint == 0)
|
if (fFingerprint == 0)
|
||||||
fFingerprint = foundFingerprint;
|
fFingerprint = foundFingerprint;
|
||||||
@@ -228,14 +206,11 @@ PlainTextCatalog::ReadFromFile(const char *path)
|
|||||||
if (fFingerprint != foundFingerprint) {
|
if (fFingerprint != foundFingerprint) {
|
||||||
return B_MISMATCHED_VALUES;
|
return B_MISMATCHED_VALUES;
|
||||||
}
|
}
|
||||||
} else {
|
} else
|
||||||
log_team(LOG_DEBUG, "Unable to get fingerprint from %s", path);
|
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
|
||||||
|
|
||||||
// We managed to open the file, so we remember it's the one we are using
|
// We managed to open the file, so we remember it's the one we are using
|
||||||
fPath = path;
|
fPath = path;
|
||||||
log_team(LOG_DEBUG, "found plaintext catalog at %s", path);
|
|
||||||
|
|
||||||
std::string originalString;
|
std::string originalString;
|
||||||
std::string context;
|
std::string context;
|
||||||
@@ -245,24 +220,14 @@ PlainTextCatalog::ReadFromFile(const char *path)
|
|||||||
while (std::getline(catalogFile, originalString,'\t').good()) {
|
while (std::getline(catalogFile, originalString,'\t').good()) {
|
||||||
// Each line is : "original string \t context \t comment \t translation"
|
// Each line is : "original string \t context \t comment \t translation"
|
||||||
|
|
||||||
if (!std::getline(catalogFile, context,'\t').good()) {
|
if (!std::getline(catalogFile, context,'\t').good())
|
||||||
log_team(LOG_DEBUG, "Unable to get context for string %s from %s",
|
|
||||||
originalString.c_str(), path);
|
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
|
||||||
|
|
||||||
if (!std::getline(catalogFile, comment,'\t').good()) {
|
if (!std::getline(catalogFile, comment,'\t').good())
|
||||||
log_team(LOG_DEBUG, "Unable to get comment for string %s from %s",
|
|
||||||
originalString.c_str(), path);
|
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
|
||||||
|
|
||||||
if (!std::getline(catalogFile, translated).good()) {
|
if (!std::getline(catalogFile, translated).good())
|
||||||
log_team(LOG_DEBUG,
|
|
||||||
"Unable to get translated text for string %s from %s",
|
|
||||||
originalString.c_str(), path);
|
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
|
||||||
|
|
||||||
// We could do that :
|
// We could do that :
|
||||||
// SetString(key, translated.c_str());
|
// SetString(key, translated.c_str());
|
||||||
@@ -270,22 +235,13 @@ PlainTextCatalog::ReadFromFile(const char *path)
|
|||||||
// happen, you know. (and CatKey::== will fail)
|
// happen, you know. (and CatKey::== will fail)
|
||||||
SetString(originalString.c_str(), translated.c_str(), context.c_str(),
|
SetString(originalString.c_str(), translated.c_str(), context.c_str(),
|
||||||
comment.c_str());
|
comment.c_str());
|
||||||
log_team(LOG_DEBUG, "Added string %s from file %s",
|
|
||||||
originalString.c_str(), path);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
catalogFile.close();
|
catalogFile.close();
|
||||||
|
|
||||||
uint32 checkFP = ComputeFingerprint();
|
uint32 checkFP = ComputeFingerprint();
|
||||||
if (fFingerprint != checkFP) {
|
if (fFingerprint != checkFP)
|
||||||
log_team(LOG_DEBUG, "plaintext-catalog(sig=%s, lang=%s) "
|
|
||||||
"has wrong fingerprint after load (%lu instead of %lu). "
|
|
||||||
"The catalog data may be corrupted, so this catalog is "
|
|
||||||
"skipped.\n",
|
|
||||||
fSignature.String(), fLanguageName.String(), checkFP,
|
|
||||||
fFingerprint);
|
|
||||||
return B_BAD_DATA;
|
return B_BAD_DATA;
|
||||||
}
|
|
||||||
|
|
||||||
// some information living in member variables needs to be copied
|
// some information living in member variables needs to be copied
|
||||||
// to attributes. Although these attributes should have been written
|
// to attributes. Although these attributes should have been written
|
||||||
|
|||||||
@@ -949,7 +949,7 @@ CPUUsageDataSource::_SetCPU(int32 cpu)
|
|||||||
|
|
||||||
fLabel << " " << B_TRANSLATE("usage");
|
fLabel << " " << B_TRANSLATE("usage");
|
||||||
|
|
||||||
const rgb_color kColors[B_MAX_CPU_COUNT] = {
|
const rgb_color kColors[] = {
|
||||||
// TODO: find some better defaults...
|
// TODO: find some better defaults...
|
||||||
{200, 0, 200},
|
{200, 0, 200},
|
||||||
{0, 200, 200},
|
{0, 200, 200},
|
||||||
|
|||||||
@@ -192,6 +192,7 @@ Application Debugger :
|
|||||||
CliCommand.cpp
|
CliCommand.cpp
|
||||||
CliContext.cpp
|
CliContext.cpp
|
||||||
CliContinueCommand.cpp
|
CliContinueCommand.cpp
|
||||||
|
CliDebugReportCommand.cpp
|
||||||
CliStackTraceCommand.cpp
|
CliStackTraceCommand.cpp
|
||||||
CliStopCommand.cpp
|
CliStopCommand.cpp
|
||||||
CliThreadCommand.cpp
|
CliThreadCommand.cpp
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ DebugReportGenerator::GenerateReport(const entry_ref& outputPath)
|
|||||||
|
|
||||||
BString output;
|
BString output;
|
||||||
result = _GenerateReportHeader(output);
|
result = _GenerateReportHeader(output);
|
||||||
if (result != B_OK);
|
if (result != B_OK)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
result = _DumpLoadedImages(output);
|
result = _DumpLoadedImages(output);
|
||||||
@@ -96,7 +96,8 @@ DebugReportGenerator::_GenerateReportHeader(BString& _output)
|
|||||||
AutoLocker<Team> locker(fTeam);
|
AutoLocker<Team> locker(fTeam);
|
||||||
|
|
||||||
BString data;
|
BString data;
|
||||||
data.SetToFormat("Debug information for team %s (%" B_PRId32 "):\n\n");
|
data.SetToFormat("Debug information for team %s (%" B_PRId32 "):\n",
|
||||||
|
fTeam->Name(), fTeam->ID());
|
||||||
_output << data;
|
_output << data;
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
@@ -108,16 +109,23 @@ DebugReportGenerator::_DumpLoadedImages(BString& _output)
|
|||||||
{
|
{
|
||||||
AutoLocker<Team> locker(fTeam);
|
AutoLocker<Team> locker(fTeam);
|
||||||
|
|
||||||
|
_output << "\nLoaded Images:\n";
|
||||||
BString data;
|
BString data;
|
||||||
for (ImageList::ConstIterator it = fTeam->Images().GetIterator();
|
for (ImageList::ConstIterator it = fTeam->Images().GetIterator();
|
||||||
Image* image = it.Next();) {
|
Image* image = it.Next();) {
|
||||||
const ImageInfo& info = image->Info();
|
const ImageInfo& info = image->Info();
|
||||||
|
char buffer[32];
|
||||||
try {
|
try {
|
||||||
data.SetToFormat("\t%s, id: %" B_PRId32", type: %" B_PRId32 ", "
|
target_addr_t textBase = info.TextBase();
|
||||||
"Text: 0x%" B_PRIx64 ", %" B_PRIu64 " bytes, Data: 0x%"
|
target_addr_t dataBase = info.DataBase();
|
||||||
B_PRIx64 ", %" B_PRIu64 " bytes\n", info.Name().String(),
|
|
||||||
info.ImageID(), info.Type(), info.TextBase(), info.TextSize(),
|
data.SetToFormat("\t%s (%" B_PRId32 ", %s) "
|
||||||
info.DataBase(), info.DataSize());
|
"Text: %#08" B_PRIx64 " - %#08" B_PRIx64 ", Data: %#08"
|
||||||
|
B_PRIx64 " - %#08" B_PRIx64 "\n", info.Name().String(),
|
||||||
|
info.ImageID(), UiUtils::ImageTypeToString(info.Type(),
|
||||||
|
buffer, sizeof(buffer)), textBase,
|
||||||
|
textBase + info.TextSize(), dataBase,
|
||||||
|
dataBase + info.DataSize());
|
||||||
|
|
||||||
_output << data;
|
_output << data;
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
@@ -134,15 +142,17 @@ DebugReportGenerator::_DumpRunningThreads(BString& _output)
|
|||||||
{
|
{
|
||||||
AutoLocker<Team> locker(fTeam);
|
AutoLocker<Team> locker(fTeam);
|
||||||
|
|
||||||
|
_output << "\nActive Threads:\n";
|
||||||
BString data;
|
BString data;
|
||||||
status_t result = B_OK;
|
status_t result = B_OK;
|
||||||
for (ThreadList::ConstIterator it = fTeam->Threads().GetIterator();
|
for (ThreadList::ConstIterator it = fTeam->Threads().GetIterator();
|
||||||
Thread* thread = it.Next();) {
|
Thread* thread = it.Next();) {
|
||||||
try {
|
try {
|
||||||
data.SetToFormat("\t%s %s, id: %" B_PRId32", state: %" B_PRId32
|
data.SetToFormat("\t%s %s, id: %" B_PRId32", state: %s\n",
|
||||||
"\n", thread->Name(), thread->IsMainThread()
|
thread->Name(), thread->IsMainThread()
|
||||||
? "(main)" : "", UiUtils::ThreadStateToString(
|
? "(main)" : "", thread->ID(),
|
||||||
thread->State(), thread->StoppedReason()));
|
UiUtils::ThreadStateToString(thread->State(),
|
||||||
|
thread->StoppedReason()));
|
||||||
|
|
||||||
_output << data;
|
_output << data;
|
||||||
|
|
||||||
@@ -168,10 +178,12 @@ DebugReportGenerator::_DumpDebuggedThreadInfo(BString& _output, Thread* thread)
|
|||||||
if (trace == NULL)
|
if (trace == NULL)
|
||||||
return B_OK;
|
return B_OK;
|
||||||
|
|
||||||
|
_output << "\t\tFrame\t\tIP\t\t\tFunction Name\n";
|
||||||
|
_output << "\t\t-----------------------------------------------\n";
|
||||||
BString data;
|
BString data;
|
||||||
for (int32 i = 0; StackFrame* frame = trace->FrameAt(i); i++) {
|
for (int32 i = 0; StackFrame* frame = trace->FrameAt(i); i++) {
|
||||||
char functionName[512];
|
char functionName[512];
|
||||||
data.SetToFormat("0x%" B_PRIx64 "\t0x%" B_PRIx64 "\t%s\n",
|
data.SetToFormat("\t\t%#08" B_PRIx64 "\t%#08" B_PRIx64 "\t%s\n",
|
||||||
frame->FrameAddress(), frame->InstructionPointer(),
|
frame->FrameAddress(), frame->InstructionPointer(),
|
||||||
UiUtils::FunctionNameForFrame(frame, functionName,
|
UiUtils::FunctionNameForFrame(frame, functionName,
|
||||||
sizeof(functionName)));
|
sizeof(functionName)));
|
||||||
@@ -179,16 +191,17 @@ DebugReportGenerator::_DumpDebuggedThreadInfo(BString& _output, Thread* thread)
|
|||||||
_output << data;
|
_output << data;
|
||||||
}
|
}
|
||||||
|
|
||||||
_output << "\nRegisters:\n\n";
|
_output << "\n\t\tRegisters:\n";
|
||||||
|
|
||||||
CpuState* state = thread->GetCpuState();
|
CpuState* state = thread->GetCpuState();
|
||||||
BVariant value;
|
BVariant value;
|
||||||
|
const Register* reg = NULL;
|
||||||
for (int32 i = 0; i < fArchitecture->CountRegisters(); i++) {
|
for (int32 i = 0; i < fArchitecture->CountRegisters(); i++) {
|
||||||
const Register* reg = fArchitecture->Registers() + i;
|
reg = fArchitecture->Registers() + i;
|
||||||
state->GetRegisterValue(reg, value);
|
state->GetRegisterValue(reg, value);
|
||||||
|
|
||||||
char buffer[64];
|
char buffer[64];
|
||||||
data.SetToFormat("%s\t%0x%s\n", reg->Name(),
|
data.SetToFormat("\t\t\t%5s:\t%s\n", reg->Name(),
|
||||||
UiUtils::VariantToString(value, buffer, sizeof(buffer)));
|
UiUtils::VariantToString(value, buffer, sizeof(buffer)));
|
||||||
_output << data;
|
_output << data;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2012, Rene Gollent, rene@gollent.com.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "CliDebugReportCommand.h"
|
||||||
|
|
||||||
|
#include <Entry.h>
|
||||||
|
#include <FindDirectory.h>
|
||||||
|
#include <Path.h>
|
||||||
|
#include <String.h>
|
||||||
|
|
||||||
|
#include "CliContext.h"
|
||||||
|
#include "UiUtils.h"
|
||||||
|
#include "UserInterface.h"
|
||||||
|
|
||||||
|
|
||||||
|
CliDebugReportCommand::CliDebugReportCommand()
|
||||||
|
:
|
||||||
|
CliCommand("save debug report",
|
||||||
|
"%s\n"
|
||||||
|
"Saves a debug information report for the current team.")
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
CliDebugReportCommand::Execute(int argc, const char* const* argv, CliContext& context)
|
||||||
|
{
|
||||||
|
char buffer[B_FILE_NAME_LENGTH];
|
||||||
|
UiUtils::ReportNameForTeam(context.GetTeam(), buffer, sizeof(buffer));
|
||||||
|
BPath path;
|
||||||
|
find_directory(B_DESKTOP_DIRECTORY, &path);
|
||||||
|
path.Append(buffer);
|
||||||
|
entry_ref ref;
|
||||||
|
if (get_ref_for_path(path.Path(), &ref) == B_OK)
|
||||||
|
context.GetUserInterfaceListener()->DebugReportRequested(&ref);
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2012, Rene Gollent, rene@gollent.com.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
#ifndef CLI_DEBUG_REPORT_COMMAND_H
|
||||||
|
#define CLI_DEBUG_REPORT_COMMAND_H
|
||||||
|
|
||||||
|
|
||||||
|
#include "CliCommand.h"
|
||||||
|
|
||||||
|
|
||||||
|
class CliDebugReportCommand : public CliCommand {
|
||||||
|
public:
|
||||||
|
CliDebugReportCommand();
|
||||||
|
virtual void Execute(int argc, const char* const* argv,
|
||||||
|
CliContext& context);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif // CLI_DEBUG_REPORT_COMMAND_H
|
||||||
@@ -11,9 +11,9 @@
|
|||||||
#include <AutoLocker.h>
|
#include <AutoLocker.h>
|
||||||
|
|
||||||
#include "CliContext.h"
|
#include "CliContext.h"
|
||||||
#include "FunctionInstance.h"
|
|
||||||
#include "StackTrace.h"
|
#include "StackTrace.h"
|
||||||
#include "Team.h"
|
#include "Team.h"
|
||||||
|
#include "UiUtils.h"
|
||||||
|
|
||||||
|
|
||||||
CliStackTraceCommand::CliStackTraceCommand()
|
CliStackTraceCommand::CliStackTraceCommand()
|
||||||
@@ -63,24 +63,9 @@ CliStackTraceCommand::Execute(int argc, const char* const* argv,
|
|||||||
printf("%3" B_PRId32 " %#" B_PRIx64 " %#" B_PRIx64, i,
|
printf("%3" B_PRId32 " %#" B_PRIx64 " %#" B_PRIx64, i,
|
||||||
(uint64)frame->FrameAddress(), (uint64)frame->InstructionPointer());
|
(uint64)frame->FrameAddress(), (uint64)frame->InstructionPointer());
|
||||||
|
|
||||||
Image* image = frame->GetImage();
|
char functionName[512];
|
||||||
FunctionInstance* function = frame->Function();
|
UiUtils::FunctionNameForFrame(frame, functionName,
|
||||||
if (image == NULL && function == NULL) {
|
sizeof(functionName));
|
||||||
printf(" ???\n");
|
printf(" %s\n", functionName);
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
BString name;
|
|
||||||
target_addr_t baseAddress;
|
|
||||||
if (function != NULL) {
|
|
||||||
name = function->PrettyName();
|
|
||||||
baseAddress = function->Address();
|
|
||||||
} else {
|
|
||||||
name = image->Name();
|
|
||||||
baseAddress = image->Info().TextBase();
|
|
||||||
}
|
|
||||||
|
|
||||||
printf(" %s + %#" B_PRIx64 "\n", name.String(),
|
|
||||||
uint64(frame->InstructionPointer() - baseAddress));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2011, Rene Gollent, rene@gollent.com.
|
* Copyright 2011-2012, Rene Gollent, rene@gollent.com.
|
||||||
* Copyright 2012, Ingo Weinhold, ingo_weinhold@gmx.de.
|
* Copyright 2012, Ingo Weinhold, ingo_weinhold@gmx.de.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*/
|
*/
|
||||||
@@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
#include "CliContext.h"
|
#include "CliContext.h"
|
||||||
#include "CliContinueCommand.h"
|
#include "CliContinueCommand.h"
|
||||||
|
#include "CliDebugReportCommand.h"
|
||||||
#include "CliQuitCommand.h"
|
#include "CliQuitCommand.h"
|
||||||
#include "CliStackTraceCommand.h"
|
#include "CliStackTraceCommand.h"
|
||||||
#include "CliStopCommand.h"
|
#include "CliStopCommand.h"
|
||||||
@@ -284,7 +285,9 @@ CommandLineUserInterface::_RegisterCommands()
|
|||||||
_RegisterCommand("sc", stackTraceCommandReference2.Detach()) &&
|
_RegisterCommand("sc", stackTraceCommandReference2.Detach()) &&
|
||||||
_RegisterCommand("stop", new(std::nothrow) CliStopCommand) &&
|
_RegisterCommand("stop", new(std::nothrow) CliStopCommand) &&
|
||||||
_RegisterCommand("thread", new(std::nothrow) CliThreadCommand) &&
|
_RegisterCommand("thread", new(std::nothrow) CliThreadCommand) &&
|
||||||
_RegisterCommand("threads", new(std::nothrow) CliThreadsCommand)) {
|
_RegisterCommand("threads", new(std::nothrow) CliThreadsCommand) &&
|
||||||
|
_RegisterCommand("save-report",
|
||||||
|
new(std::nothrow) CliDebugReportCommand)) {
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
|
|
||||||
#include <Button.h>
|
#include <Button.h>
|
||||||
#include <FilePanel.h>
|
#include <FilePanel.h>
|
||||||
|
#include <FindDirectory.h>
|
||||||
#include <LayoutBuilder.h>
|
#include <LayoutBuilder.h>
|
||||||
#include <Menu.h>
|
#include <Menu.h>
|
||||||
#include <MenuBar.h>
|
#include <MenuBar.h>
|
||||||
@@ -42,6 +43,7 @@
|
|||||||
#include "StackTraceView.h"
|
#include "StackTraceView.h"
|
||||||
#include "Tracing.h"
|
#include "Tracing.h"
|
||||||
#include "TypeComponentPath.h"
|
#include "TypeComponentPath.h"
|
||||||
|
#include "UiUtils.h"
|
||||||
#include "UserInterface.h"
|
#include "UserInterface.h"
|
||||||
#include "Variable.h"
|
#include "Variable.h"
|
||||||
#include "WatchPromptWindow.h"
|
#include "WatchPromptWindow.h"
|
||||||
@@ -54,6 +56,7 @@ enum {
|
|||||||
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
MSG_CHOOSE_DEBUG_REPORT_LOCATION = 'ccrl',
|
||||||
MSG_LOCATE_SOURCE_IF_NEEDED = 'lsin'
|
MSG_LOCATE_SOURCE_IF_NEEDED = 'lsin'
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -111,7 +114,7 @@ TeamWindow::TeamWindow(::Team* team, UserInterfaceListener* listener)
|
|||||||
fStepIntoButton(NULL),
|
fStepIntoButton(NULL),
|
||||||
fStepOutButton(NULL),
|
fStepOutButton(NULL),
|
||||||
fInspectorWindow(NULL),
|
fInspectorWindow(NULL),
|
||||||
fSourceLocatePanel(NULL)
|
fFilePanel(NULL)
|
||||||
{
|
{
|
||||||
fTeam->Lock();
|
fTeam->Lock();
|
||||||
BString name = fTeam->Name();
|
BString name = fTeam->Name();
|
||||||
@@ -143,7 +146,7 @@ TeamWindow::~TeamWindow()
|
|||||||
_SetActiveImage(NULL);
|
_SetActiveImage(NULL);
|
||||||
_SetActiveThread(NULL);
|
_SetActiveThread(NULL);
|
||||||
|
|
||||||
delete fSourceLocatePanel;
|
delete fFilePanel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -215,6 +218,38 @@ void
|
|||||||
TeamWindow::MessageReceived(BMessage* message)
|
TeamWindow::MessageReceived(BMessage* message)
|
||||||
{
|
{
|
||||||
switch (message->what) {
|
switch (message->what) {
|
||||||
|
case MSG_CHOOSE_DEBUG_REPORT_LOCATION:
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
char filename[B_FILE_NAME_LENGTH];
|
||||||
|
UiUtils::ReportNameForTeam(fTeam, filename, sizeof(filename));
|
||||||
|
BMessenger msgr(this);
|
||||||
|
fFilePanel = new BFilePanel(B_SAVE_PANEL, &msgr,
|
||||||
|
NULL, 0, false, new BMessage(MSG_GENERATE_DEBUG_REPORT));
|
||||||
|
fFilePanel->SetSaveText(filename);
|
||||||
|
fFilePanel->Show();
|
||||||
|
} catch (...) {
|
||||||
|
delete fFilePanel;
|
||||||
|
fFilePanel = NULL;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MSG_GENERATE_DEBUG_REPORT:
|
||||||
|
{
|
||||||
|
delete fFilePanel;
|
||||||
|
fFilePanel = NULL;
|
||||||
|
|
||||||
|
BPath path;
|
||||||
|
entry_ref ref;
|
||||||
|
if (message->FindRef("directory", &ref) == B_OK
|
||||||
|
&& message->HasString("name")) {
|
||||||
|
path.SetTo(&ref);
|
||||||
|
path.Append(message->FindString("name"));
|
||||||
|
if (get_ref_for_path(path.Path(), &ref) == B_OK)
|
||||||
|
fListener->DebugReportRequested(&ref);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
case MSG_SHOW_INSPECTOR_WINDOW:
|
case MSG_SHOW_INSPECTOR_WINDOW:
|
||||||
{
|
{
|
||||||
if (fInspectorWindow) {
|
if (fInspectorWindow) {
|
||||||
@@ -284,14 +319,14 @@ TeamWindow::MessageReceived(BMessage* message)
|
|||||||
->SourceFile() != NULL && fActiveSourceCode != NULL
|
->SourceFile() != NULL && fActiveSourceCode != NULL
|
||||||
&& fActiveSourceCode->GetSourceFile() == NULL) {
|
&& fActiveSourceCode->GetSourceFile() == NULL) {
|
||||||
try {
|
try {
|
||||||
if (fSourceLocatePanel == NULL) {
|
if (fFilePanel == NULL) {
|
||||||
fSourceLocatePanel = new BFilePanel(B_OPEN_PANEL,
|
fFilePanel = new BFilePanel(B_OPEN_PANEL,
|
||||||
new BMessenger(this));
|
new BMessenger(this));
|
||||||
}
|
}
|
||||||
fSourceLocatePanel->Show();
|
fFilePanel->Show();
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
delete fSourceLocatePanel;
|
delete fFilePanel;
|
||||||
fSourceLocatePanel = NULL;
|
fFilePanel = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -799,6 +834,10 @@ TeamWindow::_Init()
|
|||||||
item->SetTarget(this);
|
item->SetTarget(this);
|
||||||
menu = new BMenu("Tools");
|
menu = new BMenu("Tools");
|
||||||
fMenuBar->AddItem(menu);
|
fMenuBar->AddItem(menu);
|
||||||
|
item = new BMenuItem("Save Debug Report",
|
||||||
|
new BMessage(MSG_CHOOSE_DEBUG_REPORT_LOCATION));
|
||||||
|
menu->AddItem(item);
|
||||||
|
item->SetTarget(this);
|
||||||
item = new BMenuItem("Inspect Memory",
|
item = new BMenuItem("Inspect Memory",
|
||||||
new BMessage(MSG_SHOW_INSPECTOR_WINDOW), 'I');
|
new BMessage(MSG_SHOW_INSPECTOR_WINDOW), 'I');
|
||||||
menu->AddItem(item);
|
menu->AddItem(item);
|
||||||
|
|||||||
@@ -193,7 +193,7 @@ private:
|
|||||||
BSplitView* fThreadSplitView;
|
BSplitView* fThreadSplitView;
|
||||||
InspectorWindow* fInspectorWindow;
|
InspectorWindow* fInspectorWindow;
|
||||||
GuiTeamUiSettings fUiSettings;
|
GuiTeamUiSettings fUiSettings;
|
||||||
BFilePanel* fSourceLocatePanel;
|
BFilePanel* fFilePanel;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2012, Ingo Weinhold, ingo_weinhold@gmx.de.
|
* Copyright 2012, Ingo Weinhold, ingo_weinhold@gmx.de.
|
||||||
|
* Copyright 2012, Rene Gollent, rene@gollent.com.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -8,11 +9,14 @@
|
|||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include <DateTime.h>
|
||||||
|
#include <Path.h>
|
||||||
#include <Variant.h>
|
#include <Variant.h>
|
||||||
|
|
||||||
#include "FunctionInstance.h"
|
#include "FunctionInstance.h"
|
||||||
#include "Image.h"
|
#include "Image.h"
|
||||||
#include "StackFrame.h"
|
#include "StackFrame.h"
|
||||||
|
#include "Team.h"
|
||||||
#include "Thread.h"
|
#include "Thread.h"
|
||||||
|
|
||||||
|
|
||||||
@@ -109,3 +113,46 @@ UiUtils::FunctionNameForFrame(StackFrame* frame, char* buffer,
|
|||||||
|
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*static*/ const char*
|
||||||
|
UiUtils::ImageTypeToString(image_type type, char* buffer, size_t bufferSize)
|
||||||
|
{
|
||||||
|
switch (type) {
|
||||||
|
case B_APP_IMAGE:
|
||||||
|
snprintf(buffer, bufferSize, "Application");
|
||||||
|
break;
|
||||||
|
case B_LIBRARY_IMAGE:
|
||||||
|
snprintf(buffer, bufferSize, "Library");
|
||||||
|
break;
|
||||||
|
case B_ADD_ON_IMAGE:
|
||||||
|
snprintf(buffer, bufferSize, "Add-on");
|
||||||
|
break;
|
||||||
|
case B_SYSTEM_IMAGE:
|
||||||
|
snprintf(buffer, bufferSize, "System");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
snprintf(buffer, bufferSize, "Unknown");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*static*/ const char*
|
||||||
|
UiUtils::ReportNameForTeam(::Team* team, char* buffer, size_t bufferSize)
|
||||||
|
{
|
||||||
|
BPath teamPath(team->Name());
|
||||||
|
BDateTime currentTime;
|
||||||
|
currentTime.SetTime_t(time(NULL));
|
||||||
|
snprintf(buffer, bufferSize, "%s-%" B_PRId32 "-debug-%02" B_PRId32 "-%02"
|
||||||
|
B_PRId32 "-%02" B_PRId32 "-%02" B_PRId32 "-%02" B_PRId32 "-%02"
|
||||||
|
B_PRId32 ".report", teamPath.Leaf(), team->ID(),
|
||||||
|
currentTime.Date().Day(), currentTime.Date().Month(),
|
||||||
|
currentTime.Date().Year(), currentTime.Time().Hour(),
|
||||||
|
currentTime.Time().Minute(), currentTime.Time().Second());
|
||||||
|
|
||||||
|
return buffer;
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@@ -7,11 +7,12 @@
|
|||||||
|
|
||||||
#include <size_t.h>
|
#include <size_t.h>
|
||||||
|
|
||||||
|
#include <image.h>
|
||||||
class StackFrame;
|
|
||||||
|
|
||||||
|
|
||||||
class BVariant;
|
class BVariant;
|
||||||
|
class StackFrame;
|
||||||
|
class Team;
|
||||||
|
|
||||||
|
|
||||||
class UiUtils {
|
class UiUtils {
|
||||||
@@ -23,6 +24,11 @@ public:
|
|||||||
char* buffer, size_t bufferSize);
|
char* buffer, size_t bufferSize);
|
||||||
static const char* FunctionNameForFrame(StackFrame* frame,
|
static const char* FunctionNameForFrame(StackFrame* frame,
|
||||||
char* buffer, size_t bufferSize);
|
char* buffer, size_t bufferSize);
|
||||||
|
static const char* ImageTypeToString(image_type type,
|
||||||
|
char* buffer, size_t bufferSize);
|
||||||
|
|
||||||
|
static const char* ReportNameForTeam(::Team* team,
|
||||||
|
char* buffer, size_t bufferSize);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
SubDir HAIKU_TOP src apps haiku3d ;
|
SubDir HAIKU_TOP src apps haiku3d ;
|
||||||
|
SubDirSysHdrs $(HAIKU_GLU_HEADERS) ;
|
||||||
SubDirSysHdrs $(HAIKU_MESA_HEADERS) ;
|
SubDirSysHdrs $(HAIKU_MESA_HEADERS) ;
|
||||||
|
|
||||||
SEARCH_SOURCE += [ FDirName $(SUBDIR) mesh ] ;
|
SEARCH_SOURCE += [ FDirName $(SUBDIR) mesh ] ;
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
SubDir HAIKU_TOP src bin debug ltrace arch arm ;
|
||||||
|
|
||||||
|
# TODO: Implement!
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2012, Haiku, Inc.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*
|
||||||
|
* Authors:
|
||||||
|
* Ithamar R. Adema <ithamar@upgrade-android.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <debug_support.h>
|
||||||
|
|
||||||
|
#include "arch_debug_support.h"
|
||||||
|
|
||||||
|
status_t
|
||||||
|
arch_debug_get_instruction_pointer(debug_context *context, thread_id thread,
|
||||||
|
void **ip, void **stackFrameAddress)
|
||||||
|
{
|
||||||
|
return B_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
arch_debug_get_stack_frame(debug_context *context, void *stackFrameAddress,
|
||||||
|
debug_stack_frame_info *stackFrameInfo)
|
||||||
|
{
|
||||||
|
return B_ERROR;
|
||||||
|
}
|
||||||
@@ -6,8 +6,6 @@
|
|||||||
|
|
||||||
#include <Catalog.h>
|
#include <Catalog.h>
|
||||||
|
|
||||||
#include <syslog.h>
|
|
||||||
|
|
||||||
#include <Application.h>
|
#include <Application.h>
|
||||||
#include <Autolock.h>
|
#include <Autolock.h>
|
||||||
#include <CatalogData.h>
|
#include <CatalogData.h>
|
||||||
|
|||||||
@@ -10,7 +10,6 @@
|
|||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <new>
|
#include <new>
|
||||||
#include <syslog.h>
|
|
||||||
|
|
||||||
#include <AppFileInfo.h>
|
#include <AppFileInfo.h>
|
||||||
#include <Application.h>
|
#include <Application.h>
|
||||||
@@ -118,9 +117,6 @@ DefaultCatalog::DefaultCatalog(const entry_ref &catalogOwner, const char *langua
|
|||||||
}
|
}
|
||||||
|
|
||||||
fInitCheck = status;
|
fInitCheck = status;
|
||||||
log_team(LOG_DEBUG,
|
|
||||||
"trying to load default-catalog(sig=%s, lang=%s) results in %s",
|
|
||||||
fSignature.String(), language, strerror(fInitCheck));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -134,9 +130,6 @@ DefaultCatalog::DefaultCatalog(entry_ref *appOrAddOnRef)
|
|||||||
HashMapCatalog("", "", 0)
|
HashMapCatalog("", "", 0)
|
||||||
{
|
{
|
||||||
fInitCheck = ReadFromResource(*appOrAddOnRef);
|
fInitCheck = ReadFromResource(*appOrAddOnRef);
|
||||||
log_team(LOG_DEBUG,
|
|
||||||
"trying to load embedded catalog from resources results in %s",
|
|
||||||
strerror(fInitCheck));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -167,8 +160,6 @@ DefaultCatalog::SetSignature(const entry_ref &catalogOwner)
|
|||||||
BAppFileInfo objectInfo(&objectFile);
|
BAppFileInfo objectInfo(&objectFile);
|
||||||
char objectSignature[B_MIME_TYPE_LENGTH];
|
char objectSignature[B_MIME_TYPE_LENGTH];
|
||||||
if (objectInfo.GetSignature(objectSignature) != B_OK) {
|
if (objectInfo.GetSignature(objectSignature) != B_OK) {
|
||||||
log_team(LOG_ERR, "File %s has no mimesignature, so it can't use"
|
|
||||||
" localization.", catalogOwner.name);
|
|
||||||
fSignature = "";
|
fSignature = "";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -183,8 +174,6 @@ DefaultCatalog::SetSignature(const entry_ref &catalogOwner)
|
|||||||
else
|
else
|
||||||
stripSignature ++;
|
stripSignature ++;
|
||||||
|
|
||||||
log_team(LOG_DEBUG, "Image %s requested catalog with mimetype %s",
|
|
||||||
catalogOwner.name, stripSignature);
|
|
||||||
fSignature = stripSignature;
|
fSignature = stripSignature;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -204,40 +193,25 @@ DefaultCatalog::ReadFromFile(const char *path)
|
|||||||
|
|
||||||
BFile catalogFile;
|
BFile catalogFile;
|
||||||
status_t res = catalogFile.SetTo(path, B_READ_ONLY);
|
status_t res = catalogFile.SetTo(path, B_READ_ONLY);
|
||||||
if (res != B_OK) {
|
if (res != B_OK)
|
||||||
log_team(LOG_DEBUG, "LocaleKit DefaultCatalog: no catalog at %s", path);
|
|
||||||
return B_ENTRY_NOT_FOUND;
|
return B_ENTRY_NOT_FOUND;
|
||||||
}
|
|
||||||
|
|
||||||
fPath = path;
|
fPath = path;
|
||||||
log_team(LOG_DEBUG, "LocaleKit DefaultCatalog: found catalog at %s", path);
|
|
||||||
|
|
||||||
off_t sz = 0;
|
off_t sz = 0;
|
||||||
res = catalogFile.GetSize(&sz);
|
res = catalogFile.GetSize(&sz);
|
||||||
if (res != B_OK) {
|
if (res != B_OK) {
|
||||||
log_team(LOG_ERR, "LocaleKit DefaultCatalog: couldn't get size for "
|
|
||||||
"catalog-file %s", path);
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto_ptr<char> buf(new(std::nothrow) char [sz]);
|
auto_ptr<char> buf(new(std::nothrow) char [sz]);
|
||||||
if (buf.get() == NULL) {
|
if (buf.get() == NULL)
|
||||||
log_team(LOG_ERR, "LocaleKit DefaultCatalog: couldn't allocate array "
|
|
||||||
"of %d chars", sz);
|
|
||||||
return B_NO_MEMORY;
|
return B_NO_MEMORY;
|
||||||
}
|
|
||||||
res = catalogFile.Read(buf.get(), sz);
|
res = catalogFile.Read(buf.get(), sz);
|
||||||
if (res < B_OK) {
|
if (res < B_OK)
|
||||||
log_team(LOG_ERR, "LocaleKit DefaultCatalog: couldn't read from "
|
|
||||||
"catalog-file %s", path);
|
|
||||||
return res;
|
return res;
|
||||||
}
|
if (res < sz)
|
||||||
if (res < sz) {
|
|
||||||
log_team(LOG_ERR,
|
|
||||||
"LocaleKit DefaultCatalog: only got %lu instead of %Lu bytes from "
|
|
||||||
"catalog-file %s", res, sz, path);
|
|
||||||
return res;
|
return res;
|
||||||
}
|
|
||||||
BMemoryIO memIO(buf.get(), sz);
|
BMemoryIO memIO(buf.get(), sz);
|
||||||
res = Unflatten(&memIO);
|
res = Unflatten(&memIO);
|
||||||
|
|
||||||
@@ -260,43 +234,24 @@ DefaultCatalog::ReadFromAttribute(const entry_ref &appOrAddOnRef)
|
|||||||
{
|
{
|
||||||
BNode node;
|
BNode node;
|
||||||
status_t res = node.SetTo(&appOrAddOnRef);
|
status_t res = node.SetTo(&appOrAddOnRef);
|
||||||
if (res != B_OK) {
|
if (res != B_OK)
|
||||||
log_team(LOG_ERR,
|
|
||||||
"couldn't find app or add-on (dev=%lu, dir=%Lu, name=%s)",
|
|
||||||
appOrAddOnRef.device, appOrAddOnRef.directory,
|
|
||||||
appOrAddOnRef.name);
|
|
||||||
return B_ENTRY_NOT_FOUND;
|
return B_ENTRY_NOT_FOUND;
|
||||||
}
|
|
||||||
|
|
||||||
log_team(LOG_DEBUG,
|
|
||||||
"looking for embedded catalog-attribute in app/add-on"
|
|
||||||
"(dev=%lu, dir=%Lu, name=%s)", appOrAddOnRef.device,
|
|
||||||
appOrAddOnRef.directory, appOrAddOnRef.name);
|
|
||||||
|
|
||||||
attr_info attrInfo;
|
attr_info attrInfo;
|
||||||
res = node.GetAttrInfo(BLocaleRoster::kEmbeddedCatAttr, &attrInfo);
|
res = node.GetAttrInfo(BLocaleRoster::kEmbeddedCatAttr, &attrInfo);
|
||||||
if (res != B_OK) {
|
if (res != B_OK)
|
||||||
log_team(LOG_DEBUG, "no embedded catalog found");
|
|
||||||
return B_NAME_NOT_FOUND;
|
return B_NAME_NOT_FOUND;
|
||||||
}
|
if (attrInfo.type != B_MESSAGE_TYPE)
|
||||||
if (attrInfo.type != B_MESSAGE_TYPE) {
|
|
||||||
log_team(LOG_ERR, "attribute %s has incorrect type and is ignored!",
|
|
||||||
BLocaleRoster::kEmbeddedCatAttr);
|
|
||||||
return B_BAD_TYPE;
|
return B_BAD_TYPE;
|
||||||
}
|
|
||||||
|
|
||||||
size_t size = attrInfo.size;
|
size_t size = attrInfo.size;
|
||||||
auto_ptr<char> buf(new(std::nothrow) char [size]);
|
auto_ptr<char> buf(new(std::nothrow) char [size]);
|
||||||
if (buf.get() == NULL) {
|
if (buf.get() == NULL)
|
||||||
log_team(LOG_ERR, "couldn't allocate array of %d chars", size);
|
|
||||||
return B_NO_MEMORY;
|
return B_NO_MEMORY;
|
||||||
}
|
|
||||||
res = node.ReadAttr(BLocaleRoster::kEmbeddedCatAttr, B_MESSAGE_TYPE, 0,
|
res = node.ReadAttr(BLocaleRoster::kEmbeddedCatAttr, B_MESSAGE_TYPE, 0,
|
||||||
buf.get(), size);
|
buf.get(), size);
|
||||||
if (res < (ssize_t)size) {
|
if (res < (ssize_t)size)
|
||||||
log_team(LOG_ERR, "unable to read embedded catalog from attribute");
|
|
||||||
return res < B_OK ? res : B_BAD_DATA;
|
return res < B_OK ? res : B_BAD_DATA;
|
||||||
}
|
|
||||||
|
|
||||||
BMemoryIO memIO(buf.get(), size);
|
BMemoryIO memIO(buf.get(), size);
|
||||||
res = Unflatten(&memIO);
|
res = Unflatten(&memIO);
|
||||||
@@ -310,35 +265,20 @@ DefaultCatalog::ReadFromResource(const entry_ref &appOrAddOnRef)
|
|||||||
{
|
{
|
||||||
BFile file;
|
BFile file;
|
||||||
status_t res = file.SetTo(&appOrAddOnRef, B_READ_ONLY);
|
status_t res = file.SetTo(&appOrAddOnRef, B_READ_ONLY);
|
||||||
if (res != B_OK) {
|
if (res != B_OK)
|
||||||
log_team(LOG_ERR,
|
|
||||||
"couldn't find app or add-on (dev=%lu, dir=%Lu, name=%s)",
|
|
||||||
appOrAddOnRef.device, appOrAddOnRef.directory,
|
|
||||||
appOrAddOnRef.name);
|
|
||||||
return B_ENTRY_NOT_FOUND;
|
return B_ENTRY_NOT_FOUND;
|
||||||
}
|
|
||||||
|
|
||||||
log_team(LOG_DEBUG,
|
|
||||||
"looking for embedded catalog-resource in app/add-on"
|
|
||||||
"(dev=%lu, dir=%Lu, name=%s)", appOrAddOnRef.device,
|
|
||||||
appOrAddOnRef.directory, appOrAddOnRef.name);
|
|
||||||
|
|
||||||
BResources rsrc;
|
BResources rsrc;
|
||||||
res = rsrc.SetTo(&file);
|
res = rsrc.SetTo(&file);
|
||||||
if (res != B_OK) {
|
if (res != B_OK)
|
||||||
log_team(LOG_DEBUG, "file has no resources");
|
|
||||||
return res;
|
return res;
|
||||||
}
|
|
||||||
|
|
||||||
int mangledLanguage = CatKey::HashFun(fLanguageName.String(), 0);
|
int mangledLanguage = CatKey::HashFun(fLanguageName.String(), 0);
|
||||||
|
|
||||||
size_t sz;
|
size_t sz;
|
||||||
const void *buf = rsrc.LoadResource('CADA',
|
const void *buf = rsrc.LoadResource('CADA', mangledLanguage, &sz);
|
||||||
mangledLanguage, &sz);
|
if (!buf)
|
||||||
if (!buf) {
|
|
||||||
log_team(LOG_DEBUG, "file has no catalog-resource");
|
|
||||||
return B_NAME_NOT_FOUND;
|
return B_NAME_NOT_FOUND;
|
||||||
}
|
|
||||||
|
|
||||||
BMemoryIO memIO(buf, sz);
|
BMemoryIO memIO(buf, sz);
|
||||||
res = Unflatten(&memIO);
|
res = Unflatten(&memIO);
|
||||||
@@ -540,11 +480,6 @@ DefaultCatalog::Unflatten(BDataIO *dataIO)
|
|||||||
// not accept this catalog:
|
// not accept this catalog:
|
||||||
if (foundFingerprint != 0 && fFingerprint != 0
|
if (foundFingerprint != 0 && fFingerprint != 0
|
||||||
&& foundFingerprint != fFingerprint) {
|
&& foundFingerprint != fFingerprint) {
|
||||||
log_team(LOG_INFO, "default-catalog(sig=%s, lang=%s) "
|
|
||||||
"has mismatching fingerprint (%ld instead of the requested %ld), "
|
|
||||||
"so this catalog is skipped.",
|
|
||||||
fSignature.String(), fLanguageName.String(), foundFingerprint,
|
|
||||||
fFingerprint);
|
|
||||||
res = B_MISMATCHED_VALUES;
|
res = B_MISMATCHED_VALUES;
|
||||||
} else
|
} else
|
||||||
fFingerprint = foundFingerprint;
|
fFingerprint = foundFingerprint;
|
||||||
@@ -580,14 +515,8 @@ DefaultCatalog::Unflatten(BDataIO *dataIO)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
uint32 checkFP = ComputeFingerprint();
|
uint32 checkFP = ComputeFingerprint();
|
||||||
if (fFingerprint != checkFP) {
|
if (fFingerprint != checkFP)
|
||||||
log_team(LOG_WARNING, "default-catalog(sig=%s, lang=%s) "
|
|
||||||
"has wrong fingerprint after load (%ld instead of the %ld). "
|
|
||||||
"The catalog data may be corrupted, so this catalog is skipped.",
|
|
||||||
fSignature.String(), fLanguageName.String(), checkFP,
|
|
||||||
fFingerprint);
|
|
||||||
return B_BAD_DATA;
|
return B_BAD_DATA;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,8 +3,6 @@
|
|||||||
* The required mimetypes and attribute-indices are created here.
|
* The required mimetypes and attribute-indices are created here.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <syslog.h>
|
|
||||||
|
|
||||||
#include <fs_attr.h>
|
#include <fs_attr.h>
|
||||||
#include <fs_index.h>
|
#include <fs_index.h>
|
||||||
#include <Volume.h>
|
#include <Volume.h>
|
||||||
@@ -35,19 +33,8 @@ static void EnsureIndexExists(const char *attrName)
|
|||||||
if (volRoster.GetBootVolume(&bootVol) != B_OK)
|
if (volRoster.GetBootVolume(&bootVol) != B_OK)
|
||||||
return;
|
return;
|
||||||
struct index_info idxInfo;
|
struct index_info idxInfo;
|
||||||
if (fs_stat_index(bootVol.Device(), attrName, &idxInfo) != 0) {
|
if (fs_stat_index(bootVol.Device(), attrName, &idxInfo) != 0)
|
||||||
status_t res = fs_create_index(bootVol.Device(), attrName,
|
fs_create_index(bootVol.Device(), attrName, B_STRING_TYPE, 0);
|
||||||
B_STRING_TYPE, 0);
|
|
||||||
if (res == 0) {
|
|
||||||
log_team(LOG_INFO,
|
|
||||||
"successfully created the required index for attribute %s",
|
|
||||||
attrName);
|
|
||||||
} else {
|
|
||||||
log_team(LOG_ERR,
|
|
||||||
"failed to create the required index for attribute %s (%s)",
|
|
||||||
attrName, strerror(res));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -122,10 +109,6 @@ SetupCatalogBasics()
|
|||||||
if (res == B_OK)
|
if (res == B_OK)
|
||||||
res = mt.Install();
|
res = mt.Install();
|
||||||
}
|
}
|
||||||
if (res != B_OK) {
|
|
||||||
log_team(LOG_ERR, "Could not install mimetype %s (%s)",
|
|
||||||
DefaultCatalog::kCatMimeType, strerror(res));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,6 @@
|
|||||||
#include <set>
|
#include <set>
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <syslog.h>
|
|
||||||
|
|
||||||
#include <Autolock.h>
|
#include <Autolock.h>
|
||||||
#include <Bitmap.h>
|
#include <Bitmap.h>
|
||||||
@@ -521,11 +520,8 @@ BLocaleRoster::GetLocalizedFileName(BString& localizedFileName,
|
|||||||
// The signature is missing application/
|
// The signature is missing application/
|
||||||
signature.Prepend("application/");
|
signature.Prepend("application/");
|
||||||
status = roster.FindApp(signature, &catalogRef);
|
status = roster.FindApp(signature, &catalogRef);
|
||||||
if (status != B_OK) {
|
if (status != B_OK)
|
||||||
log_team(LOG_ERR, "Could not find the entry_ref for signature %s"
|
|
||||||
" to load a catalog.", signature.String());
|
|
||||||
return status;
|
return status;
|
||||||
}
|
|
||||||
|
|
||||||
BCatalog catalog(catalogRef);
|
BCatalog catalog(catalogRef);
|
||||||
const char* temp = catalog.GetString(string, context);
|
const char* temp = catalog.GetString(string, context);
|
||||||
@@ -562,11 +558,8 @@ BLocaleRoster::_GetCatalog(BCatalog* catalog, vint32* catalogInitStatus)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!found) {
|
if (!found)
|
||||||
log_team(LOG_DEBUG, "Catalog %x doesn't belong to any image!",
|
|
||||||
catalog);
|
|
||||||
return catalog;
|
return catalog;
|
||||||
}
|
|
||||||
|
|
||||||
// load the catalog for this mimetype and return it to the app
|
// load the catalog for this mimetype and return it to the app
|
||||||
entry_ref ref;
|
entry_ref ref;
|
||||||
|
|||||||
@@ -13,7 +13,6 @@
|
|||||||
#include <set>
|
#include <set>
|
||||||
|
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include <syslog.h>
|
|
||||||
|
|
||||||
#include <AppFileInfo.h>
|
#include <AppFileInfo.h>
|
||||||
#include <Application.h>
|
#include <Application.h>
|
||||||
@@ -91,13 +90,8 @@ CatalogAddOnInfo::MakeSureItsLoaded()
|
|||||||
B_SYMBOL_TYPE_TEXT, (void**)&fCreateFunc);
|
B_SYMBOL_TYPE_TEXT, (void**)&fCreateFunc);
|
||||||
get_image_symbol(fAddOnImage, "get_available_languages",
|
get_image_symbol(fAddOnImage, "get_available_languages",
|
||||||
B_SYMBOL_TYPE_TEXT, (void**)&fLanguagesFunc);
|
B_SYMBOL_TYPE_TEXT, (void**)&fLanguagesFunc);
|
||||||
log_team(LOG_DEBUG, "catalog-add-on %s has been loaded",
|
} else
|
||||||
fName.String());
|
|
||||||
} else {
|
|
||||||
log_team(LOG_DEBUG, "could not load catalog-add-on %s (%s)",
|
|
||||||
fName.String(), strerror(fAddOnImage));
|
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
} else if (fIsEmbedded) {
|
} else if (fIsEmbedded) {
|
||||||
// The built-in catalog still has to provide this function
|
// The built-in catalog still has to provide this function
|
||||||
fLanguagesFunc = default_catalog_get_available_languages;
|
fLanguagesFunc = default_catalog_get_available_languages;
|
||||||
@@ -115,8 +109,6 @@ CatalogAddOnInfo::UnloadIfPossible()
|
|||||||
fInstantiateFunc = NULL;
|
fInstantiateFunc = NULL;
|
||||||
fCreateFunc = NULL;
|
fCreateFunc = NULL;
|
||||||
fLanguagesFunc = NULL;
|
fLanguagesFunc = NULL;
|
||||||
// log_team(LOG_DEBUG, "catalog-add-on %s has been unloaded",
|
|
||||||
// fName.String());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -176,7 +168,6 @@ RosterData::~RosterData()
|
|||||||
BAutolock lock(fLock);
|
BAutolock lock(fLock);
|
||||||
|
|
||||||
_CleanupCatalogAddOns();
|
_CleanupCatalogAddOns();
|
||||||
closelog();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -320,11 +311,6 @@ RosterData::SetFilesystemTranslationPreferred(bool preferred)
|
|||||||
status_t
|
status_t
|
||||||
RosterData::_Initialize()
|
RosterData::_Initialize()
|
||||||
{
|
{
|
||||||
openlog_team("liblocale.so", LOG_PID, LOG_USER);
|
|
||||||
#ifndef DEBUG
|
|
||||||
setlogmask_team(LOG_UPTO(LOG_WARNING));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
status_t result = _InitializeCatalogAddOns();
|
status_t result = _InitializeCatalogAddOns();
|
||||||
if (result != B_OK)
|
if (result != B_OK)
|
||||||
return result;
|
return result;
|
||||||
@@ -429,16 +415,8 @@ RosterData::_InitializeCatalogAddOns()
|
|||||||
priority = *prioPtr;
|
priority = *prioPtr;
|
||||||
node.WriteAttr(kPriorityAttr, B_INT8_TYPE, 0,
|
node.WriteAttr(kPriorityAttr, B_INT8_TYPE, 0,
|
||||||
&priority, sizeof(int8));
|
&priority, sizeof(int8));
|
||||||
} else {
|
|
||||||
log_team(LOG_ERR,
|
|
||||||
"couldn't get priority for add-on %s\n",
|
|
||||||
fullAddOnPath.String());
|
|
||||||
}
|
}
|
||||||
unload_add_on(image);
|
unload_add_on(image);
|
||||||
} else {
|
|
||||||
log_team(LOG_ERR,
|
|
||||||
"couldn't load add-on %s, error: %s\n",
|
|
||||||
fullAddOnPath.String(), strerror(image));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -793,11 +771,8 @@ MutableLocaleRoster::LoadSystemCatalog(BCatalog* catalog) const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!found) {
|
if (!found)
|
||||||
log_team(LOG_DEBUG, "Unable to find libbe-image!");
|
|
||||||
|
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
|
||||||
|
|
||||||
// load the catalog for libbe into the given catalog
|
// load the catalog for libbe into the given catalog
|
||||||
entry_ref ref;
|
entry_ref ref;
|
||||||
|
|||||||
@@ -46,8 +46,8 @@
|
|||||||
#define MJUM9BYTES (9 * 1024)
|
#define MJUM9BYTES (9 * 1024)
|
||||||
#define MJUM16BYTES (16 * 1024)
|
#define MJUM16BYTES (16 * 1024)
|
||||||
|
|
||||||
#define ALIGN_BYTES (sizeof(int) - 1)
|
#define ALIGN_BYTES (sizeof(unsigned long) - 1)
|
||||||
#define ALIGN(x) ((((unsigned)x) + ALIGN_BYTES) & ~ALIGN_BYTES)
|
#define ALIGN(x) ((((unsigned long)x) + ALIGN_BYTES) & ~ALIGN_BYTES)
|
||||||
|
|
||||||
/* Macros for counting and rounding. */
|
/* Macros for counting and rounding. */
|
||||||
#ifndef howmany
|
#ifndef howmany
|
||||||
|
|||||||
@@ -26,29 +26,31 @@
|
|||||||
# define TRACE(x) ;
|
# define TRACE(x) ;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*! check_cpu_features
|
/*! Detect ARM core version and features.
|
||||||
*
|
Please note the fact that ARM7 and ARMv7 are two different things ;)
|
||||||
* Please note the fact that ARM7 and ARMv7 are two different things ;)
|
ARMx is a specific ARM CPU core instance, while ARMvX refers to the
|
||||||
* ARMx is a specific ARM CPU core instance, while ARMvX refers to the
|
ARM architecture specification version....
|
||||||
* ARM architecture specification version....
|
|
||||||
*
|
Most of the architecture versions we're detecting here we will probably
|
||||||
* Most of the architecture versions we're detecting here we will probably
|
never run on, just included for completeness sake... ARMv5 and up are
|
||||||
* never run on, just included for completeness sake... ARMv5 and up are
|
the likely ones for us to support (as they all have some kind of MMU).
|
||||||
* the likely ones for us to support (as they all have some kind of MMU).
|
*/
|
||||||
*/
|
|
||||||
|
|
||||||
static status_t
|
static status_t
|
||||||
check_cpu_features()
|
check_cpu_features()
|
||||||
{
|
{
|
||||||
uint32 result = 0;
|
uint32 result = 0;
|
||||||
int arch, variant = 0, part = 0, revision = 0, implementor = 0;
|
int arch;
|
||||||
|
int variant = 0;
|
||||||
|
int part = 0;
|
||||||
|
int revision = 0;
|
||||||
|
int implementor = 0;
|
||||||
|
|
||||||
asm volatile("MRC p15, 0, %[c1out], c0, c0, 0":[c1out] "=r" (result));
|
asm volatile("MRC p15, 0, %[c1out], c0, c0, 0":[c1out] "=r" (result));
|
||||||
|
|
||||||
implementor = (result >> 24) & 0xff;
|
implementor = (result >> 24) & 0xff;
|
||||||
|
|
||||||
if (!(result & (1 << 19))) {
|
if (!(result & (1 << 19))) {
|
||||||
switch((result >> 12) & 0xf) {
|
switch ((result >> 12) & 0xf) {
|
||||||
case 0: /* early ARMv3 or even older */
|
case 0: /* early ARMv3 or even older */
|
||||||
arch = ARCH_ARM_PRE_ARM7;
|
arch = ARCH_ARM_PRE_ARM7;
|
||||||
break;
|
break;
|
||||||
@@ -84,7 +86,6 @@ check_cpu_features()
|
|||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
// #pragma mark -
|
|
||||||
|
|
||||||
extern "C" void
|
extern "C" void
|
||||||
arch_spin(bigtime_t microseconds)
|
arch_spin(bigtime_t microseconds)
|
||||||
|
|||||||
@@ -0,0 +1,68 @@
|
|||||||
|
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
|
||||||
|
OUTPUT_ARCH(arm)
|
||||||
|
|
||||||
|
ENTRY(runtime_loader)
|
||||||
|
SEARCH_DIR("libgcc");
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
. = 0x00100000 + SIZEOF_HEADERS;
|
||||||
|
|
||||||
|
.interp : { *(.interp) }
|
||||||
|
.hash : { *(.hash) }
|
||||||
|
.dynsym : { *(.dynsym) }
|
||||||
|
.dynstr : { *(.dynstr) }
|
||||||
|
.rel.text : { *(.rel.text) *(.rel.gnu.linkonce.t*) }
|
||||||
|
.rela.text : { *(.rela.text) *(.rela.gnu.linkonce.t*) }
|
||||||
|
.rel.data : { *(.rel.data) *(.rel.gnu.linkonce.d*) }
|
||||||
|
.rela.data : { *(.rela.data) *(.rela.gnu.linkonce.d*) }
|
||||||
|
.rel.rodata : { *(.rel.rodata) *(.rel.gnu.linkonce.r*) }
|
||||||
|
.rela.rodata : { *(.rela.rodata) *(.rela.gnu.linkonce.r*) }
|
||||||
|
.rel.got : { *(.rel.got) }
|
||||||
|
.rela.got : { *(.rela.got) }
|
||||||
|
.rel.ctors : { *(.rel.ctors) }
|
||||||
|
.rela.ctors : { *(.rela.ctors) }
|
||||||
|
.rel.dtors : { *(.rel.dtors) }
|
||||||
|
.rela.dtors : { *(.rela.dtors) }
|
||||||
|
.rel.init : { *(.rel.init) }
|
||||||
|
.rela.init : { *(.rela.init) }
|
||||||
|
.rel.fini : { *(.rel.fini) }
|
||||||
|
.rela.fini : { *(.rela.fini) }
|
||||||
|
.rel.bss : { *(.rel.bss) }
|
||||||
|
.rela.bss : { *(.rela.bss) }
|
||||||
|
.rel.plt : { *(.rel.plt) }
|
||||||
|
.rela.plt : { *(.rela.plt) }
|
||||||
|
.init : { *(.init) } =0x9090
|
||||||
|
.plt : { *(.plt) }
|
||||||
|
|
||||||
|
/* text/read-only data */
|
||||||
|
.text : { *(.text .gnu.linkonce.t.*) }
|
||||||
|
|
||||||
|
.rodata : { *(.rodata) }
|
||||||
|
|
||||||
|
/* exception unwinding - should really not be needed! XXX: find the correct place. */
|
||||||
|
__exidx_start = .;
|
||||||
|
.ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) }
|
||||||
|
__exidx_end = .;
|
||||||
|
|
||||||
|
/* writable data */
|
||||||
|
. = ALIGN(0x1000) + (. & (0x1000 - 1));
|
||||||
|
__data_start = .;
|
||||||
|
PROVIDE(_data_start = .);
|
||||||
|
.data : { *(.data .gnu.linkonce.d.*) }
|
||||||
|
|
||||||
|
__ctor_list = .;
|
||||||
|
PROVIDE (_ctor_list = .);
|
||||||
|
.ctors : { *(.ctors) }
|
||||||
|
PROVIDE (__ctor_end = .);
|
||||||
|
|
||||||
|
|
||||||
|
/* uninitialized data (in same segment as writable data) */
|
||||||
|
PROVIDE (__bss_start = .);
|
||||||
|
.bss : { *(.bss) }
|
||||||
|
|
||||||
|
. = ALIGN(0x1000);
|
||||||
|
PROVIDE (_end = .);
|
||||||
|
|
||||||
|
/* Strip unnecessary stuff */
|
||||||
|
/DISCARD/ : { *(.comment .note .eh_frame .dtors) }
|
||||||
|
}
|
||||||
@@ -35,6 +35,6 @@ system_time(void)
|
|||||||
{
|
{
|
||||||
uint64 timeBase = __arm_get_time_base();
|
uint64 timeBase = __arm_get_time_base();
|
||||||
|
|
||||||
uint32 cv = *sConversionFactor;
|
uint32 cv = sConversionFactor ? *sConversionFactor : 0;
|
||||||
return (timeBase >> 32) * cv + (((timeBase & 0xffffffff) * cv) >> 32);
|
return (timeBase >> 32) * cv + (((timeBase & 0xffffffff) * cv) >> 32);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ local genericSources =
|
|||||||
s_floor.c s_floorf.c
|
s_floor.c s_floorf.c
|
||||||
s_ceil.c s_ceilf.c
|
s_ceil.c s_ceilf.c
|
||||||
s_modf.c
|
s_modf.c
|
||||||
|
w_powf.c e_powf.c
|
||||||
w_pow.c e_pow.c slowpow.c
|
w_pow.c e_pow.c slowpow.c
|
||||||
w_exp.c e_exp.c slowexp.c
|
w_exp.c e_exp.c slowexp.c
|
||||||
s_frexp.c s_expm1.c
|
s_frexp.c s_expm1.c
|
||||||
@@ -47,7 +48,7 @@ local genericSources =
|
|||||||
halfulp.c
|
halfulp.c
|
||||||
mpa.c mplog.c mpexp.c
|
mpa.c mplog.c mpexp.c
|
||||||
s_sin.c
|
s_sin.c
|
||||||
s_atan.c
|
s_atan.c s_atanf.c
|
||||||
s_tan.c
|
s_tan.c
|
||||||
e_asin.c w_asin.c
|
e_asin.c w_asin.c
|
||||||
e_log10.c w_log10.c
|
e_log10.c w_log10.c
|
||||||
@@ -57,11 +58,19 @@ local genericSources =
|
|||||||
e_log.c w_log.c
|
e_log.c w_log.c
|
||||||
e_cosh.c w_cosh.c
|
e_cosh.c w_cosh.c
|
||||||
e_sinh.c w_sinh.c
|
e_sinh.c w_sinh.c
|
||||||
|
s_cosf.c k_cosf.c
|
||||||
|
s_sinf.c k_sinf.c
|
||||||
s_ldexp.c s_ldexpf.c
|
s_ldexp.c s_ldexpf.c
|
||||||
s_scalbnf.c s_scalbn.c
|
s_scalbnf.c s_scalbn.c
|
||||||
s_copysign.c
|
s_copysign.c
|
||||||
s_tanh.c
|
s_tanh.c s_tanf.c k_tanf.c
|
||||||
s_lround.c s_lroundf.c s_round.c s_roundf.c
|
s_lround.c s_lroundf.c s_round.c s_roundf.c
|
||||||
|
s_rint.c s_rintf.c s_lrintf.c
|
||||||
|
e_fmodf.c w_fmodf.c
|
||||||
|
e_atan2f.c w_atan2f.c
|
||||||
|
e_rem_pio2f.c k_rem_pio2f.c
|
||||||
|
|
||||||
|
memrchr.c
|
||||||
;
|
;
|
||||||
|
|
||||||
MergeObject posix_gnu_arch_$(TARGET_ARCH)_generic.o :
|
MergeObject posix_gnu_arch_$(TARGET_ARCH)_generic.o :
|
||||||
|
|||||||
@@ -5,6 +5,6 @@ UsePrivateSystemHeaders ;
|
|||||||
SEARCH_SOURCE += [ FDirName $(SUBDIR) $(DOTDOT) generic ] ;
|
SEARCH_SOURCE += [ FDirName $(SUBDIR) $(DOTDOT) generic ] ;
|
||||||
|
|
||||||
MergeObject posix_string_arch_$(TARGET_ARCH).o :
|
MergeObject posix_string_arch_$(TARGET_ARCH).o :
|
||||||
memcpy.c
|
arch_string.S
|
||||||
memset.c
|
memset.c
|
||||||
;
|
;
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
|
|
||||||
#include <asm_defs.h>
|
#include <asm_defs.h>
|
||||||
|
|
||||||
//#warning M68K: optimize memcpy
|
|
||||||
#if 1
|
#if 1
|
||||||
|
|
||||||
/* that should be enough for now */
|
/* that should be enough for now */
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
SubDir HAIKU_TOP src system runtime_loader arch arm ;
|
||||||
|
|
||||||
|
UsePrivateHeaders runtime_loader ;
|
||||||
|
UsePrivateSystemHeaders ;
|
||||||
|
|
||||||
|
SubDirHdrs [ FDirName $(SUBDIR) $(DOTDOT) $(DOTDOT) ] ;
|
||||||
|
|
||||||
|
StaticLibrary libruntime_loader_$(TARGET_ARCH).a :
|
||||||
|
arch_relocate.cpp
|
||||||
|
:
|
||||||
|
<src!system!libroot!os!arch!$(TARGET_ARCH)>atomic.o
|
||||||
|
<src!system!libroot!os!arch!$(TARGET_ARCH)>thread.o
|
||||||
|
|
||||||
|
<src!system!libroot!posix!string!arch!$(TARGET_ARCH)>arch_string.o
|
||||||
|
<src!system!libroot!posix!string!arch!$(TARGET_ARCH)>memset.o
|
||||||
|
;
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2012, Haiku, Inc.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*
|
||||||
|
* Authors:
|
||||||
|
* Ithamar R. Adema <ithamar@upgrade-android.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "runtime_loader_private.h"
|
||||||
|
|
||||||
|
#include <runtime_loader.h>
|
||||||
|
|
||||||
|
//#define TRACE_RLD
|
||||||
|
#ifdef TRACE_RLD
|
||||||
|
# define TRACE(x) dprintf x
|
||||||
|
#else
|
||||||
|
# define TRACE(x) ;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void *__dso_handle;
|
||||||
|
|
||||||
|
status_t
|
||||||
|
arch_relocate_image(image_t *rootImage, image_t *image,
|
||||||
|
SymbolLookupCache* cache)
|
||||||
|
{
|
||||||
|
debugger("arch_relocate_image: Not Yet Implemented!");
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
+137
-129
@@ -450,137 +450,10 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
template<typename EhdrType, typename ShdrType>
|
template<typename EhdrType, typename ShdrType>
|
||||||
void _ParseELFHeader()
|
void _ParseELFHeader();
|
||||||
{
|
|
||||||
// read ELF header
|
|
||||||
EhdrType fileHeader;
|
|
||||||
Read(0, &fileHeader, sizeof(EhdrType), "Failed to read ELF header.");
|
|
||||||
|
|
||||||
// check data encoding (endianess)
|
|
||||||
switch (fileHeader.e_ident[EI_DATA]) {
|
|
||||||
case ELFDATA2LSB:
|
|
||||||
fHostEndianess = (htonl(1) != 1);
|
|
||||||
break;
|
|
||||||
case ELFDATA2MSB:
|
|
||||||
fHostEndianess = (htonl(1) == 1);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
case ELFDATANONE:
|
|
||||||
throw Exception(EIO, "Unsupported ELF data encoding.");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// get the header values
|
|
||||||
fELFHeaderSize = GetValue(fileHeader.e_ehsize);
|
|
||||||
fSectionHeaderTableOffset = GetValue(fileHeader.e_shoff);
|
|
||||||
fSectionHeaderSize = GetValue(fileHeader.e_shentsize);
|
|
||||||
fSectionHeaderCount = GetValue(fileHeader.e_shnum);
|
|
||||||
bool hasSectionHeaderTable = (fSectionHeaderTableOffset != 0);
|
|
||||||
|
|
||||||
// check the sanity of the header values
|
|
||||||
// ELF header size
|
|
||||||
if (fELFHeaderSize < sizeof(EhdrType)) {
|
|
||||||
throw Exception(EIO,
|
|
||||||
"Invalid ELF header: invalid ELF header size: %lu.",
|
|
||||||
fELFHeaderSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
// section header table offset and entry count/size
|
|
||||||
if (hasSectionHeaderTable) {
|
|
||||||
if (fSectionHeaderTableOffset < (off_t)fELFHeaderSize
|
|
||||||
|| fSectionHeaderTableOffset > fFileSize) {
|
|
||||||
throw Exception(EIO, "Invalid ELF header: invalid section "
|
|
||||||
"header table offset: %llu.",
|
|
||||||
fSectionHeaderTableOffset);
|
|
||||||
}
|
|
||||||
size_t sectionHeaderTableSize
|
|
||||||
= fSectionHeaderSize * fSectionHeaderCount;
|
|
||||||
if (fSectionHeaderSize < (off_t)sizeof(ShdrType)
|
|
||||||
|| fSectionHeaderTableOffset + (off_t)sectionHeaderTableSize
|
|
||||||
> fFileSize) {
|
|
||||||
throw Exception(EIO, "Invalid ELF header: section header "
|
|
||||||
"table exceeds file: %llu.",
|
|
||||||
fSectionHeaderTableOffset
|
|
||||||
+ sectionHeaderTableSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// load section header string section
|
|
||||||
uint16_t sectionHeaderStringSectionIndex
|
|
||||||
= GetValue(fileHeader.e_shstrndx);
|
|
||||||
if (sectionHeaderStringSectionIndex != SHN_UNDEF) {
|
|
||||||
if (sectionHeaderStringSectionIndex >= fSectionHeaderCount) {
|
|
||||||
throw Exception(EIO, "Invalid ELF header: invalid section "
|
|
||||||
"header string section index: %u.",
|
|
||||||
sectionHeaderStringSectionIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
// get the section info
|
|
||||||
SectionInfo info;
|
|
||||||
if (_ReadSectionHeader<ShdrType>(sectionHeaderStringSectionIndex,
|
|
||||||
info)) {
|
|
||||||
fSectionHeaderStrings = new char[info.size + 1];
|
|
||||||
Read(info.offset, fSectionHeaderStrings, info.size,
|
|
||||||
"Failed to read section header string section.");
|
|
||||||
fSectionHeaderStringsLength = info.size;
|
|
||||||
// null-terminate to be on the safe side
|
|
||||||
fSectionHeaderStrings[info.size] = '\0';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename ShdrType>
|
template<typename ShdrType>
|
||||||
bool _ReadSectionHeader(int index, SectionInfo& info)
|
bool _ReadSectionHeader(int index, SectionInfo& info);
|
||||||
{
|
|
||||||
off_t shOffset = fSectionHeaderTableOffset
|
|
||||||
+ index * fSectionHeaderSize;
|
|
||||||
ShdrType sectionHeader;
|
|
||||||
Read(shOffset, §ionHeader, sizeof(ShdrType),
|
|
||||||
"Failed to read ELF section header.");
|
|
||||||
|
|
||||||
// get the header values
|
|
||||||
uint32_t type = GetValue(sectionHeader.sh_type);
|
|
||||||
off_t offset = GetValue(sectionHeader.sh_offset);
|
|
||||||
size_t size = GetValue(sectionHeader.sh_size);
|
|
||||||
uint32_t nameIndex = GetValue(sectionHeader.sh_name);
|
|
||||||
|
|
||||||
// check the values
|
|
||||||
// SHT_NULL marks the header unused,
|
|
||||||
if (type == SHT_NULL)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// SHT_NOBITS sections take no space in the file
|
|
||||||
if (type != SHT_NOBITS) {
|
|
||||||
if (offset < (off_t)fELFHeaderSize || offset > fFileSize) {
|
|
||||||
throw Exception(EIO, "Invalid ELF section header: "
|
|
||||||
"invalid section offset: %llu.", offset);
|
|
||||||
}
|
|
||||||
off_t sectionEnd = offset + size;
|
|
||||||
if (sectionEnd > fFileSize) {
|
|
||||||
throw Exception(EIO, "Invalid ELF section header: "
|
|
||||||
"section exceeds file: %llu.", sectionEnd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// get name, if we have a string section
|
|
||||||
if (fSectionHeaderStrings) {
|
|
||||||
if (nameIndex >= (uint32_t)fSectionHeaderStringsLength) {
|
|
||||||
throw Exception(EIO, "Invalid ELF section header: "
|
|
||||||
"invalid name index: %lu.", nameIndex);
|
|
||||||
}
|
|
||||||
info.name = fSectionHeaderStrings + nameIndex;
|
|
||||||
} else {
|
|
||||||
info.name = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
info.type = type;
|
|
||||||
info.offset = offset;
|
|
||||||
info.size = size;
|
|
||||||
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// _SwapUInt16
|
// _SwapUInt16
|
||||||
static inline uint16_t _SwapUInt16(uint16_t value)
|
static inline uint16_t _SwapUInt16(uint16_t value)
|
||||||
@@ -658,6 +531,141 @@ uint64_t ELFObject::GetValue(uint64_t& value)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<typename EhdrType, typename ShdrType>
|
||||||
|
void ELFObject::_ParseELFHeader()
|
||||||
|
{
|
||||||
|
// read ELF header
|
||||||
|
EhdrType fileHeader;
|
||||||
|
Read(0, &fileHeader, sizeof(EhdrType), "Failed to read ELF header.");
|
||||||
|
|
||||||
|
// check data encoding (endianess)
|
||||||
|
switch (fileHeader.e_ident[EI_DATA]) {
|
||||||
|
case ELFDATA2LSB:
|
||||||
|
fHostEndianess = (htonl(1) != 1);
|
||||||
|
break;
|
||||||
|
case ELFDATA2MSB:
|
||||||
|
fHostEndianess = (htonl(1) == 1);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
case ELFDATANONE:
|
||||||
|
throw Exception(EIO, "Unsupported ELF data encoding.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// get the header values
|
||||||
|
fELFHeaderSize = GetValue(fileHeader.e_ehsize);
|
||||||
|
fSectionHeaderTableOffset = GetValue(fileHeader.e_shoff);
|
||||||
|
fSectionHeaderSize = GetValue(fileHeader.e_shentsize);
|
||||||
|
fSectionHeaderCount = GetValue(fileHeader.e_shnum);
|
||||||
|
bool hasSectionHeaderTable = (fSectionHeaderTableOffset != 0);
|
||||||
|
|
||||||
|
// check the sanity of the header values
|
||||||
|
// ELF header size
|
||||||
|
if (fELFHeaderSize < sizeof(EhdrType)) {
|
||||||
|
throw Exception(EIO,
|
||||||
|
"Invalid ELF header: invalid ELF header size: %lu.",
|
||||||
|
fELFHeaderSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
// section header table offset and entry count/size
|
||||||
|
if (hasSectionHeaderTable) {
|
||||||
|
if (fSectionHeaderTableOffset < (off_t)fELFHeaderSize
|
||||||
|
|| fSectionHeaderTableOffset > fFileSize) {
|
||||||
|
throw Exception(EIO, "Invalid ELF header: invalid section "
|
||||||
|
"header table offset: %llu.",
|
||||||
|
fSectionHeaderTableOffset);
|
||||||
|
}
|
||||||
|
size_t sectionHeaderTableSize
|
||||||
|
= fSectionHeaderSize * fSectionHeaderCount;
|
||||||
|
if (fSectionHeaderSize < (off_t)sizeof(ShdrType)
|
||||||
|
|| fSectionHeaderTableOffset + (off_t)sectionHeaderTableSize
|
||||||
|
> fFileSize) {
|
||||||
|
throw Exception(EIO, "Invalid ELF header: section header "
|
||||||
|
"table exceeds file: %llu.",
|
||||||
|
fSectionHeaderTableOffset
|
||||||
|
+ sectionHeaderTableSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// load section header string section
|
||||||
|
uint16_t sectionHeaderStringSectionIndex
|
||||||
|
= GetValue(fileHeader.e_shstrndx);
|
||||||
|
if (sectionHeaderStringSectionIndex != SHN_UNDEF) {
|
||||||
|
if (sectionHeaderStringSectionIndex >= fSectionHeaderCount) {
|
||||||
|
throw Exception(EIO, "Invalid ELF header: invalid section "
|
||||||
|
"header string section index: %u.",
|
||||||
|
sectionHeaderStringSectionIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
// get the section info
|
||||||
|
SectionInfo info;
|
||||||
|
if (_ReadSectionHeader<ShdrType>(sectionHeaderStringSectionIndex,
|
||||||
|
info)) {
|
||||||
|
fSectionHeaderStrings = new char[info.size + 1];
|
||||||
|
Read(info.offset, fSectionHeaderStrings, info.size,
|
||||||
|
"Failed to read section header string section.");
|
||||||
|
fSectionHeaderStringsLength = info.size;
|
||||||
|
// null-terminate to be on the safe side
|
||||||
|
fSectionHeaderStrings[info.size] = '\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<typename ShdrType>
|
||||||
|
bool ELFObject::_ReadSectionHeader(int index, SectionInfo& info)
|
||||||
|
{
|
||||||
|
off_t shOffset = fSectionHeaderTableOffset
|
||||||
|
+ index * fSectionHeaderSize;
|
||||||
|
ShdrType sectionHeader;
|
||||||
|
Read(shOffset, §ionHeader, sizeof(ShdrType),
|
||||||
|
"Failed to read ELF section header.");
|
||||||
|
|
||||||
|
// get the header values
|
||||||
|
uint32_t type = GetValue(sectionHeader.sh_type);
|
||||||
|
off_t offset = GetValue(sectionHeader.sh_offset);
|
||||||
|
size_t size = GetValue(sectionHeader.sh_size);
|
||||||
|
uint32_t nameIndex = GetValue(sectionHeader.sh_name);
|
||||||
|
|
||||||
|
// check the values
|
||||||
|
// SHT_NULL marks the header unused,
|
||||||
|
if (type == SHT_NULL)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// SHT_NOBITS sections take no space in the file
|
||||||
|
if (type != SHT_NOBITS) {
|
||||||
|
if (offset < (off_t)fELFHeaderSize || offset > fFileSize) {
|
||||||
|
throw Exception(EIO, "Invalid ELF section header: "
|
||||||
|
"invalid section offset: %llu.", offset);
|
||||||
|
}
|
||||||
|
off_t sectionEnd = offset + size;
|
||||||
|
if (sectionEnd > fFileSize) {
|
||||||
|
throw Exception(EIO, "Invalid ELF section header: "
|
||||||
|
"section exceeds file: %llu.", sectionEnd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// get name, if we have a string section
|
||||||
|
if (fSectionHeaderStrings) {
|
||||||
|
if (nameIndex >= (uint32_t)fSectionHeaderStringsLength) {
|
||||||
|
throw Exception(EIO, "Invalid ELF section header: "
|
||||||
|
"invalid name index: %lu.", nameIndex);
|
||||||
|
}
|
||||||
|
info.name = fSectionHeaderStrings + nameIndex;
|
||||||
|
} else {
|
||||||
|
info.name = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
info.type = type;
|
||||||
|
info.offset = offset;
|
||||||
|
info.size = size;
|
||||||
|
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// main
|
// main
|
||||||
int
|
int
|
||||||
main(int argc, const char* const* argv)
|
main(int argc, const char* const* argv)
|
||||||
|
|||||||
Reference in New Issue
Block a user