Merge branch 'master' into sam460ex

This commit is contained in:
François Revol
2012-11-23 14:18:16 +01:00
41 changed files with 737 additions and 462 deletions
+18 -10
View File
@@ -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 ;
+2
View File
@@ -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...........
+5
View File
@@ -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;
}
+2
View File
@@ -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
+1 -1
View File
@@ -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},
+1
View File
@@ -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
View File
@@ -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 ] ;
+3
View File
@@ -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;
}
-2
View File
@@ -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>
+14 -85
View File
@@ -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;
} }
+2 -19
View File
@@ -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));
}
} }
+2 -9
View File
@@ -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;
+2 -27
View File
@@ -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
+15 -14
View File
@@ -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) }
}
+1 -1
View File
@@ -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
View File
@@ -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, &sectionHeader, 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, &sectionHeader, 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)