Merge remote-tracking branch 'haiku/master' into package-management

Conflicts:
	build/jam/BuildSetup
	build/jam/HaikuImage
	build/jam/board/sam460ex/BoardSetup
	build/jam/board/verdex/BoardSetup
	data/catalogs/apps/icon-o-matic/fr.catkeys
	src/add-ons/kernel/drivers/audio/hda/hda_codec.cpp
	src/add-ons/kernel/drivers/disk/usb/usb_disk/usb_disk.cpp
	src/apps/debugger/files/FileManager.cpp
	src/apps/debugger/files/FileManager.h
	src/apps/debugger/user_interface/gui/inspector_window/MemoryView.cpp
	src/apps/haiku-depot/MainWindow.cpp
	src/apps/haiku-depot/MainWindow.h
	src/apps/haiku-depot/Model.cpp
	src/apps/haiku-depot/PackageInfo.h
	src/apps/haiku-depot/PackageInfoListener.h
	src/apps/haiku-depot/PackageInfoView.cpp
	src/apps/haiku-depot/PackageInfoView.h
	src/apps/haiku-depot/PackageListView.cpp
	src/apps/haiku-depot/PackageListView.h
	src/system/kernel/arch/arm/arch_timer.cpp
	src/system/libroot/os/arch/arm/atomic.S
	src/tools/translation/bitsinfo/Jamfile
	src/tools/translation/bmpinfo/Jamfile
	src/tools/translation/tgainfo/Jamfile
This commit is contained in:
Ingo Weinhold
2013-09-27 01:55:45 +02:00
91 changed files with 7806 additions and 550 deletions
+6 -1
View File
@@ -38,6 +38,12 @@ rule ArchitectureSetup architecture
gccBaseFlags += -Wno-array-bounds ;
}
local cpu = $(HAIKU_CPU_$(architecture)) ;
if $(cpu) = arm {
# For stackcrawls
gccBaseFlags += -mapcs-frame ;
}
# activating graphite optimizations
if $(HAIKU_USE_GCC_GRAPHITE_$(architecture)) = 1 {
gccBaseFlags += -floop-interchange -ftree-loop-distribution
@@ -67,7 +73,6 @@ rule ArchitectureSetup architecture
Exit "HAIKU_STRIP_$(architecture) not set. Please re-run configure." ;
}
local cpu = $(HAIKU_CPU_$(architecture)) ;
HAIKU_ARCH_$(architecture) = $(cpu) ;
HAIKU_ARCH ?= $(cpu) ;
# Set only, if not set yet. This way HAIKU_ARCH is set to the primary
+993
View File
@@ -0,0 +1,993 @@
# This file defines what ends up on the Haiku image (respectively in the Haiku
# installation directory) and it executes the rules building the image
# (respectively installing the files in the installation directory).
SYSTEM_BIN = [ FFilterByBuildFeatures
"["
addattr alert arp
base64 basename bash bc beep bfsinfo
cal cat catattr checkfs checkitout chgrp chmod chop chown chroot cksum clear
clockconfig cmp collectcatkeys comm compress copyattr CortexAddOnHost cp
csplit cut date dc dd desklink df diff diff3 dircolors dirname
diskimage draggers driveinfo dstcheck du dumpcatalog
echo eject env error expand expr
factor false fdinfo ffm filepanel find finddir FirstBootPrompt fmt fold
fortune frcode ftp ftpd funzip fwcontrol
gawk gdb@x86 getlimits groups gzip gzexe
hd head hey hostname
id ident ifconfig <bin>install installsound iroster isvolume
ideinfo@ide idestatus@ide
join kernel_debugger keymap keystore kill
less lessecho lesskey link linkcatkeys listarea listattr listimage listdev
listport listres listsem listusb ln locale locate logger login logname ls
lsindex
mail2mbox makebootable mbox2mail md5sum merge message mimeset mkdos mkdir
mkfifo mkfs mkindex mktemp modifiers mount mount_nfs mountvolume mv
netcat netstat nl nohup notify nproc
od open
passwd paste patch pathchk pc ping ping6 play playfile playsound playwav
pr prio printenv printf profile ps ptx pwd
query quit
rc readlink reindex release renice rlog rm rmattr rmindex rmdir roster
route
safemode screen_blanker screenmode screenshot sdiff setdecor setmime settype
setversion setvolume seq sha1sum shar shred shuf shutdown sleep sort
spamdbm split stat strace stty su sum sync sysinfo
tac tail tcpdump tcptester tee telnet telnetd test timeout top touch
<ncurses>tput tr traceroute translate trash true truncate tsort tty
uname unchop unexpand unmount uniq unlink unshar unzip unzipsfx
<bin>updatedb uptime urlwrapper useradd uudecode uuencode
vdir version vmstat
waitfor watch wc wget whoami writembr@x86 xargs xres
yes
zdiff zforce zgrep zip zipcloak <bin>zipgrep zipnote zipsplit zmore znew
] ;
SYSTEM_APPS = [ FFilterByBuildFeatures
AboutSystem ActivityMonitor BootManager@x86 CDPlayer CharacterMap
CodyCam Debugger DeskCalc Devices DiskProbe DiskUsage DriveSetup
Expander GLInfo@x86 Icon-O-Matic Installer LaunchBox Magnify Mail
MediaConverter MediaPlayer MidiPlayer NetworkStatus PackageInstaller People
PoorMan PowerStatus ProcessController Screenshot ShowImage SoundRecorder
StyledEdit Terminal TextSearch TV WebWatch Workspaces
] ;
SYSTEM_PREFERENCES = [ FFilterByBuildFeatures
Appearance Backgrounds CPUFrequency DataTranslations
<preference>Deskbar E-mail FileTypes Keyboard Keymap Locale Media
Mouse Network Notifications Printers Screen ScreenSaver
Shortcuts Sounds Time Touchpad <preference>Tracker VirtualMemory
] ;
SYSTEM_DEMOS = [ FFilterByBuildFeatures
BSnow Chart Clock Cortex FontDemo GLTeapot@x86
$(HAIKU_INCLUDE_TRADEMARKS)Haiku3d@x86 Mandelbrot OverlayImage PatchBay
Pairs Playground Pulse Sudoku
] ;
SYSTEM_LIBS = [ FFilterByBuildFeatures
libbe.so libbsd.so libbnetapi.so
libdebug.so libdevice.so
libgame.so libGL.so@x86 libglut.so@x86
libgnu.so libmail.so libmedia.so libmidi.so libmidi2.so
libnetwork.so
<revisioned>libroot.so libroot-addon-icu.so
libscreensaver.so
libtextencoding.so libtiff.so libtracker.so libtranslation.so
$(HAIKU_SHARED_LIBSTDC++) $(HAIKU_SHARED_LIBSUPC++)
] ;
PRIVATE_SYSTEM_LIBS = [ FFilterByBuildFeatures
$(HAIKU_JPEG_CURRENT_LIB)
$(HAIKU_LIBPNG_CURRENT_LIB)
$(HAIKU_ZLIB_CURRENT_LIB)
$(HAIKU_FREETYPE_CURRENT_LIB)
libalm.so
libfluidsynth.so
libilmimf.so
] ;
SYSTEM_SERVERS = [ FFilterByBuildFeatures
app_server cddb_daemon debug_server input_server keystore_server mail_daemon
media_addon_server media_server midi_server mount_server net_server
notification_server power_daemon print_server print_addon_server registrar
syslog_daemon dns_resolver_server nfs4_idmapper_server
] ;
SYSTEM_NETWORK_DEVICES = ethernet loopback ;
SYSTEM_NETWORK_DATALINK_PROTOCOLS = ethernet_frame <module>arp loopback_frame
ipv6_datagram ;
#SYSTEM_NETWORK_PPP = ipcp modem pap pppoe ;
SYSTEM_NETWORK_PROTOCOLS = ipv4 tcp udp icmp unix icmp6 ipv6 ;
SYSTEM_ADD_ONS_ACCELERANTS = [ FFilterByBuildFeatures
x86,x86_64 @{
vesa.accelerant intel_extreme.accelerant
}@ # x86,x86_64
x86 @{
3dfx.accelerant ati.accelerant matrox.accelerant neomagic.accelerant
nvidia.accelerant intel_810.accelerant
radeon.accelerant radeon_hd.accelerant s3.accelerant
#via.accelerant vmware.accelerant
}@ # x86
] ;
SYSTEM_ADD_ONS_TRANSLATORS = BMPTranslator EXRTranslator GIFTranslator
HVIFTranslator ICOTranslator JPEGTranslator JPEG2000Translator
PCXTranslator PNGTranslator PPMTranslator
RAWTranslator RTFTranslator SGITranslator STXTTranslator TGATranslator
TIFFTranslator WebPTranslator WonderBrushTranslator ICNSTranslator
;
SYSTEM_ADD_ONS_LOCALE_CATALOGS = <catalog-addon>plaintext ;
SYSTEM_ADD_ONS_MEDIA = [ FFilterByBuildFeatures
cortex_audioadapter.media_addon
cortex_flanger.media_addon
dvb.media_addon@x86
hmulti_audio.media_addon
mixer.media_addon
opensound.media_addon
tone_producer_demo.media_addon
usb_webcam.media_addon
video_producer_demo.media_addon
video_window_demo.media_addon
firewire_dv.media_addon@x86
#legacy.media_addon
equalizer.media_addon
vst_host.media_addon
] ;
SYSTEM_ADD_ONS_MEDIA_PLUGINS = [ FFilterByBuildFeatures
ffmpeg@ffmpeg raw_decoder
] ;
SYSTEM_ADD_ONS_PRINT =
Canon\ LIPS3\ Compatible
Canon\ LIPS4\ Compatible
Gutenprint
PCL5\ Compatible
PCL6\ Compatible
PDF\ Writer
PS\ Compatible
Preview
;
SYSTEM_ADD_ONS_PRINT_TRANSPORT = HP\ JetDirect IPP LPR
# Parallel\ Port
Print\ To\ File Serial\ Port USB\ Port
;
SYSTEM_ADD_ONS_SCREENSAVERS = [ FFilterByBuildFeatures
Butterfly DebugNow Flurry@x86
GLife@x86 $(HAIKU_INCLUDE_TRADEMARKS)Haiku Icons IFS Leaves
Message Spider Gravity@x86
] ;
SYSTEM_ADD_ONS_DRIVERS_AUDIO = auich auvia echo3g emuxki hda ice1712 sis7018 ;
SYSTEM_ADD_ONS_DRIVERS_AUDIO_OLD = ; #cmedia usb_audio ;
SYSTEM_ADD_ONS_DRIVERS_GRAPHICS = [ FFilterByBuildFeatures
x86,x86_64 @{
vesa intel_extreme
}@ # x86,x86_64
x86 @{
ati 3dfx intel_810 matrox neomagic nvidia radeon radeon_hd
s3 #via vmware
}@ # x86
] ;
SYSTEM_ADD_ONS_DRIVERS_MIDI = emuxki ice1712 usb_midi ;
SYSTEM_ADD_ONS_DRIVERS_NET = [ FFilterByBuildFeatures
x86,x86_64 @{
3com atheros813x ar81xx attansic_l1 attansic_l2 broadcom440x
broadcom570x dec21xxx ipro100 ipro1000 jmicron2x0 marvell_yukon nforce
pcnet rtl8139 rtl81xx sis19x syskonnect via_rhine vt612x
}@ # x86_64
etherpci pegasus sis900 usb_davicom usb_asix usb_ecm wb840
# WLAN drivers
x86 @{
aironetwifi atheroswifi broadcom43xx
iprowifi2100 iprowifi2200 iprowifi3945
iprowifi4965 marvell88w8363 marvell88w8335
ralinkwifi wavelanwifi
}@ # x86
# WWAN drivers
#usb_beceemwmx@gpl
] ;
SYSTEM_ADD_ONS_DRIVERS_POWER = [ FFilterByBuildFeatures acpi_button@x86 ] ;
SYSTEM_ADD_ONS_BUS_MANAGERS = [ FFilterByBuildFeatures
ata@ata pci ps2@x86,x86_64 isa@x86,x86_64
ide@ide scsi config_manager agp_gart@x86,x86_64 usb firewire@x86 acpi@x86
virtio random
] ;
SYSTEM_ADD_ONS_FILE_SYSTEMS = bfs btrfs cdda exfat ext2 fat iso9660 nfs nfs4
attribute_overlay write_overlay ntfs reiserfs@x86 udf googlefs ;
# wifi firmware
for driver in $(SYSTEM_ADD_ONS_DRIVERS_NET) {
local package = [ on $(driver) return $(HAIKU_WIFI_FIRMWARE_PACKAGE) ] ;
local archive = [ on $(driver) return $(HAIKU_WIFI_FIRMWARE_ARCHIVE) ] ;
local extract = [ on $(driver) return $(HAIKU_WIFI_FIRMWARE_DO_EXTRACT) ] ;
if $(archive) {
AddWifiFirmwareToHaikuImage $(driver) : $(package) : $(archive)
: $(extract) ;
}
local packages = [ on $(driver) return $(HAIKU_WIFI_FIRMWARE_PACKAGES) ] ;
local archives = [ on $(driver) return $(HAIKU_WIFI_FIRMWARE_ARCHIVES) ] ;
for archive in $(archives) {
AddWifiFirmwareToHaikuImage $(driver) : $(packages[1]) : $(archive)
: $(extract) ;
packages = $(packages[2-]) ;
}
}
# modules
AddFilesToHaikuImage system add-ons kernel bus_managers
: $(SYSTEM_ADD_ONS_BUS_MANAGERS) ;
AddFilesToHaikuImage system add-ons kernel busses agp_gart
: <agp_gart>intel@x86,x86_64 ;
if $(HAIKU_ATA_STACK) = 1 {
AddFilesToHaikuImage system add-ons kernel busses ata
: generic_ide_pci it8211 legacy_sata silicon_image_3112 ide_isa@x86 ;
} else {
AddFilesToHaikuImage system add-ons kernel busses ide
: generic_ide_pci it8211 legacy_sata silicon_image_3112 ide_isa@x86 ;
}
AddFilesToHaikuImage system add-ons kernel busses random
: virtio_rng ;
AddFilesToHaikuImage system add-ons kernel busses scsi
: ahci virtio_scsi ;
AddFilesToHaikuImage system add-ons kernel busses usb
: <usb>uhci <usb>ohci <usb>ehci ;
AddFilesToHaikuImage system add-ons kernel busses virtio
: virtio_pci ;
AddFilesToHaikuImage system add-ons kernel console : vga_text ;
AddFilesToHaikuImage system add-ons kernel debugger
: <kdebug>demangle <kdebug>disasm@x86 <kdebug>hangman
<kdebug>invalidate_on_exit <kdebug>usb_keyboard <kdebug>qrencode
<kdebug>run_on_exit ;
AddFilesToHaikuImage system add-ons kernel file_systems
: $(SYSTEM_ADD_ONS_FILE_SYSTEMS) ;
AddFilesToHaikuImage system add-ons kernel generic
: ata_adapter@ata bios@x86,x86_64 dpc ide_adapter@ide
locked_pool mpu401 scsi_periph <module>tty ;
AddFilesToHaikuImage system add-ons kernel partitioning_systems
: amiga_rdb apple efi_gpt intel session ;
AddFilesToHaikuImage system add-ons kernel interrupt_controllers
: openpic@ppc ;
if $(TARGET_ARCH) = x86 || $(TARGET_ARCH) = x86_64 {
AddFilesToHaikuImage system add-ons kernel cpu : generic_x86 ;
}
# drivers
AddNewDriversToHaikuImage disk scsi : scsi_cd scsi_disk ;
AddNewDriversToHaikuImage disk virtual : virtio_block ;
AddNewDriversToHaikuImage power : enhanced_speedstep@x86 ;
AddNewDriversToHaikuImage power : acpi_battery@x86 ;
#AddNewDriversToHaikuImage display : display_controls@x86 ;
# legacy drivers
AddDriversToHaikuImage : console dprintf null
<driver>tty zero ;
AddDriversToHaikuImage audio hmulti : $(SYSTEM_ADD_ONS_DRIVERS_AUDIO) ;
AddDriversToHaikuImage audio old : $(SYSTEM_ADD_ONS_DRIVERS_AUDIO_OLD) ;
AddDriversToHaikuImage midi : $(SYSTEM_ADD_ONS_DRIVERS_MIDI) ;
AddDriversToHaikuImage bus : usb_raw fw_raw@x86 ;
AddDriversToHaikuImage disk floppy : pc_floppy@x86 ;
AddDriversToHaikuImage disk usb : usb_disk ;
AddDriversToHaikuImage disk usb : usb_floppy ;
AddDriversToHaikuImage printer usb : usb_printer ;
AddDriversToHaikuImage disk virtual : nbd ;
AddDriversToHaikuImage dvb : cx23882 ;
AddDriversToHaikuImage graphics : $(SYSTEM_ADD_ONS_DRIVERS_GRAPHICS) ;
AddDriversToHaikuImage input : ps2_hid usb_hid wacom ;
AddDriversToHaikuImage misc : <driver>poke <driver>mem ;
AddDriversToHaikuImage net : $(SYSTEM_ADD_ONS_DRIVERS_NET) ;
AddDriversToHaikuImage ports : usb_serial ;
AddDriversToHaikuImage power : $(SYSTEM_ADD_ONS_DRIVERS_POWER) ;
# kernel
AddFilesToHaikuImage system : <revisioned>kernel_$(TARGET_ARCH) ;
# libs
AddLibrariesToHaikuHybridImage system lib
: $(SYSTEM_LIBS) $(PRIVATE_SYSTEM_LIBS) ;
# libnetwork.so replaces quite a few libraries
SYSTEM_LIBS_LIBNETWORK_ALIASES
= libsocket.so libbind.so libnet.so ;
if $(HAIKU_GCC_VERSION[1]) = 2 {
local lib ;
for lib in $(SYSTEM_LIBS_LIBNETWORK_ALIASES) {
AddSymlinkToHaikuHybridImage system lib : libnetwork.so : $(lib)
: : true ;
}
AddSymlinkToHaikuHybridImage system lib : libbnetapi.so : libnetapi.so
: : true ;
}
# libGL.so has GLU (like BeOS) built-in
SYSTEM_LIBS_LIBGL_ALIASES = libGLU.so ;
if $(TARGET_ARCH) = x86 {
local lib ;
for lib in $(SYSTEM_LIBS_LIBGL_ALIASES) {
AddSymlinkToHaikuHybridImage system lib : libGL.so : $(lib) : : true ;
}
}
SYSTEM_LIBS_ALIASES =
$(SYSTEM_LIBS_LIBNETWORK_ALIASES)
libnetapi.so
$(SYSTEM_LIBS_LIBGL_ALIASES)
;
OPTIONAL_LIBS_ALIASES =
libfreetype.so
libjpeg.so
libpng.so
libz.so
;
# libfreetype.so links to the current freetype lib
AddSymlinkToHaikuHybridImage system lib : $(HAIKU_FREETYPE_CURRENT_LIB:BS)
: $(HAIKU_FREETYPE_CURRENT_LINK) : : true ;
AddSymlinkToHaikuHybridImage system lib : $(HAIKU_FREETYPE_CURRENT_LINK)
: libfreetype.so : : true ;
# libpng.so links to the current libpng
AddSymlinkToHaikuHybridImage system lib : $(HAIKU_LIBPNG_CURRENT_LIB:BS)
: $(HAIKU_LIBPNG_CURRENT_LINK) : : true ;
AddSymlinkToHaikuHybridImage system lib : $(HAIKU_LIBPNG_CURRENT_LINK)
: libpng.so : : true ;
# libjpeg.so links to the current libjpeg
AddSymlinkToHaikuHybridImage system lib : $(HAIKU_JPEG_CURRENT_LIB:BS)
: $(HAIKU_JPEG_CURRENT_LINK) : : true ;
AddSymlinkToHaikuHybridImage system lib : $(HAIKU_JPEG_CURRENT_LINK)
: libjpeg.so : : true ;
# zlib.so links to the current zlib
AddSymlinkToHaikuHybridImage system lib : $(HAIKU_ZLIB_CURRENT_LIB:BS)
: $(HAIKU_ZLIB_CURRENT_LINK) : : true ;
AddSymlinkToHaikuHybridImage system lib : $(HAIKU_ZLIB_CURRENT_LINK)
: libz.so : : true ;
# servers
AddFilesToHaikuImage system servers : $(SYSTEM_SERVERS) ;
# apps
AddFilesToHaikuImage system : runtime_loader Deskbar Tracker ;
AddFilesToHaikuImage system bin : $(SYSTEM_BIN) consoled ;
AddFilesToHaikuImage system apps : $(SYSTEM_APPS) ;
AddFilesToHaikuImage system preferences : $(SYSTEM_PREFERENCES) ;
AddFilesToHaikuImage system demos : $(SYSTEM_DEMOS) ;
SEARCH on which = [ FDirName $(HAIKU_TOP) data bin ] ;
AddFilesToHaikuImage system bin : which ;
SEARCH on installoptionalpackage = [ FDirName $(HAIKU_TOP) data bin ] ;
AddFilesToHaikuImage system bin : installoptionalpackage ;
SEARCH on install-wifi-firmwares.sh = [ FDirName $(HAIKU_TOP) data bin ] ;
AddFilesToHaikuImage system bin : install-wifi-firmwares.sh ;
SEARCH on welcome = [ FDirName $(HAIKU_TOP) data bin ] ;
AddFilesToHaikuImage system bin : welcome ;
AddSymlinkToHaikuImage home Desktop
: /boot/system/bin/welcome : Welcome ;
SEARCH on userguide = [ FDirName $(HAIKU_TOP) data bin ] ;
AddFilesToHaikuImage system bin : userguide ;
AddSymlinkToHaikuImage home Desktop
: /boot/system/bin/userguide : User\ Guide ;
# Add the files to be used by installoptionalpackage.
AddDirectoryToHaikuImage common data optional-packages ;
local optional-pkg-files = BuildFeatures OptionalPackageDependencies
OptionalPackages OptionalLibPackages ;
for name in $(optional-pkg-files) {
local file = [ FDirName $(HAIKU_TOP) build jam $(name) ] ;
AddFilesToHaikuImage common data optional-packages : $(file) ;
}
AddInstalledPackagesFileToHaikuImage ;
AddSymlinkToHaikuImage system bin : bash : sh ;
AddSymlinkToHaikuImage system bin : trash : untrash ;
AddSymlinkToHaikuImage home Desktop : /boot/home : Home ;
# Mailbox folders and symlink
AddDirectoryToHaikuImage home mail draft ;
AddDirectoryToHaikuImage home mail in ;
AddDirectoryToHaikuImage home mail out ;
AddSymlinkToHaikuImage home config : settings/deskbar : be ;
# Deskbar Application links
AddDirectoryToHaikuImage home config settings deskbar Applications ;
DESKBAR_APPLICATIONS = ActivityMonitor CharacterMap CodyCam CDPlayer DeskCalc
Devices DiskProbe DriveSetup DiskUsage Expander Icon-O-Matic Installer
Magnify Mail MediaConverter MediaPlayer MidiPlayer People PoorMan
Screenshot SoundRecorder StyledEdit Terminal TV
;
local linkTarget ;
for linkTarget in $(DESKBAR_APPLICATIONS) {
AddSymlinkToHaikuImage home config settings deskbar Applications
: /boot/system/apps/$(linkTarget) : $(linkTarget) ;
}
# Deskbar Desktop applets links
AddDirectoryToHaikuImage home config settings deskbar Desktop\ applets ;
DESKBAR_DESKTOP_APPLETS = LaunchBox NetworkStatus PowerStatus ProcessController
Workspaces
;
for linkTarget in $(DESKBAR_DESKTOP_APPLETS) {
AddSymlinkToHaikuImage home config settings deskbar Desktop\ applets
: /boot/system/apps/$(linkTarget) : $(linkTarget) ;
}
# Deskbar Preferences links
AddDirectoryToHaikuImage home config settings deskbar Preferences ;
DESKBAR_PREFERENCES = $(SYSTEM_PREFERENCES:B) ;
for linkTarget in $(DESKBAR_PREFERENCES) {
AddSymlinkToHaikuImage home config settings deskbar Preferences
: /boot/system/preferences/$(linkTarget)
: $(linkTarget) ;
}
# Deskbar Demo links
AddDirectoryToHaikuImage home config settings deskbar Demos ;
for linkTarget in $(SYSTEM_DEMOS) {
AddSymlinkToHaikuImage home config settings deskbar Demos
: /boot/system/demos/$(linkTarget) : $(linkTarget) ;
}
AddSymlinkToHaikuImage system bin : less : more ;
AddSymlinkToHaikuImage system bin : gzip : gunzip ;
AddSymlinkToHaikuImage system bin : gzip : zcat ;
AddSymlinkToHaikuImage system bin : zdiff : zcmp ;
AddSymlinkToHaikuImage system bin : unzip : zipinfo ;
AddSymlinkToHaikuImage system bin : gawk : awk ;
# scripts and data files
local bootScripts = Bootscript Bootscript.cd SetupEnvironment Netscript
InstallerInitScript InstallerFinishScript ;
SEARCH on $(bootScripts) = [ FDirName $(HAIKU_TOP) data system boot ] ;
AddFilesToHaikuImage system boot : $(bootScripts) ;
local userBootScripts = UserBootscript UserSetupEnvironment.sample ;
SEARCH on $(userBootScripts) = [ FDirName $(HAIKU_TOP) data config boot ] ;
AddFilesToHaikuImage home config boot : $(userBootScripts) ;
# Add boot launch directory
AddDirectoryToHaikuImage home config boot launch ;
local logoArtwork =
$(HAIKU_INCLUDE_TRADEMARKS)"HAIKU logo - white on blue - big.png"
$(HAIKU_INCLUDE_TRADEMARKS)"HAIKU logo - white on blue - normal.png" ;
SEARCH on $(logoArtwork) = [ FDirName $(HAIKU_TOP) data artwork ] ;
AddFilesToHaikuImage system data artwork : $(logoArtwork) ;
AddDirectoryToHaikuImage system data sounds ;
# Add mail provider infos.
AddFilesToHaikuImage home config settings Mail ProviderInfo :
$(HAIKU_PROVIDER_INFOS) ;
# Mail spell check dictionaries
local spellFiles = words geekspeak ;
spellFiles = $(spellFiles:G=spell) ;
SEARCH on $(spellFiles)
= [ FDirName $(HAIKU_TOP) src apps mail ] ;
AddFilesToHaikuImage system data spell_check word_dictionary : $(spellFiles) ;
local etcDir = [ FDirName $(HAIKU_TOP) data etc ] ;
local etcFiles = inputrc profile ;
etcFiles = $(etcFiles:G=etc) ;
SEARCH on $(etcFiles) = [ FDirName $(etcDir) ] ;
etcFiles += <etc>termcap <etc>sysless <etc>sysless.in ;
AddFilesToHaikuImage common etc : $(etcFiles) ;
local profileFiles = [ Glob $(etcDir)/profile.d : *.sh ] ;
profileFiles = $(profileFiles:G=profile-d) ;
AddDirectoryToHaikuImage common etc profile.d ;
AddFilesToHaikuImage common etc profile.d : $(profileFiles) ;
#local bashCompletionFiles = [ Glob $(etcDir)/bash_completion.d : * ] ;
#local bashCompletionHelperFiles
# = [ Glob $(etcDir)/bash_completion.d/helpers : * ] ;
#bashCompletionFiles = $(bashCompletionFiles:G=bash-completion) ;
#bashCompletionHelperFiles = $(bashCompletionHelperFiles:G=bash-completion-hlp) ;
#AddDirectoryToHaikuImage common etc bash_completion.d ;
#AddDirectoryToHaikuImage common etc bash_completion.d helpers ;
#AddFilesToHaikuImage common etc bash_completion.d : $(bashCompletionFiles) ;
#AddFilesToHaikuImage common etc bash_completion.d helpers
# : $(bashCompletionHelperFiles) ;
local fortuneFiles = [ Glob $(HAIKU_TOP)/data/system/data/fortunes
: [a-zA-Z0-9]* ] ;
fortuneFiles = $(fortuneFiles:G=data!fortunes) ;
AddFilesToHaikuImage system data fortunes : $(fortuneFiles) ;
local fontDir = [ FDirName $(HAIKU_TOP) data system data fonts ] ;
local psFonts = [ Glob $(fontDir)/psfonts : *.afm *.pfb ] ;
local ttFonts = [ Glob $(fontDir)/ttfonts : *.ttf ] ;
AddFilesToHaikuImage system data fonts psfonts : $(psFonts) ;
AddFilesToHaikuImage system data fonts ttfonts : $(ttFonts) ;
local cannaDir = [ FDirName $(HAIKU_TOP) data system data Canna ] ;
local cannaDefault = [ Glob $(cannaDir)/default : *.canna *.gz ] ;
local cannaDic = [ Glob $(cannaDir)/dic : *.cbp ] ;
local cannaDicCanna = [ Glob $(cannaDir)/dic/canna
: *.cld *.ctd *.cbd *.dir ] ;
AddFilesToHaikuImage system data Canna default : $(cannaDefault) ;
AddFilesToHaikuImage system data Canna dic : $(cannaDic) ;
AddFilesToHaikuImage system data Canna dic canna : $(cannaDicCanna) ;
AddDirectoryToHaikuImage system data Canna dic group ;
AddDirectoryToHaikuImage system data Canna dic user ;
local keymapFiles = [ Glob [ FDirName $(HAIKU_TOP) src data keymaps ]
: *.keymap ] ;
keymapFiles = $(keymapFiles:BG=keymap) ;
AddFilesToHaikuImage system data Keymaps : $(keymapFiles) ;
AddSymlinkToHaikuImage system data Keymaps : Swedish : Finnish ;
AddSymlinkToHaikuImage system data Keymaps : Slovene : Croatian ;
AddSymlinkToHaikuImage system data Keymaps : US-International : Brazilian ;
# Copy keyboard layout files to the image one-by-one.
local keyboardLayoutsDir
= [ FDirName $(HAIKU_TOP) data system data KeyboardLayouts ] ;
local keyboardLayoutFiles =
"Generic 104-key"
"Generic 105-key International"
"Kinesis Advantage"
"Kinesis Ergo Elan International"
"TypeMatrix 2030" ;
keyboardLayoutFiles = $(keyboardLayoutFiles:G=keyboard-layout) ;
SEARCH on $(keyboardLayoutFiles) = $(keyboardLayoutsDir) ;
AddFilesToHaikuImage system data KeyboardLayouts
: $(keyboardLayoutFiles) ;
# Add Apple Aluminum keyboard layout files to the image in an Apple Aluminum
# subdirectory. The subdirectory is turned into a submenu in the Layout menu
# of the Keymap preference app.
local appleAluminumDir
= [ FDirName $(HAIKU_TOP) data system data KeyboardLayouts
Apple\ Aluminum ] ;
local appleAluminumFiles =
"Apple Aluminium Extended International"
"Apple Aluminium International"
"Apple Aluminum (US)"
"Apple Aluminum Extended (US)" ;
appleAluminumFiles = $(appleAluminumFiles:G=keyboard-layout) ;
SEARCH on $(appleAluminumFiles) = $(appleAluminumDir) ;
AddFilesToHaikuImage system data KeyboardLayouts Apple\ Aluminum
: $(appleAluminumFiles) ;
# Add ThinkPad keyboard layout files to the image in a ThinkPad
# subdirectory. The subdirectory is turned into a submenu in the Layout menu
# of the Keymap preference app.
local thinkpadDir
= [ FDirName $(HAIKU_TOP) data system data KeyboardLayouts ThinkPad ] ;
local thinkPadFiles =
"ThinkPad (US)"
"ThinkPad International"
"ThinkPad T400s (US)"
"ThinkPad T400s International"
"ThinkPad X1 (US)"
"ThinkPad X1 International"
"ThinkPad X100e (US)"
"ThinkPad X100e International" ;
thinkPadFiles = $(thinkPadFiles:G=keyboard-layout) ;
SEARCH on $(thinkPadFiles) = $(thinkpadDir) ;
AddFilesToHaikuImage system data KeyboardLayouts ThinkPad
: $(thinkPadFiles) ;
local driverSettingsFiles = <driver-settings>kernel ;
SEARCH on $(driverSettingsFiles)
= [ FDirName $(HAIKU_TOP) data settings kernel drivers ] ;
AddFilesToHaikuImage home config settings kernel drivers
: $(driverSettingsFiles) ;
local networkSettingsFiles = <network-settings>services ;
SEARCH on $(networkSettingsFiles)
= [ FDirName $(HAIKU_TOP) data settings network ] ;
AddFilesToHaikuImage common settings network : $(networkSettingsFiles) ;
# post install scripts and fresh install indicator file
local postInstallFiles = add_catalog_entry_attributes.sh
default_deskbar_items.sh mime_update.sh ;
postInstallFiles = $(postInstallFiles:G=post-install) ;
SEARCH on $(postInstallFiles)
= [ FDirName $(HAIKU_TOP) data common boot post_install ] ;
SEARCH on <post-install>fresh_install
= [ FDirName $(HAIKU_TOP) data common settings ] ;
AddFilesToHaikuImage common boot post_install : $(postInstallFiles) ;
AddFilesToHaikuImage common settings : <post-install>fresh_install ;
# boot loader
AddFilesToHaikuImage system : haiku_loader ;
# boot module links
AddBootModuleSymlinksToHaikuImage
acpi@x86 ata@ata pci isa@x86 config_manager dpc
ide@ide scsi usb
openpic@ppc
ata_adapter@ata ide_adapter@ide locked_pool scsi_periph
ahci generic_ide_pci it8211 legacy_sata silicon_image_3112
ide_isa@x86
<usb>uhci <usb>ohci <usb>ehci
scsi_cd scsi_disk usb_disk
virtio virtio_pci virtio_block virtio_scsi
efi_gpt
intel
bfs
;
# add-ons
AddFilesToHaikuImage system add-ons accelerants
: $(SYSTEM_ADD_ONS_ACCELERANTS) ;
# OpenGL renderers
if $(TARGET_ARCH) = x86 {
if $(HAIKU_GCC_VERSION[1]) = 2 {
AddFilesToHaikuHybridImage system add-ons opengl
: Legacy\ Software\ Rasterizer : : true ;
} else {
AddFilesToHaikuHybridImage system add-ons opengl
: Software\ Rasterizer : : true ;
# Future Gallium3d
}
}
AddFilesToHaikuHybridImage system add-ons Translators
: $(SYSTEM_ADD_ONS_TRANSLATORS) : : true ;
AddFilesToHaikuImage system add-ons locale catalogs
: $(SYSTEM_ADD_ONS_LOCALE_CATALOGS) ;
AddFilesToHaikuHybridImage system add-ons locale catalogs
: $(SYSTEM_ADD_ONS_LOCALE_CATALOGS) : : true ;
AddFilesToHaikuImage system add-ons mail_daemon inbound_protocols : POP3 IMAP ;
AddFilesToHaikuImage system add-ons mail_daemon outbound_protocols : SMTP ;
AddFilesToHaikuImage system add-ons mail_daemon inbound_filters
: MatchHeader SpamFilter NewMailNotification ;
AddFilesToHaikuImage system add-ons mail_daemon outbound_filters : Fortune ;
AddFilesToHaikuImage system add-ons media : $(SYSTEM_ADD_ONS_MEDIA) ;
AddFilesToHaikuImage system add-ons media plugins
: $(SYSTEM_ADD_ONS_MEDIA_PLUGINS) ;
AddFilesToHaikuImage system add-ons Tracker
: FileType Mark\ as… Mark\ as\ Read Open\ Target\ Folder
Open\ Terminal ZipOMatic ;
AddSymlinkToHaikuImage system add-ons Tracker
: /boot/system/preferences/Backgrounds : Background ;
AddSymlinkToHaikuImage system add-ons Tracker
: /boot/system/apps/TextSearch : TextSearch ;
AddSymlinkToHaikuImage system add-ons Tracker
: /boot/system/apps/DiskUsage : DiskUsage ;
AddFilesToHaikuImage system add-ons input_server devices
: <input>keyboard <input>mouse <input>tablet <input>wacom ;
AddFilesToHaikuImage system add-ons input_server filters
: screen_saver shortcut_catcher ;
AddFilesToHaikuImage system add-ons kernel network
: <net>notifications stack ;
AddFilesToHaikuImage system add-ons kernel network : dns_resolver ;
AddFilesToHaikuImage system add-ons kernel network devices
: $(SYSTEM_NETWORK_DEVICES) ;
AddFilesToHaikuImage system add-ons kernel network datalink_protocols
: $(SYSTEM_NETWORK_DATALINK_PROTOCOLS) ;
AddFilesToHaikuImage system add-ons kernel network ppp
: $(SYSTEM_NETWORK_PPP) ;
AddFilesToHaikuImage system add-ons kernel network protocols
: $(SYSTEM_NETWORK_PROTOCOLS) ;
AddFilesToHaikuImage system add-ons Print : $(SYSTEM_ADD_ONS_PRINT) ;
AddFilesToHaikuImage system add-ons Print transport
: $(SYSTEM_ADD_ONS_PRINT_TRANSPORT) ;
AddFilesToHaikuImage system add-ons Screen\ Savers
: $(SYSTEM_ADD_ONS_SCREENSAVERS) ;
AddFilesToHaikuImage system add-ons disk_systems
: <disk_system>intel <disk_system>gpt <disk_system>bfs <disk_system>ntfs ;
# decorators
AddDirectoryToHaikuImage home config add-ons decorators ;
#AddFilesToHaikuImage home config add-ons decorators : ;
# create directories that will remain empty
AddDirectoryToHaikuImage common bin ;
AddDirectoryToHaikuImage common include ;
AddDirectoryToHaikuImage common lib ;
AddDirectoryToHaikuImage home Desktop ;
AddDirectoryToHaikuImage home config bin ;
AddDirectoryToHaikuImage home config lib ;
AddDirectoryToHaikuImage home mail ;
AddDirectoryToHaikuImage common var empty ;
AddDirectoryToHaikuImage common var log ;
AddDirectoryToHaikuImage common cache tmp ;
AddDirectoryToHaikuImage home config add-ons kernel drivers bin ;
AddDirectoryToHaikuImage home config add-ons kernel drivers dev ;
AddDirectoryToHaikuImage home config add-ons input_server devices ;
AddDirectoryToHaikuImage home config add-ons input_server filters ;
AddDirectoryToHaikuImage home config add-ons input_server methods ;
AddDirectoryToHaikuImage home config add-ons media plugins ;
AddDirectoryToHaikuImage home config add-ons Tracker ;
AddDirectoryToHaikuImage home config add-ons Print ;
AddDirectoryToHaikuImage home config add-ons Screen\ Savers ;
AddDirectoryToHaikuImage home config add-ons Translators ;
AddDirectoryToHaikuImage system data synth ;
AddDirectoryToHaikuImage system add-ons input_server methods ;
# optional
AddFilesToHaikuImage optional system add-ons input_server methods : canna ;
# printers
AddDirectoryToHaikuImage home config settings printers Preview
: home-config-settings-printers-preview.rdef ;
AddDirectoryToHaikuImage home config settings printers "Save as PDF"
: home-config-settings-printers-save-as-pdf.rdef ;
# PDF Writer enconding files
CopyDirectoryToHaikuImage system data
: [ FDirName $(HAIKU_TOP) src add-ons print drivers pdf encoding ]
: "PDF Writer" : -x Jamfile ;
# Gutenprint data files
CopyDirectoryToHaikuImage system data
: [ FDirName $(HAIKU_TOP) src libs print libgutenprint src xml ]
: gutenprint : -x *.c -x Makefile.am -x Makefile.in ;
# dvb channel settings
CopyDirectoryToHaikuImage home config settings Media
: [ FDirName $(HAIKU_TOP) data settings media dvb ]
: dvb : -x Jamfile ;
# licenses
CopyDirectoryToHaikuImage system data
: [ FDirName $(HAIKU_TOP) data system data licenses ]
: licenses ;
# Copy documentation as per DiskUsage's license requirement.
CopyDirectoryToHaikuImage system documentation
: [ FDirName $(HAIKU_TOP) docs apps diskusage ]
: diskusage ;
# Copy documentation as per PDFlib Lite's license requirement.
CopyDirectoryToHaikuImage system documentation
: [ FDirName $(HAIKU_TOP) src libs pdflib doc ]
: pdflib ;
# Copy sample programs as per PDFlib Lite's license requirement.
CopyDirectoryToHaikuImage develop sample-code
: [ FDirName $(HAIKU_TOP) src libs pdflib bind pdflib ]
: pdflib ;
# Copy OpenGL kit headers into image
if $(TARGET_ARCH) = x86 {
CopyDirectoryToHaikuImage develop headers os opengl
: [ FDirName $(HAIKU_MESA_HEADERS) GL ] ;
CopyDirectoryToHaikuImage develop headers os opengl
: [ FDirName $(HAIKU_GLU_HEADERS) GL ] ;
}
#pragma mark - Optional Packages
HAIKU_IMAGE_OPTIONAL_PACKAGE_DESCRIPTIONS = ;
include [ FDirName $(HAIKU_BUILD_RULES_DIR) OptionalPackages ] ;
include [ FDirName $(HAIKU_BUILD_RULES_DIR) OptionalTestPackages ] ;
include [ FDirName $(HAIKU_BUILD_RULES_DIR) OptionalLibPackages ] ;
local optionalPackageDescriptions ;
if $(HAIKU_IMAGE_OPTIONAL_PACKAGE_DESCRIPTIONS) {
optionalPackageDescriptions = <haiku-image>optional_package_descriptions ;
MakeLocate $(optionalPackageDescriptions)
: $(HAIKU_COMMON_PLATFORM_OBJECT_DIR) ;
Depends $(optionalPackageDescriptions)
: $(HAIKU_IMAGE_OPTIONAL_PACKAGE_DESCRIPTIONS) ;
actions together BuildOptionalPackageDescriptions
{
cat $(2) > $(1)
}
BuildOptionalPackageDescriptions $(optionalPackageDescriptions)
: $(HAIKU_IMAGE_OPTIONAL_PACKAGE_DESCRIPTIONS) ;
}
#pragma mark - Alternative GCC Libraries
# We build a zip archive containing the libraries built with the alternative
# GCC and unzip onto our image. Building the archive is done by a sub-jam.
include [ FDirName $(HAIKU_BUILD_RULES_DIR) AlternativeGCCArchive ] ;
if $(HAIKU_ADD_ALTERNATIVE_GCC_LIBS) = 1
&& $(HAIKU_ALTERNATIVE_GCC_OUTPUT_DIR) {
# let another jam build a zip with the system libraries
rule InvokeSubJam target : directory : jamLine
{
DIRECTORY on $(target) = $(directory) ;
COMMAND_LINE on $(target) = $(jamLine) ;
local optionalPackages = $(HAIKU_ADDED_OPTIONAL_PACKAGES:J=/) ;
OPTIONAL_PACKAGES on $(target) = $(optionalPackages:E="") ;
Always $(target) ;
InvokeSubJam1 $(target) ;
}
actions InvokeSubJam1
{
cd $(DIRECTORY)
export HAIKU_IGNORE_USER_BUILD_CONFIG=1
export HAIKU_ADD_OPTIONAL_PACKAGES=$(OPTIONAL_PACKAGES)
export HAIKU_PRIMARY_GCC=$(HAIKU_GCC_VERSION[1])
# NOTE: depending on when InvokeSubJam is called, you may end up with
# 2 * n - 1 jobs in total.
$(JAM:E=jam) -q -j$(JAMJOBS) $(COMMAND_LINE) ;
}
local otherAlternativeSystemLibsZip
= <other-image>alternative_system_libs.zip ;
MakeLocate $(otherAlternativeSystemLibsZip)
: $(HAIKU_ALTERNATIVE_GCC_OUTPUT_DIR) ;
InvokeSubJam $(otherAlternativeSystemLibsZip)
: $(HAIKU_ALTERNATIVE_GCC_OUTPUT_DIR)
: "haiku-alternative-gcc-archive" ;
# install the alternative libs in the right directory
ExtractArchiveToHaikuImage : $(otherAlternativeSystemLibsZip) ;
}
#pragma mark - User/Group Setup
# add the root user and the root and users groups
AddUserToHaikuImage $(HAIKU_ROOT_USER_NAME:E=baron) : 0 : 0 : /boot/home
: /bin/bash : $(HAIKU_ROOT_USER_REAL_NAME:E="Root User") ;
AddGroupToHaikuImage root : 0 : ;
AddGroupToHaikuImage users : 100 : ;
#pragma mark - Host Name
if $(HAIKU_IMAGE_HOST_NAME) {
actions BuildHaikuImageHostnameFile
{
echo "$(HAIKU_IMAGE_HOST_NAME)" > $(1)
}
local file = <haiku-image>hostname ;
Always $(file) ;
MakeLocate $(file) : $(HAIKU_COMMON_PLATFORM_OBJECT_DIR) ;
BuildHaikuImageHostnameFile $(file) ;
AddFilesToHaikuImage common settings network : $(file) ;
}
#pragma mark - Build The Image
# Execute pre-image user config rules.
UserBuildConfigRulePreImage ;
# Set image name and directory defaults and locate the image.
HAIKU_IMAGE_NAME ?= $(HAIKU_DEFAULT_IMAGE_NAME) ;
HAIKU_IMAGE_DIR ?= $(HAIKU_DEFAULT_IMAGE_DIR) ;
HAIKU_IMAGE = $(HAIKU_IMAGE_NAME) ;
HAIKU_IMAGE_SIZE ?= $(HAIKU_DEFAULT_IMAGE_SIZE) ; # 300 MB
HAIKU_IMAGE_LABEL ?= $(HAIKU_DEFAULT_IMAGE_LABEL) ;
MakeLocate $(HAIKU_IMAGE) : $(HAIKU_IMAGE_DIR) ;
# Set the default installation directory.
HAIKU_INSTALL_DIR ?= $(HAIKU_DEFAULT_INSTALL_DIR) ;
# the pseudo target all image contents is attached to
NotFile $(HAIKU_IMAGE_CONTAINER_NAME) ;
# Detect a hybrid GCC2/GCC4 image.
local isHybridBuild ;
if $(HAIKU_ADD_ALTERNATIVE_GCC_LIBS) = 1
&& $(HAIKU_ALTERNATIVE_GCC_OUTPUT_DIR) {
isHybridBuild = 1 ;
}
# prepare the script that initializes the shell variables
HAIKU_IMAGE_INIT_VARIABLES_SCRIPT = <HaikuImage>haiku.image-init-vars ;
local script = $(HAIKU_IMAGE_INIT_VARIABLES_SCRIPT) ;
MakeLocate $(script) : $(HAIKU_OUTPUT_DIR) ;
Always $(script) ;
AddVariableToScript $(script) : sourceDir : $(HAIKU_TOP) ;
AddVariableToScript $(script) : outputDir : $(HAIKU_OUTPUT_DIR) ;
AddVariableToScript $(script) : tmpDir : $(HAIKU_TMP_DIR) ;
AddVariableToScript $(script) : installDir : $(HAIKU_INSTALL_DIR) ;
#AddVariableToScript $(script) : isImage : 1 ;
AddVariableToScript $(script) : imageSize : $(HAIKU_IMAGE_SIZE) ;
AddVariableToScript $(script) : imageLabel : $(HAIKU_IMAGE_LABEL) ;
AddVariableToScript $(script) : addBuildCompatibilityLibDir
: $(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR) ;
AddVariableToScript $(script) : dontClearImage : $(HAIKU_DONT_CLEAR_IMAGE) ;
AddVariableToScript $(script) : updateOnly : [ IsUpdateHaikuImageOnly ] ;
AddTargetVariableToScript $(script) : <build>addattr ;
AddTargetVariableToScript $(script) : <build>bfs_shell : bfsShell ;
AddTargetVariableToScript $(script) : <build>fs_shell_command : fsShellCommand ;
AddTargetVariableToScript $(script) : <build>copyattr ;
AddTargetVariableToScript $(script) : <build>create_image : createImage ;
AddTargetVariableToScript $(script) : <build>makebootable ;
AddTargetVariableToScript $(script) : <build>rc ;
AddTargetVariableToScript $(script) : <build>resattr ;
AddTargetVariableToScript $(script) : <build>unzip ;
AddTargetVariableToScript $(script) : <build>vmdkimage ;
AddVariableToScript $(script) : stripCommand : $(HAIKU_STRIP) ;
if $(HOST_RM_ATTRS_TARGET) {
AddTargetVariableToScript $(script) : $(HOST_RM_ATTRS_TARGET) : rmAttrs ;
} else {
AddVariableToScript $(script) : rmAttrs : rm ;
}
if $(optionalPackageDescriptions) {
AddTargetVariableToScript $(script) : $(optionalPackageDescriptions)
: optionalPackageDescriptions ;
}
# create the other scripts
HAIKU_IMAGE_MAKE_DIRS_SCRIPT = <HaikuImage>haiku.image-make-dirs ;
HAIKU_IMAGE_COPY_FILES_SCRIPT = <HaikuImage>haiku.image-copy-files ;
HAIKU_IMAGE_EXTRACT_FILES_SCRIPT = <HaikuImage>haiku.image-extract-files ;
MakeLocate $(HAIKU_IMAGE_MAKE_DIRS_SCRIPT) $(HAIKU_IMAGE_COPY_FILES_SCRIPT)
$(HAIKU_IMAGE_EXTRACT_FILES_SCRIPT) : $(HAIKU_OUTPUT_DIR) ;
CreateHaikuImageMakeDirectoriesScript $(HAIKU_IMAGE_MAKE_DIRS_SCRIPT) ;
CreateHaikuImageCopyFilesScript $(HAIKU_IMAGE_COPY_FILES_SCRIPT) ;
CreateHaikuImageExtractFilesScript $(HAIKU_IMAGE_EXTRACT_FILES_SCRIPT) ;
# Convenience wrapper rule around BuildHaikuImage.
rule _BuildHaikuImage image : isImage : isVMwareImage
{
# _BuildHaikuImage <image target> : <isImage> : <isVMwareImage> ;
#
# build the image
# HAIKU_IMAGE_EARLY_USER_SCRIPTS, HAIKU_IMAGE_LATE_USER_SCRIPTS can be
# specified by the user.
BuildHaikuImage $(image) :
$(HAIKU_IMAGE_INIT_VARIABLES_SCRIPT)
$(HAIKU_IMAGE_EARLY_USER_SCRIPTS)
$(HAIKU_IMAGE_MAKE_DIRS_SCRIPT)
$(HAIKU_IMAGE_COPY_FILES_SCRIPT)
$(HAIKU_IMAGE_EXTRACT_FILES_SCRIPT)
$(HAIKU_IMAGE_LATE_USER_SCRIPTS)
: $(isImage)
: $(isVMwareImage)
;
# remove the scripts we have generated
RmTemps $(image) :
$(HAIKU_IMAGE_INIT_VARIABLES_SCRIPT)
$(HAIKU_IMAGE_MAKE_DIRS_SCRIPT)
$(HAIKU_IMAGE_COPY_FILES_SCRIPT)
$(HAIKU_IMAGE_EXTRACT_FILES_SCRIPT)
;
}
# build the image
_BuildHaikuImage $(HAIKU_IMAGE) : true ;
NotFile haiku-image ;
Depends haiku-image : $(HAIKU_IMAGE) ;
# install Haiku into a directory
NotFile install-haiku ;
_BuildHaikuImage install-haiku : 0 ;
# build the VMware image
HAIKU_VMWARE_IMAGE_NAME ?= $(HAIKU_DEFAULT_VMWARE_IMAGE_NAME) ;
HAIKU_VMWARE_IMAGE = $(HAIKU_VMWARE_IMAGE_NAME) ;
MakeLocate $(HAIKU_VMWARE_IMAGE) : $(HAIKU_IMAGE_DIR) ;
_BuildHaikuImage $(HAIKU_VMWARE_IMAGE) : true : true ;
NotFile haiku-vmware-image ;
Depends haiku-vmware-image : $(HAIKU_VMWARE_IMAGE) ;
# Execute post-image user config rules.
UserBuildConfigRulePostImage ;
+10
View File
@@ -181,6 +181,16 @@ actions AssembleNasm
fi
}
rule CompileDTS
{
Depends $(<) : $(>) ;
}
actions CompileDTS
{
dtc -O dtb -o $(1) $(2);
}
rule Ld
{
# Ld <name> : <objs> : <linkerscript> : <flags> ;
+7 -6
View File
@@ -30,9 +30,10 @@ HAIKU_BOARD_LOADER_STACK_BASE = 0x02000000 ;
# gcc flags for the specific cpu
#
HAIKU_KERNEL_PIC_CCFLAGS += -mcpu=440fp -mtune=440fp ;
HAIKU_KERNEL_PIC_C++FLAGS += -mcpu=440fp -mtune=440fp ;
HAIKU_KERNEL_CCFLAGS += -mcpu=440fp -mtune=440fp ;
HAIKU_KERNEL_C++FLAGS += -mcpu=440fp -mtune=440fp ;
HAIKU_CCFLAGS_$(HAIKU_PACKAGING_ARCH) += -mcpu=440fp -mtune=440fp ;
HAIKU_C++FLAGS_$(HAIKU_PACKAGING_ARCH) += -mcpu=440fp -mtune=440fp ;
#HAIKU_KERNEL_PIC_CCFLAGS += -mcpu=440fp -mtune=440fp ;
#HAIKU_KERNEL_PIC_C++FLAGS += -mcpu=440fp -mtune=440fp ;
#HAIKU_KERNEL_CCFLAGS += -mcpu=440fp -mtune=440fp ;
#HAIKU_KERNEL_C++FLAGS += -mcpu=440fp -mtune=440fp ;
#HAIKU_CCFLAGS += -mcpu=440fp -mtune=440fp ;
#HAIKU_C++FLAGS += -mcpu=440fp -mtune=440fp ;
+5 -4
View File
@@ -68,10 +68,11 @@ HAIKU_BOARD_SDIMAGE_FILES =
# gcc flags for the specific cpu
#
HAIKU_KERNEL_CCFLAGS += -mcpu=xscale ;
HAIKU_KERNEL_C++FLAGS += -mcpu=xscale ;
HAIKU_CCFLAGS_$(HAIKU_PACKAGING_ARCH) += -mcpu=xscale ;
HAIKU_C++FLAGS_$(HAIKU_PACKAGING_ARCH) += -mcpu=xscale ;
HAIKU_KERNEL_CCFLAGS += -mcpu=xscale -D__XSCALE__ ;
HAIKU_KERNEL_C++FLAGS += -mcpu=xscale -D__XSCALE__ ;
HAIKU_CCFLAGS += -mcpu=xscale -D__XSCALE__ ;
HAIKU_C++FLAGS += -mcpu=xscale -D__XSCALE__ ;
TARGET_ASFLAGS += -mcpu=xscale -D__XSCALE__ ;
# Workaround for ld using 32k for alignment despite forcing it in the config...
# should definitely not be needed!
+1 -1
View File
@@ -26,7 +26,7 @@ for driver in $(SYSTEM_ADD_ONS_DRIVERS_NET) {
# modules
AddFilesToPackage add-ons kernel bus_managers : $(SYSTEM_ADD_ONS_BUS_MANAGERS) ;
AddFilesToPackage add-ons kernel busses agp_gart : <agp_gart>intel@x86 ;
AddFilesToPackage add-ons kernel busses agp_gart : <agp_gart>intel@x86,x86_64 ;
if $(HAIKU_ATA_STACK) = 1 {
AddFilesToPackage add-ons kernel busses ata
+3 -1
View File
@@ -1,4 +1,4 @@
1 french x-vnd.haiku-icon_o_matic 806315965
1 french x-vnd.haiku-icon_o_matic 2058853918
Select All Icon-O-Matic-PathManipulator Sélectionner tout
Add Style Icon-O-Matic-AddStylesCmd Ajouter un style
Color (#%02x%02x%02x) Style name after dropping a color Couleur (#%02x%02x%02x)
@@ -139,6 +139,7 @@ Save image Icon-O-Matic-SavePanel Enregistrer l'image
Add Styles Icon-O-Matic-AddStylesCmd Ajouter des styles
Remove Control Points Icon-O-Matic-RemovePointsCmd Enlever les points de contrôle
Format Icon-O-Matic-SavePanel Format
Add rect Icon-O-Matic-PathsList Ajouter un rectangle
Edit Icon-O-Matic-Menus Éditer
Duplicate Icon-O-Matic-StylesList Dupliquer
too big Icon-O-Matic-StyledTextImport trop grand
@@ -161,6 +162,7 @@ Split Control Point Icon-O-Matic-SplitPointsCmd Diviser le point de contrôle
Open… Icon-O-Matic-Menu-File Ouvrir…
Color (#%02x%02x%02x) Icon-O-Matic-StyledTextImport Couleur (#%02x%02x%02x)
Edit Gradient Icon-O-Matic-SetGradientCmd Éditer le dégadé
Clean Up Path Icon-O-Matic-CleanUpPathCmd Nettoyer le chemin
Rounding Icon-O-Matic-PropertyNames Arrondi
Remove Shapes Icon-O-Matic-RemoveShapesCmd Enlever les formes
Clean up Icon-O-Matic-PathsList Nettoyer
+1 -1
View File
@@ -77,7 +77,7 @@ Bookmark info WebPositive Window Информация о закладке
Size: Font Selection view Размер:
Show tabs if only one page is open Settings Window Всегда показывать панель вкладок, даже если открыта только одна вкладка.
About WebPositive Window О программе
Finish: Download Window Finishing time Завершиться в:
Finish: Download Window Finishing time Завершится в:
Fonts Settings Window Шрифты
OK Download Window OK
Page source error WebPositive Window Ошибка в исходном коде страницы
@@ -1,4 +1,4 @@
1 swedish x-vnd.Haiku-ScreenSaver 3630119516
1 swedish x-vnd.Haiku-ScreenSaver 232492478
Could not load screen saver ScreenSaver Kunde inte läsa in skärmsläckaren
30 seconds ScreenSaver 30 sekunder
Start screensaver ScreenSaver Starta skärmsläckare
@@ -11,7 +11,9 @@ Display Power Management Signaling not available ScreenSaver Stöd för att sä
ScreenSaver System name Skärmsläckare
Test ScreenSaver Testa
General ScreenSaver Allmänt
Fade now when mouse is here ScreenSaver Avta nu när musen är här
Enable screensaver ScreenSaver Aktivera skärmsläckare
Don't fade when mouse is here ScreenSaver Avta inte nu när musen är här
Cancel ScreenSaver Avbryt
Turn off screen ScreenSaver Stäng av skärmen
No options available ScreenSaver Inga alternativ tillgängliga
@@ -0,0 +1,728 @@
File: ASC-NUM.TXT
SCSI ASC/ASCQ Assignments
Numeric Sorted Listing
as of 9/19/13
D - DIRECT ACCESS DEVICE (SBC-3) device column key
.T - SEQUENTIAL ACCESS DEVICE (SSC-3) -------------------
. L - PRINTER DEVICE (SSC) blank = reserved
. P - PROCESSOR DEVICE (SPC-2) not blank = allowed
. .W - WRITE ONCE READ MULTIPLE DEVICE (SBC)
. . R - C/DVD DEVICE (MMC-6)
. . O - OPTICAL MEMORY DEVICE (SBC)
. . .M - MEDIA CHANGER DEVICE (SMC-3)
. . . A - STORAGE ARRAY DEVICE (SCC-2)
. . . E - ENCLOSURE SERVICES DEVICE (SES-2)
. . . .B - SIMPLIFIED DIRECT-ACCESS DEVICE (RBC)
. . . . K - OPTICAL CARD READER/WRITER DEVICE (OCRW)
. . . . V - AUTOMATION/DRIVE INTERFACE (ADC-2)
. . . . .F - OBJECT-BASED STORAGE (OSD-2)
ASC/ASCQ DTLPWROMAEBKVF Description
------- -------------- ----------------------------------------------------
00h/00h DTLPWROMAEBKVF NO ADDITIONAL SENSE INFORMATION
00h/01h T FILEMARK DETECTED
00h/02h T END-OF-PARTITION/MEDIUM DETECTED
00h/03h T SETMARK DETECTED
00h/04h T BEGINNING-OF-PARTITION/MEDIUM DETECTED
00h/05h TL END-OF-DATA DETECTED
00h/06h DTLPWROMAEBKVF I/O PROCESS TERMINATED
00h/07h T PROGRAMMABLE EARLY WARNING DETECTED
00h/11h R AUDIO PLAY OPERATION IN PROGRESS
00h/12h R AUDIO PLAY OPERATION PAUSED
00h/13h R AUDIO PLAY OPERATION SUCCESSFULLY COMPLETED
00h/14h R AUDIO PLAY OPERATION STOPPED DUE TO ERROR
00h/15h R NO CURRENT AUDIO STATUS TO RETURN
00h/16h DTLPWROMAEBKVF OPERATION IN PROGRESS
00h/17h DTL WROMAEBKVF CLEANING REQUESTED
00h/18h T ERASE OPERATION IN PROGRESS
00h/19h T LOCATE OPERATION IN PROGRESS
00h/1Ah T REWIND OPERATION IN PROGRESS
00h/1Bh T SET CAPACITY OPERATION IN PROGRESS
00h/1Ch T VERIFY OPERATION IN PROGRESS
00h/1Dh DT B ATA PASS THROUGH INFORMATION AVAILABLE
00h/1Eh DT R MAEBKV CONFLICTING SA CREATION REQUEST
00h/1Fh DT B LOGICAL UNIT TRANSITIONING TO ANOTHER POWER CONDITION
00h/20h DT P B EXTENDED COPY INFORMATION AVAILABLE
01h/00h D W O BK NO INDEX/SECTOR SIGNAL
02h/00h D WRO BK NO SEEK COMPLETE
03h/00h DTL W O BK PERIPHERAL DEVICE WRITE FAULT
03h/01h T NO WRITE CURRENT
03h/02h T EXCESSIVE WRITE ERRORS
04h/00h DTLPWROMAEBKVF LOGICAL UNIT NOT READY, CAUSE NOT REPORTABLE
04h/01h DTLPWROMAEBKVF LOGICAL UNIT IS IN PROCESS OF BECOMING READY
04h/02h DTLPWROMAEBKVF LOGICAL UNIT NOT READY, INITIALIZING COMMAND REQUIRED
04h/03h DTLPWROMAEBKVF LOGICAL UNIT NOT READY, MANUAL INTERVENTION REQUIRED
04h/04h DTL RO B LOGICAL UNIT NOT READY, FORMAT IN PROGRESS
04h/05h DT W O A BK F LOGICAL UNIT NOT READY, REBUILD IN PROGRESS
04h/06h DT W O A BK LOGICAL UNIT NOT READY, RECALCULATION IN PROGRESS
04h/07h DTLPWROMAEBKVF LOGICAL UNIT NOT READY, OPERATION IN PROGRESS
04h/08h R LOGICAL UNIT NOT READY, LONG WRITE IN PROGRESS
04h/09h DTLPWROMAEBKVF LOGICAL UNIT NOT READY, SELF-TEST IN PROGRESS
04h/0Ah DTLPWROMAEBKVF LOGICAL UNIT NOT ACCESSIBLE, ASYMMETRIC ACCESS STATE TRANSITION
04h/0Bh DTLPWROMAEBKVF LOGICAL UNIT NOT ACCESSIBLE, TARGET PORT IN STANDBY STATE
04h/0Ch DTLPWROMAEBKVF LOGICAL UNIT NOT ACCESSIBLE, TARGET PORT IN UNAVAILABLE STATE
04h/0Dh F LOGICAL UNIT NOT READY, STRUCTURE CHECK REQUIRED
04h/10h DT WROM B LOGICAL UNIT NOT READY, AUXILIARY MEMORY NOT ACCESSIBLE
04h/11h DT WRO AEB VF LOGICAL UNIT NOT READY, NOTIFY (ENABLE SPINUP) REQUIRED
04h/12h M V LOGICAL UNIT NOT READY, OFFLINE
04h/13h DT R MAEBKV LOGICAL UNIT NOT READY, SA CREATION IN PROGRESS
04h/14h D B LOGICAL UNIT NOT READY, SPACE ALLOCATION IN PROGRESS
04h/15h M LOGICAL UNIT NOT READY, ROBOTICS DISABLED
04h/16h M LOGICAL UNIT NOT READY, CONFIGURATION REQUIRED
04h/17h M LOGICAL UNIT NOT READY, CALIBRATION REQUIRED
04h/18h M LOGICAL UNIT NOT READY, A DOOR IS OPEN
04h/19h M LOGICAL UNIT NOT READY, OPERATING IN SEQUENTIAL MODE
04h/1Ah D B LOGICAL UNIT NOT READY, START STOP UNIT COMMAND IN PROGRESS
04h/1Bh D B LOGICAL UNIT NOT READY, SANITIZE IN PROGRESS
04h/1Ch DT MAEB LOGICAL UNIT NOT READY, ADDITIONAL POWER USE NOT YET GRANTED
04h/1Dh D LOGICAL UNIT NOT READY, CONFIGURATION IN PROGRESS
04h/1Eh D LOGICAL UNIT NOT READY, MICROCODE ACTIVATION REQUIRED
05h/00h DTL WROMAEBKVF LOGICAL UNIT DOES NOT RESPOND TO SELECTION
06h/00h D WROM BK NO REFERENCE POSITION FOUND
07h/00h DTL WROM BK MULTIPLE PERIPHERAL DEVICES SELECTED
08h/00h DTL WROMAEBKVF LOGICAL UNIT COMMUNICATION FAILURE
08h/01h DTL WROMAEBKVF LOGICAL UNIT COMMUNICATION TIME-OUT
08h/02h DTL WROMAEBKVF LOGICAL UNIT COMMUNICATION PARITY ERROR
08h/03h DT ROM BK LOGICAL UNIT COMMUNICATION CRC ERROR (ULTRA-DMA/32)
08h/04h DTLPWRO K UNREACHABLE COPY TARGET
09h/00h DT WRO B TRACK FOLLOWING ERROR
09h/01h WRO K TRACKING SERVO FAILURE
09h/02h WRO K FOCUS SERVO FAILURE
09h/03h WRO SPINDLE SERVO FAILURE
09h/04h DT WRO B HEAD SELECT FAULT
0Ah/00h DTLPWROMAEBKVF ERROR LOG OVERFLOW
0Bh/00h DTLPWROMAEBKVF WARNING
0Bh/01h DTLPWROMAEBKVF WARNING - SPECIFIED TEMPERATURE EXCEEDED
0Bh/02h DTLPWROMAEBKVF WARNING - ENCLOSURE DEGRADED
0Bh/03h DTLPWROMAEBKVF WARNING - BACKGROUND SELF-TEST FAILED
0Bh/04h DTLPWRO AEBKVF WARNING - BACKGROUND PRE-SCAN DETECTED MEDIUM ERROR
0Bh/05h DTLPWRO AEBKVF WARNING - BACKGROUND MEDIUM SCAN DETECTED MEDIUM ERROR
0Bh/06h DTLPWROMAEBKVF WARNING - NON-VOLATILE CACHE NOW VOLATILE
0Bh/07h DTLPWROMAEBKVF WARNING - DEGRADED POWER TO NON-VOLATILE CACHE
0Bh/08h DTLPWROMAEBKVF WARNING - POWER LOSS EXPECTED
0Bh/09h D WARNING - DEVICE STATISTICS NOTIFICATION ACTIVE
0Ch/00h T R WRITE ERROR
0Ch/01h K WRITE ERROR - RECOVERED WITH AUTO REALLOCATION
0Ch/02h D W O BK WRITE ERROR - AUTO REALLOCATION FAILED
0Ch/03h D W O BK WRITE ERROR - RECOMMEND REASSIGNMENT
0Ch/04h DT W O B COMPRESSION CHECK MISCOMPARE ERROR
0Ch/05h DT W O B DATA EXPANSION OCCURRED DURING COMPRESSION
0Ch/06h DT W O B BLOCK NOT COMPRESSIBLE
0Ch/07h R WRITE ERROR - RECOVERY NEEDED
0Ch/08h R WRITE ERROR - RECOVERY FAILED
0Ch/09h R WRITE ERROR - LOSS OF STREAMING
0Ch/0Ah R WRITE ERROR - PADDING BLOCKS ADDED
0Ch/0Bh DT WROM B AUXILIARY MEMORY WRITE ERROR
0Ch/0Ch DTLPWRO AEBKVF WRITE ERROR - UNEXPECTED UNSOLICITED DATA
0Ch/0Dh DTLPWRO AEBKVF WRITE ERROR - NOT ENOUGH UNSOLICITED DATA
0Ch/0Eh DT W O BK MULTIPLE WRITE ERRORS
0Ch/0Fh R DEFECTS IN ERROR WINDOW
0Dh/00h DTLPWRO A K ERROR DETECTED BY THIRD PARTY TEMPORARY INITIATOR
0Dh/01h DTLPWRO A K THIRD PARTY DEVICE FAILURE
0Dh/02h DTLPWRO A K COPY TARGET DEVICE NOT REACHABLE
0Dh/03h DTLPWRO A K INCORRECT COPY TARGET DEVICE TYPE
0Dh/04h DTLPWRO A K COPY TARGET DEVICE DATA UNDERRUN
0Dh/05h DTLPWRO A K COPY TARGET DEVICE DATA OVERRUN
0Eh/00h DT PWROMAEBK F INVALID INFORMATION UNIT
0Eh/01h DT PWROMAEBK F INFORMATION UNIT TOO SHORT
0Eh/02h DT PWROMAEBK F INFORMATION UNIT TOO LONG
0Eh/03h DT P R MAEBK F INVALID FIELD IN COMMAND INFORMATION UNIT
0Fh/00h
10h/00h D W O BK ID CRC OR ECC ERROR
10h/01h DT W O LOGICAL BLOCK GUARD CHECK FAILED
10h/02h DT W O LOGICAL BLOCK APPLICATION TAG CHECK FAILED
10h/03h DT W O LOGICAL BLOCK REFERENCE TAG CHECK FAILED
10h/04h T LOGICAL BLOCK PROTECTION ERROR ON RECOVER BUFFERED DATA
10h/05h T LOGICAL BLOCK PROTECTION METHOD ERROR
11h/00h DT WRO BK UNRECOVERED READ ERROR
11h/01h DT WRO BK READ RETRIES EXHAUSTED
11h/02h DT WRO BK ERROR TOO LONG TO CORRECT
11h/03h DT W O BK MULTIPLE READ ERRORS
11h/04h D W O BK UNRECOVERED READ ERROR - AUTO REALLOCATE FAILED
11h/05h WRO B L-EC UNCORRECTABLE ERROR
11h/06h WRO B CIRC UNRECOVERED ERROR
11h/07h W O B DATA RE-SYNCHRONIZATION ERROR
11h/08h T INCOMPLETE BLOCK READ
11h/09h T NO GAP FOUND
11h/0Ah DT O BK MISCORRECTED ERROR
11h/0Bh D W O BK UNRECOVERED READ ERROR - RECOMMEND REASSIGNMENT
11h/0Ch D W O BK UNRECOVERED READ ERROR - RECOMMEND REWRITE THE DATA
11h/0Dh DT WRO B DE-COMPRESSION CRC ERROR
11h/0Eh DT WRO B CANNOT DECOMPRESS USING DECLARED ALGORITHM
11h/0Fh R ERROR READING UPC/EAN NUMBER
11h/10h R ERROR READING ISRC NUMBER
11h/11h R READ ERROR - LOSS OF STREAMING
11h/12h DT WROM B AUXILIARY MEMORY READ ERROR
11h/13h DTLPWRO AEBKVF READ ERROR - FAILED RETRANSMISSION REQUEST
11h/14h D READ ERROR - LBA MARKED BAD BY APPLICATION CLIENT
11h/15h D WRITE AFTER SANITIZE REQUIRED
12h/00h D W O BK ADDRESS MARK NOT FOUND FOR ID FIELD
13h/00h D W O BK ADDRESS MARK NOT FOUND FOR DATA FIELD
14h/00h DTL WRO BK RECORDED ENTITY NOT FOUND
14h/01h DT WRO BK RECORD NOT FOUND
14h/02h T FILEMARK OR SETMARK NOT FOUND
14h/03h T END-OF-DATA NOT FOUND
14h/04h T BLOCK SEQUENCE ERROR
14h/05h DT W O BK RECORD NOT FOUND - RECOMMEND REASSIGNMENT
14h/06h DT W O BK RECORD NOT FOUND - DATA AUTO-REALLOCATED
14h/07h T LOCATE OPERATION FAILURE
15h/00h DTL WROM BK RANDOM POSITIONING ERROR
15h/01h DTL WROM BK MECHANICAL POSITIONING ERROR
15h/02h DT WRO BK POSITIONING ERROR DETECTED BY READ OF MEDIUM
16h/00h D W O BK DATA SYNCHRONIZATION MARK ERROR
16h/01h D W O BK DATA SYNC ERROR - DATA REWRITTEN
16h/02h D W O BK DATA SYNC ERROR - RECOMMEND REWRITE
16h/03h D W O BK DATA SYNC ERROR - DATA AUTO-REALLOCATED
16h/04h D W O BK DATA SYNC ERROR - RECOMMEND REASSIGNMENT
17h/00h DT WRO BK RECOVERED DATA WITH NO ERROR CORRECTION APPLIED
17h/01h DT WRO BK RECOVERED DATA WITH RETRIES
17h/02h DT WRO BK RECOVERED DATA WITH POSITIVE HEAD OFFSET
17h/03h DT WRO BK RECOVERED DATA WITH NEGATIVE HEAD OFFSET
17h/04h WRO B RECOVERED DATA WITH RETRIES AND/OR CIRC APPLIED
17h/05h D WRO BK RECOVERED DATA USING PREVIOUS SECTOR ID
17h/06h D W O BK RECOVERED DATA WITHOUT ECC - DATA AUTO-REALLOCATED
17h/07h D WRO BK RECOVERED DATA WITHOUT ECC - RECOMMEND REASSIGNMENT
17h/08h D WRO BK RECOVERED DATA WITHOUT ECC - RECOMMEND REWRITE
17h/09h D WRO BK RECOVERED DATA WITHOUT ECC - DATA REWRITTEN
18h/00h DT WRO BK RECOVERED DATA WITH ERROR CORRECTION APPLIED
18h/01h D WRO BK RECOVERED DATA WITH ERROR CORR. & RETRIES APPLIED
18h/02h D WRO BK RECOVERED DATA - DATA AUTO-REALLOCATED
18h/03h R RECOVERED DATA WITH CIRC
18h/04h R RECOVERED DATA WITH L-EC
18h/05h D WRO BK RECOVERED DATA - RECOMMEND REASSIGNMENT
18h/06h D WRO BK RECOVERED DATA - RECOMMEND REWRITE
18h/07h D W O BK RECOVERED DATA WITH ECC - DATA REWRITTEN
18h/08h R RECOVERED DATA WITH LINKING
19h/00h D O K DEFECT LIST ERROR
19h/01h D O K DEFECT LIST NOT AVAILABLE
19h/02h D O K DEFECT LIST ERROR IN PRIMARY LIST
19h/03h D O K DEFECT LIST ERROR IN GROWN LIST
1Ah/00h DTLPWROMAEBKVF PARAMETER LIST LENGTH ERROR
1Bh/00h DTLPWROMAEBKVF SYNCHRONOUS DATA TRANSFER ERROR
1Ch/00h D O BK DEFECT LIST NOT FOUND
1Ch/01h D O BK PRIMARY DEFECT LIST NOT FOUND
1Ch/02h D O BK GROWN DEFECT LIST NOT FOUND
1Dh/00h DT WRO BK MISCOMPARE DURING VERIFY OPERATION
1Dh/01h D B MISCOMPARE VERIFY OF UNMAPPED LBA
1Eh/00h D W O BK RECOVERED ID WITH ECC CORRECTION
1Fh/00h D O K PARTIAL DEFECT LIST TRANSFER
20h/00h DTLPWROMAEBKVF INVALID COMMAND OPERATION CODE
20h/01h DT PWROMAEBK ACCESS DENIED - INITIATOR PENDING-ENROLLED
20h/02h DT PWROMAEBK ACCESS DENIED - NO ACCESS RIGHTS
20h/03h DT PWROMAEBK ACCESS DENIED - INVALID MGMT ID KEY
20h/04h T ILLEGAL COMMAND WHILE IN WRITE CAPABLE STATE
20h/05h T Obsolete
20h/06h T ILLEGAL COMMAND WHILE IN EXPLICIT ADDRESS MODE
20h/07h T ILLEGAL COMMAND WHILE IN IMPLICIT ADDRESS MODE
20h/08h DT PWROMAEBK ACCESS DENIED - ENROLLMENT CONFLICT
20h/09h DT PWROMAEBK ACCESS DENIED - INVALID LU IDENTIFIER
20h/0Ah DT PWROMAEBK ACCESS DENIED - INVALID PROXY TOKEN
20h/0Bh DT PWROMAEBK ACCESS DENIED - ACL LUN CONFLICT
20h/0Ch T ILLEGAL COMMAND WHEN NOT IN APPEND-ONLY MODE
21h/00h DT WRO BK LOGICAL BLOCK ADDRESS OUT OF RANGE
21h/01h DT WROM BK INVALID ELEMENT ADDRESS
21h/02h R INVALID ADDRESS FOR WRITE
21h/03h R INVALID WRITE CROSSING LAYER JUMP
22h/00h D ILLEGAL FUNCTION (USE 20 00, 24 00, OR 26 00)
23h/00h DT P B INVALID TOKEN OPERATION, CAUSE NOT REPORTABLE
23h/01h DT P B INVALID TOKEN OPERATION, UNSUPPORTED TOKEN TYPE
23h/02h DT P B INVALID TOKEN OPERATION, REMOTE TOKEN USAGE NOT SUPPORTED
23h/03h DT P B INVALID TOKEN OPERATION, REMOTE ROD TOKEN CREATION NOT SUPPORTED
23h/04h DT P B INVALID TOKEN OPERATION, TOKEN UNKNOWN
23h/05h DT P B INVALID TOKEN OPERATION, TOKEN CORRUPT
23h/06h DT P B INVALID TOKEN OPERATION, TOKEN REVOKED
23h/07h DT P B INVALID TOKEN OPERATION, TOKEN EXPIRED
23h/08h DT P B INVALID TOKEN OPERATION, TOKEN CANCELLED
23h/09h DT P B INVALID TOKEN OPERATION, TOKEN DELETED
23h/0Ah DT P B INVALID TOKEN OPERATION, INVALID TOKEN LENGTH
24h/00h DTLPWROMAEBKVF INVALID FIELD IN CDB
24h/01h DTLPWRO AEBKVF CDB DECRYPTION ERROR
24h/02h T Obsolete
24h/03h T Obsolete
24h/04h F SECURITY AUDIT VALUE FROZEN
24h/05h F SECURITY WORKING KEY FROZEN
24h/06h F NONCE NOT UNIQUE
24h/07h F NONCE TIMESTAMP OUT OF RANGE
24h/08h DT R MAEBKV INVALID XCDB
25h/00h DTLPWROMAEBKVF LOGICAL UNIT NOT SUPPORTED
26h/00h DTLPWROMAEBKVF INVALID FIELD IN PARAMETER LIST
26h/01h DTLPWROMAEBKVF PARAMETER NOT SUPPORTED
26h/02h DTLPWROMAEBKVF PARAMETER VALUE INVALID
26h/03h DTLPWROMAE K THRESHOLD PARAMETERS NOT SUPPORTED
26h/04h DTLPWROMAEBKVF INVALID RELEASE OF PERSISTENT RESERVATION
26h/05h DTLPWRO A BK DATA DECRYPTION ERROR
26h/06h DTLPWRO K TOO MANY TARGET DESCRIPTORS
26h/07h DTLPWRO K UNSUPPORTED TARGET DESCRIPTOR TYPE CODE
26h/08h DTLPWRO K TOO MANY SEGMENT DESCRIPTORS
26h/09h DTLPWRO K UNSUPPORTED SEGMENT DESCRIPTOR TYPE CODE
26h/0Ah DTLPWRO K UNEXPECTED INEXACT SEGMENT
26h/0Bh DTLPWRO K INLINE DATA LENGTH EXCEEDED
26h/0Ch DTLPWRO K INVALID OPERATION FOR COPY SOURCE OR DESTINATION
26h/0Dh DTLPWRO K COPY SEGMENT GRANULARITY VIOLATION
26h/0Eh DT PWROMAEBK INVALID PARAMETER WHILE PORT IS ENABLED
26h/0Fh F INVALID DATA-OUT BUFFER INTEGRITY CHECK VALUE
26h/10h T DATA DECRYPTION KEY FAIL LIMIT REACHED
26h/11h T INCOMPLETE KEY-ASSOCIATED DATA SET
26h/12h T VENDOR SPECIFIC KEY REFERENCE NOT FOUND
27h/00h DT WRO BK WRITE PROTECTED
27h/01h DT WRO BK HARDWARE WRITE PROTECTED
27h/02h DT WRO BK LOGICAL UNIT SOFTWARE WRITE PROTECTED
27h/03h T R ASSOCIATED WRITE PROTECT
27h/04h T R PERSISTENT WRITE PROTECT
27h/05h T R PERMANENT WRITE PROTECT
27h/06h R F CONDITIONAL WRITE PROTECT
27h/07h D B SPACE ALLOCATION FAILED WRITE PROTECT
28h/00h DTLPWROMAEBKVF NOT READY TO READY CHANGE, MEDIUM MAY HAVE CHANGED
28h/01h DT WROM B IMPORT OR EXPORT ELEMENT ACCESSED
28h/02h R FORMAT-LAYER MAY HAVE CHANGED
28h/03h M IMPORT/EXPORT ELEMENT ACCESSED, MEDIUM CHANGED
29h/00h DTLPWROMAEBKVF POWER ON, RESET, OR BUS DEVICE RESET OCCURRED
29h/01h DTLPWROMAEBKVF POWER ON OCCURRED
29h/02h DTLPWROMAEBKVF SCSI BUS RESET OCCURRED
29h/03h DTLPWROMAEBKVF BUS DEVICE RESET FUNCTION OCCURRED
29h/04h DTLPWROMAEBKVF DEVICE INTERNAL RESET
29h/05h DTLPWROMAEBKVF TRANSCEIVER MODE CHANGED TO SINGLE-ENDED
29h/06h DTLPWROMAEBKVF TRANSCEIVER MODE CHANGED TO LVD
29h/07h DTLPWROMAEBKVF I_T NEXUS LOSS OCCURRED
2Ah/00h DTL WROMAEBKVF PARAMETERS CHANGED
2Ah/01h DTL WROMAEBKVF MODE PARAMETERS CHANGED
2Ah/02h DTL WROMAE K LOG PARAMETERS CHANGED
2Ah/03h DTLPWROMAE K RESERVATIONS PREEMPTED
2Ah/04h DTLPWROMAE RESERVATIONS RELEASED
2Ah/05h DTLPWROMAE REGISTRATIONS PREEMPTED
2Ah/06h DTLPWROMAEBKVF ASYMMETRIC ACCESS STATE CHANGED
2Ah/07h DTLPWROMAEBKVF IMPLICIT ASYMMETRIC ACCESS STATE TRANSITION FAILED
2Ah/08h DT WROMAEBKVF PRIORITY CHANGED
2Ah/09h D CAPACITY DATA HAS CHANGED
2Ah/0Ah DT ERROR HISTORY I_T NEXUS CLEARED
2Ah/0Bh DT ERROR HISTORY SNAPSHOT RELEASED
2Ah/0Ch F ERROR RECOVERY ATTRIBUTES HAVE CHANGED
2Ah/0Dh T DATA ENCRYPTION CAPABILITIES CHANGED
2Ah/10h DT M E V TIMESTAMP CHANGED
2Ah/11h T DATA ENCRYPTION PARAMETERS CHANGED BY ANOTHER I_T NEXUS
2Ah/12h T DATA ENCRYPTION PARAMETERS CHANGED BY VENDOR SPECIFIC EVENT
2Ah/13h T DATA ENCRYPTION KEY INSTANCE COUNTER HAS CHANGED
2Ah/14h DT R MAEBKV SA CREATION CAPABILITIES DATA HAS CHANGED
2Ah/15h T M V MEDIUM REMOVAL PREVENTION PREEMPTED
2Bh/00h DTLPWRO K COPY CANNOT EXECUTE SINCE HOST CANNOT DISCONNECT
2Ch/00h DTLPWROMAEBKVF COMMAND SEQUENCE ERROR
2Ch/01h TOO MANY WINDOWS SPECIFIED
2Ch/02h INVALID COMBINATION OF WINDOWS SPECIFIED
2Ch/03h R CURRENT PROGRAM AREA IS NOT EMPTY
2Ch/04h R CURRENT PROGRAM AREA IS EMPTY
2Ch/05h B ILLEGAL POWER CONDITION REQUEST
2Ch/06h R PERSISTENT PREVENT CONFLICT
2Ch/07h DTLPWROMAEBKVF PREVIOUS BUSY STATUS
2Ch/08h DTLPWROMAEBKVF PREVIOUS TASK SET FULL STATUS
2Ch/09h DTLPWROM EBKVF PREVIOUS RESERVATION CONFLICT STATUS
2Ch/0Ah F PARTITION OR COLLECTION CONTAINS USER OBJECTS
2Ch/0Bh T NOT RESERVED
2Ch/0Ch D ORWRITE GENERATION DOES NOT MATCH
2Dh/00h T OVERWRITE ERROR ON UPDATE IN PLACE
2Eh/00h D WROM B INSUFFICIENT TIME FOR OPERATION
2Eh/01h D W OM B COMMAND TIMEOUT BEFORE PROCESSING
2Eh/02h D W OM B COMMAND TIMEOUT DURING PROCESSING
2Eh/03h D W OM B COMMAND TIMEOUT DURING PROCESSING DUE TO ERROR RECOVERY
2Fh/00h DTLPWROMAEBKVF COMMANDS CLEARED BY ANOTHER INITIATOR
2Fh/01h D COMMANDS CLEARED BY POWER LOSS NOTIFICATION
2Fh/02h DTLPWROMAEBKVF COMMANDS CLEARED BY DEVICE SERVER
2Fh/03h DTLPWROMAEBKVF SOME COMMANDS CLEARED BY QUEUING LAYER EVENT
30h/00h DT WROM BK INCOMPATIBLE MEDIUM INSTALLED
30h/01h DT WRO BK CANNOT READ MEDIUM - UNKNOWN FORMAT
30h/02h DT WRO BK CANNOT READ MEDIUM - INCOMPATIBLE FORMAT
30h/03h DT R M K CLEANING CARTRIDGE INSTALLED
30h/04h DT WRO BK CANNOT WRITE MEDIUM - UNKNOWN FORMAT
30h/05h DT WRO BK CANNOT WRITE MEDIUM - INCOMPATIBLE FORMAT
30h/06h DT WRO B CANNOT FORMAT MEDIUM - INCOMPATIBLE MEDIUM
30h/07h DTL WROMAEBKVF CLEANING FAILURE
30h/08h R CANNOT WRITE - APPLICATION CODE MISMATCH
30h/09h R CURRENT SESSION NOT FIXATED FOR APPEND
30h/0Ah DT WRO AEBK CLEANING REQUEST REJECTED
30h/0Ch T WORM MEDIUM - OVERWRITE ATTEMPTED
30h/0Dh T WORM MEDIUM - INTEGRITY CHECK
30h/10h R MEDIUM NOT FORMATTED
30h/11h M INCOMPATIBLE VOLUME TYPE
30h/12h M INCOMPATIBLE VOLUME QUALIFIER
30h/13h M CLEANING VOLUME EXPIRED
31h/00h DT WRO BK MEDIUM FORMAT CORRUPTED
31h/01h D L RO B FORMAT COMMAND FAILED
31h/02h R ZONED FORMATTING FAILED DUE TO SPARE LINKING
31h/03h D B SANITIZE COMMAND FAILED
32h/00h D W O BK NO DEFECT SPARE LOCATION AVAILABLE
32h/01h D W O BK DEFECT LIST UPDATE FAILURE
33h/00h T TAPE LENGTH ERROR
34h/00h DTLPWROMAEBKVF ENCLOSURE FAILURE
35h/00h DTLPWROMAEBKVF ENCLOSURE SERVICES FAILURE
35h/01h DTLPWROMAEBKVF UNSUPPORTED ENCLOSURE FUNCTION
35h/02h DTLPWROMAEBKVF ENCLOSURE SERVICES UNAVAILABLE
35h/03h DTLPWROMAEBKVF ENCLOSURE SERVICES TRANSFER FAILURE
35h/04h DTLPWROMAEBKVF ENCLOSURE SERVICES TRANSFER REFUSED
35h/05h DTL WROMAEBKVF ENCLOSURE SERVICES CHECKSUM ERROR
36h/00h L RIBBON, INK, OR TONER FAILURE
37h/00h DTL WROMAEBKVF ROUNDED PARAMETER
38h/00h B EVENT STATUS NOTIFICATION
38h/02h B ESN - POWER MANAGEMENT CLASS EVENT
38h/04h B ESN - MEDIA CLASS EVENT
38h/06h B ESN - DEVICE BUSY CLASS EVENT
38h/07h D THIN PROVISIONING SOFT THRESHOLD REACHED
39h/00h DTL WROMAE K SAVING PARAMETERS NOT SUPPORTED
3Ah/00h DTL WROM BK MEDIUM NOT PRESENT
3Ah/01h DT WROM BK MEDIUM NOT PRESENT - TRAY CLOSED
3Ah/02h DT WROM BK MEDIUM NOT PRESENT - TRAY OPEN
3Ah/03h DT WROM B MEDIUM NOT PRESENT - LOADABLE
3Ah/04h DT WRO B MEDIUM NOT PRESENT - MEDIUM AUXILIARY MEMORY ACCESSIBLE
3Bh/00h TL SEQUENTIAL POSITIONING ERROR
3Bh/01h T TAPE POSITION ERROR AT BEGINNING-OF-MEDIUM
3Bh/02h T TAPE POSITION ERROR AT END-OF-MEDIUM
3Bh/03h L TAPE OR ELECTRONIC VERTICAL FORMS UNIT NOT READY
3Bh/04h L SLEW FAILURE
3Bh/05h L PAPER JAM
3Bh/06h L FAILED TO SENSE TOP-OF-FORM
3Bh/07h L FAILED TO SENSE BOTTOM-OF-FORM
3Bh/08h T REPOSITION ERROR
3Bh/09h READ PAST END OF MEDIUM
3Bh/0Ah READ PAST BEGINNING OF MEDIUM
3Bh/0Bh POSITION PAST END OF MEDIUM
3Bh/0Ch T POSITION PAST BEGINNING OF MEDIUM
3Bh/0Dh DT WROM BK MEDIUM DESTINATION ELEMENT FULL
3Bh/0Eh DT WROM BK MEDIUM SOURCE ELEMENT EMPTY
3Bh/0Fh R END OF MEDIUM REACHED
3Bh/11h DT WROM BK MEDIUM MAGAZINE NOT ACCESSIBLE
3Bh/12h DT WROM BK MEDIUM MAGAZINE REMOVED
3Bh/13h DT WROM BK MEDIUM MAGAZINE INSERTED
3Bh/14h DT WROM BK MEDIUM MAGAZINE LOCKED
3Bh/15h DT WROM BK MEDIUM MAGAZINE UNLOCKED
3Bh/16h R MECHANICAL POSITIONING OR CHANGER ERROR
3Bh/17h F READ PAST END OF USER OBJECT
3Bh/18h M ELEMENT DISABLED
3Bh/19h M ELEMENT ENABLED
3Bh/1Ah M DATA TRANSFER DEVICE REMOVED
3Bh/1Bh M DATA TRANSFER DEVICE INSERTED
3Bh/1Ch T TOO MANY LOGICAL OBJECTS ON PARTITION TO SUPPORT OPERATION
3Ch/00h
3Dh/00h DTLPWROMAE K INVALID BITS IN IDENTIFY MESSAGE
3Eh/00h DTLPWROMAEBKVF LOGICAL UNIT HAS NOT SELF-CONFIGURED YET
3Eh/01h DTLPWROMAEBKVF LOGICAL UNIT FAILURE
3Eh/02h DTLPWROMAEBKVF TIMEOUT ON LOGICAL UNIT
3Eh/03h DTLPWROMAEBKVF LOGICAL UNIT FAILED SELF-TEST
3Eh/04h DTLPWROMAEBKVF LOGICAL UNIT UNABLE TO UPDATE SELF-TEST LOG
3Fh/00h DTLPWROMAEBKVF TARGET OPERATING CONDITIONS HAVE CHANGED
3Fh/01h DTLPWROMAEBKVF MICROCODE HAS BEEN CHANGED
3Fh/02h DTLPWROM BK CHANGED OPERATING DEFINITION
3Fh/03h DTLPWROMAEBKVF INQUIRY DATA HAS CHANGED
3Fh/04h DT WROMAEBK COMPONENT DEVICE ATTACHED
3Fh/05h DT WROMAEBK DEVICE IDENTIFIER CHANGED
3Fh/06h DT WROMAEB REDUNDANCY GROUP CREATED OR MODIFIED
3Fh/07h DT WROMAEB REDUNDANCY GROUP DELETED
3Fh/08h DT WROMAEB SPARE CREATED OR MODIFIED
3Fh/09h DT WROMAEB SPARE DELETED
3Fh/0Ah DT WROMAEBK VOLUME SET CREATED OR MODIFIED
3Fh/0Bh DT WROMAEBK VOLUME SET DELETED
3Fh/0Ch DT WROMAEBK VOLUME SET DEASSIGNED
3Fh/0Dh DT WROMAEBK VOLUME SET REASSIGNED
3Fh/0Eh DTLPWROMAE REPORTED LUNS DATA HAS CHANGED
3Fh/0Fh DTLPWROMAEBKVF ECHO BUFFER OVERWRITTEN
3Fh/10h DT WROM B MEDIUM LOADABLE
3Fh/11h DT WROM B MEDIUM AUXILIARY MEMORY ACCESSIBLE
3Fh/12h DTLPWR MAEBK F iSCSI IP ADDRESS ADDED
3Fh/13h DTLPWR MAEBK F iSCSI IP ADDRESS REMOVED
3Fh/14h DTLPWR MAEBK F iSCSI IP ADDRESS CHANGED
3Fh/15h DTLPWR MAEBK INSPECT REFERRALS SENSE DESCRIPTORS
40h/00h D RAM FAILURE (SHOULD USE 40 NN)
40h/NNh DTLPWROMAEBKVF DIAGNOSTIC FAILURE ON COMPONENT NN (80h-FFh)
41h/00h D DATA PATH FAILURE (SHOULD USE 40 NN)
42h/00h D POWER-ON OR SELF-TEST FAILURE (SHOULD USE 40 NN)
43h/00h DTLPWROMAEBKVF MESSAGE ERROR
44h/00h DTLPWROMAEBKVF INTERNAL TARGET FAILURE
44h/01h DT P MAEBKVF PERSISTENT RESERVATION INFORMATION LOST
44h/71h DT B ATA DEVICE FAILED SET FEATURES
45h/00h DTLPWROMAEBKVF SELECT OR RESELECT FAILURE
46h/00h DTLPWROM BK UNSUCCESSFUL SOFT RESET
47h/00h DTLPWROMAEBKVF SCSI PARITY ERROR
47h/01h DTLPWROMAEBKVF DATA PHASE CRC ERROR DETECTED
47h/02h DTLPWROMAEBKVF SCSI PARITY ERROR DETECTED DURING ST DATA PHASE
47h/03h DTLPWROMAEBKVF INFORMATION UNIT iuCRC ERROR DETECTED
47h/04h DTLPWROMAEBKVF ASYNCHRONOUS INFORMATION PROTECTION ERROR DETECTED
47h/05h DTLPWROMAEBKVF PROTOCOL SERVICE CRC ERROR
47h/06h DT MAEBKVF PHY TEST FUNCTION IN PROGRESS
47h/7Fh DT PWROMAEBK SOME COMMANDS CLEARED BY ISCSI PROTOCOL EVENT
48h/00h DTLPWROMAEBKVF INITIATOR DETECTED ERROR MESSAGE RECEIVED
49h/00h DTLPWROMAEBKVF INVALID MESSAGE ERROR
4Ah/00h DTLPWROMAEBKVF COMMAND PHASE ERROR
4Bh/00h DTLPWROMAEBKVF DATA PHASE ERROR
4Bh/01h DT PWROMAEBK INVALID TARGET PORT TRANSFER TAG RECEIVED
4Bh/02h DT PWROMAEBK TOO MUCH WRITE DATA
4Bh/03h DT PWROMAEBK ACK/NAK TIMEOUT
4Bh/04h DT PWROMAEBK NAK RECEIVED
4Bh/05h DT PWROMAEBK DATA OFFSET ERROR
4Bh/06h DT PWROMAEBK INITIATOR RESPONSE TIMEOUT
4Bh/07h DT PWROMAEBK F CONNECTION LOST
4Bh/08h DT PWROMAEBK F DATA-IN BUFFER OVERFLOW - DATA BUFFER SIZE
4Bh/09h DT PWROMAEBK F DATA-IN BUFFER OVERFLOW - DATA BUFFER DESCRIPTOR AREA
4Bh/0Ah DT PWROMAEBK F DATA-IN BUFFER ERROR
4Bh/0Bh DT PWROMAEBK F DATA-OUT BUFFER OVERFLOW - DATA BUFFER SIZE
4Bh/0Ch DT PWROMAEBK F DATA-OUT BUFFER OVERFLOW - DATA BUFFER DESCRIPTOR AREA
4Bh/0Dh DT PWROMAEBK F DATA-OUT BUFFER ERROR
4Bh/0Eh DT PWROMAEBK F PCIE FABRIC ERROR
4Bh/0Fh DT PWROMAEBK F PCIE COMPLETION TIMEOUT
4Bh/10h DT PWROMAEBK F PCIE COMPLETER ABORT
4Bh/11h DT PWROMAEBK F PCIE POISONED TLP RECEIVED
4Bh/12h DT PWROMAEBK F PCIE ECRC CHECK FAILED
4Bh/13h DT PWROMAEBK F PCIE UNSUPPORTED REQUEST
4Bh/14h DT PWROMAEBK F PCIE ACS VIOLATION
4Bh/15h DT PWROMAEBK F PCIE TLP PREFIX BLOCKED
4Ch/00h DTLPWROMAEBKVF LOGICAL UNIT FAILED SELF-CONFIGURATION
4Dh/NNh DTLPWROMAEBKVF TAGGED OVERLAPPED COMMANDS (NN = TASK TAG)
4Eh/00h DTLPWROMAEBKVF OVERLAPPED COMMANDS ATTEMPTED
4Fh/00h
50h/00h T WRITE APPEND ERROR
50h/01h T WRITE APPEND POSITION ERROR
50h/02h T POSITION ERROR RELATED TO TIMING
51h/00h T RO ERASE FAILURE
51h/01h R ERASE FAILURE - INCOMPLETE ERASE OPERATION DETECTED
52h/00h T CARTRIDGE FAULT
53h/00h DTL WROM BK MEDIA LOAD OR EJECT FAILED
53h/01h T UNLOAD TAPE FAILURE
53h/02h DT WROM BK MEDIUM REMOVAL PREVENTED
53h/03h M MEDIUM REMOVAL PREVENTED BY DATA TRANSFER ELEMENT
53h/04h T MEDIUM THREAD OR UNTHREAD FAILURE
53h/05h M VOLUME IDENTIFIER INVALID
53h/06h M VOLUME IDENTIFIER MISSING
53h/07h M DUPLICATE VOLUME IDENTIFIER
53h/08h M ELEMENT STATUS UNKNOWN
54h/00h P SCSI TO HOST SYSTEM INTERFACE FAILURE
55h/00h P SYSTEM RESOURCE FAILURE
55h/01h D O BK SYSTEM BUFFER FULL
55h/02h DTLPWROMAE K INSUFFICIENT RESERVATION RESOURCES
55h/03h DTLPWROMAE K INSUFFICIENT RESOURCES
55h/04h DTLPWROMAE K INSUFFICIENT REGISTRATION RESOURCES
55h/05h DT PWROMAEBK INSUFFICIENT ACCESS CONTROL RESOURCES
55h/06h DT WROM B AUXILIARY MEMORY OUT OF SPACE
55h/07h F QUOTA ERROR
55h/08h T MAXIMUM NUMBER OF SUPPLEMENTAL DECRYPTION KEYS EXCEEDED
55h/09h M MEDIUM AUXILIARY MEMORY NOT ACCESSIBLE
55h/0Ah M DATA CURRENTLY UNAVAILABLE
55h/0Bh DTLPWROMAEBKVF INSUFFICIENT POWER FOR OPERATION
55h/0Ch DT P B INSUFFICIENT RESOURCES TO CREATE ROD
55h/0Dh DT P B INSUFFICIENT RESOURCES TO CREATE ROD TOKEN
56h/00h
57h/00h R UNABLE TO RECOVER TABLE-OF-CONTENTS
58h/00h O GENERATION DOES NOT EXIST
59h/00h O UPDATED BLOCK READ
5Ah/00h DTLPWRO BK OPERATOR REQUEST OR STATE CHANGE INPUT
5Ah/01h DT WROM BK OPERATOR MEDIUM REMOVAL REQUEST
5Ah/02h DT WRO A BK OPERATOR SELECTED WRITE PROTECT
5Ah/03h DT WRO A BK OPERATOR SELECTED WRITE PERMIT
5Bh/00h DTLPWROM K LOG EXCEPTION
5Bh/01h DTLPWROM K THRESHOLD CONDITION MET
5Bh/02h DTLPWROM K LOG COUNTER AT MAXIMUM
5Bh/03h DTLPWROM K LOG LIST CODES EXHAUSTED
5Ch/00h D O RPL STATUS CHANGE
5Ch/01h D O SPINDLES SYNCHRONIZED
5Ch/02h D O SPINDLES NOT SYNCHRONIZED
5Dh/00h DTLPWROMAEBKVF FAILURE PREDICTION THRESHOLD EXCEEDED
5Dh/01h R B MEDIA FAILURE PREDICTION THRESHOLD EXCEEDED
5Dh/02h R LOGICAL UNIT FAILURE PREDICTION THRESHOLD EXCEEDED
5Dh/03h R SPARE AREA EXHAUSTION PREDICTION THRESHOLD EXCEEDED
5Dh/10h D B HARDWARE IMPENDING FAILURE GENERAL HARD DRIVE FAILURE
5Dh/11h D B HARDWARE IMPENDING FAILURE DRIVE ERROR RATE TOO HIGH
5Dh/12h D B HARDWARE IMPENDING FAILURE DATA ERROR RATE TOO HIGH
5Dh/13h D B HARDWARE IMPENDING FAILURE SEEK ERROR RATE TOO HIGH
5Dh/14h D B HARDWARE IMPENDING FAILURE TOO MANY BLOCK REASSIGNS
5Dh/15h D B HARDWARE IMPENDING FAILURE ACCESS TIMES TOO HIGH
5Dh/16h D B HARDWARE IMPENDING FAILURE START UNIT TIMES TOO HIGH
5Dh/17h D B HARDWARE IMPENDING FAILURE CHANNEL PARAMETRICS
5Dh/18h D B HARDWARE IMPENDING FAILURE CONTROLLER DETECTED
5Dh/19h D B HARDWARE IMPENDING FAILURE THROUGHPUT PERFORMANCE
5Dh/1Ah D B HARDWARE IMPENDING FAILURE SEEK TIME PERFORMANCE
5Dh/1Bh D B HARDWARE IMPENDING FAILURE SPIN-UP RETRY COUNT
5Dh/1Ch D B HARDWARE IMPENDING FAILURE DRIVE CALIBRATION RETRY COUNT
5Dh/20h D B CONTROLLER IMPENDING FAILURE GENERAL HARD DRIVE FAILURE
5Dh/21h D B CONTROLLER IMPENDING FAILURE DRIVE ERROR RATE TOO HIGH
5Dh/22h D B CONTROLLER IMPENDING FAILURE DATA ERROR RATE TOO HIGH
5Dh/23h D B CONTROLLER IMPENDING FAILURE SEEK ERROR RATE TOO HIGH
5Dh/24h D B CONTROLLER IMPENDING FAILURE TOO MANY BLOCK REASSIGNS
5Dh/25h D B CONTROLLER IMPENDING FAILURE ACCESS TIMES TOO HIGH
5Dh/26h D B CONTROLLER IMPENDING FAILURE START UNIT TIMES TOO HIGH
5Dh/27h D B CONTROLLER IMPENDING FAILURE CHANNEL PARAMETRICS
5Dh/28h D B CONTROLLER IMPENDING FAILURE CONTROLLER DETECTED
5Dh/29h D B CONTROLLER IMPENDING FAILURE THROUGHPUT PERFORMANCE
5Dh/2Ah D B CONTROLLER IMPENDING FAILURE SEEK TIME PERFORMANCE
5Dh/2Bh D B CONTROLLER IMPENDING FAILURE SPIN-UP RETRY COUNT
5Dh/2Ch D B CONTROLLER IMPENDING FAILURE DRIVE CALIBRATION RETRY COUNT
5Dh/30h D B DATA CHANNEL IMPENDING FAILURE GENERAL HARD DRIVE FAILURE
5Dh/31h D B DATA CHANNEL IMPENDING FAILURE DRIVE ERROR RATE TOO HIGH
5Dh/32h D B DATA CHANNEL IMPENDING FAILURE DATA ERROR RATE TOO HIGH
5Dh/33h D B DATA CHANNEL IMPENDING FAILURE SEEK ERROR RATE TOO HIGH
5Dh/34h D B DATA CHANNEL IMPENDING FAILURE TOO MANY BLOCK REASSIGNS
5Dh/35h D B DATA CHANNEL IMPENDING FAILURE ACCESS TIMES TOO HIGH
5Dh/36h D B DATA CHANNEL IMPENDING FAILURE START UNIT TIMES TOO HIGH
5Dh/37h D B DATA CHANNEL IMPENDING FAILURE CHANNEL PARAMETRICS
5Dh/38h D B DATA CHANNEL IMPENDING FAILURE CONTROLLER DETECTED
5Dh/39h D B DATA CHANNEL IMPENDING FAILURE THROUGHPUT PERFORMANCE
5Dh/3Ah D B DATA CHANNEL IMPENDING FAILURE SEEK TIME PERFORMANCE
5Dh/3Bh D B DATA CHANNEL IMPENDING FAILURE SPIN-UP RETRY COUNT
5Dh/3Ch D B DATA CHANNEL IMPENDING FAILURE DRIVE CALIBRATION RETRY COUNT
5Dh/40h D B SERVO IMPENDING FAILURE GENERAL HARD DRIVE FAILURE
5Dh/41h D B SERVO IMPENDING FAILURE DRIVE ERROR RATE TOO HIGH
5Dh/42h D B SERVO IMPENDING FAILURE DATA ERROR RATE TOO HIGH
5Dh/43h D B SERVO IMPENDING FAILURE SEEK ERROR RATE TOO HIGH
5Dh/44h D B SERVO IMPENDING FAILURE TOO MANY BLOCK REASSIGNS
5Dh/45h D B SERVO IMPENDING FAILURE ACCESS TIMES TOO HIGH
5Dh/46h D B SERVO IMPENDING FAILURE START UNIT TIMES TOO HIGH
5Dh/47h D B SERVO IMPENDING FAILURE CHANNEL PARAMETRICS
5Dh/48h D B SERVO IMPENDING FAILURE CONTROLLER DETECTED
5Dh/49h D B SERVO IMPENDING FAILURE THROUGHPUT PERFORMANCE
5Dh/4Ah D B SERVO IMPENDING FAILURE SEEK TIME PERFORMANCE
5Dh/4Bh D B SERVO IMPENDING FAILURE SPIN-UP RETRY COUNT
5Dh/4Ch D B SERVO IMPENDING FAILURE DRIVE CALIBRATION RETRY COUNT
5Dh/50h D B SPINDLE IMPENDING FAILURE GENERAL HARD DRIVE FAILURE
5Dh/51h D B SPINDLE IMPENDING FAILURE DRIVE ERROR RATE TOO HIGH
5Dh/52h D B SPINDLE IMPENDING FAILURE DATA ERROR RATE TOO HIGH
5Dh/53h D B SPINDLE IMPENDING FAILURE SEEK ERROR RATE TOO HIGH
5Dh/54h D B SPINDLE IMPENDING FAILURE TOO MANY BLOCK REASSIGNS
5Dh/55h D B SPINDLE IMPENDING FAILURE ACCESS TIMES TOO HIGH
5Dh/56h D B SPINDLE IMPENDING FAILURE START UNIT TIMES TOO HIGH
5Dh/57h D B SPINDLE IMPENDING FAILURE CHANNEL PARAMETRICS
5Dh/58h D B SPINDLE IMPENDING FAILURE CONTROLLER DETECTED
5Dh/59h D B SPINDLE IMPENDING FAILURE THROUGHPUT PERFORMANCE
5Dh/5Ah D B SPINDLE IMPENDING FAILURE SEEK TIME PERFORMANCE
5Dh/5Bh D B SPINDLE IMPENDING FAILURE SPIN-UP RETRY COUNT
5Dh/5Ch D B SPINDLE IMPENDING FAILURE DRIVE CALIBRATION RETRY COUNT
5Dh/60h D B FIRMWARE IMPENDING FAILURE GENERAL HARD DRIVE FAILURE
5Dh/61h D B FIRMWARE IMPENDING FAILURE DRIVE ERROR RATE TOO HIGH
5Dh/62h D B FIRMWARE IMPENDING FAILURE DATA ERROR RATE TOO HIGH
5Dh/63h D B FIRMWARE IMPENDING FAILURE SEEK ERROR RATE TOO HIGH
5Dh/64h D B FIRMWARE IMPENDING FAILURE TOO MANY BLOCK REASSIGNS
5Dh/65h D B FIRMWARE IMPENDING FAILURE ACCESS TIMES TOO HIGH
5Dh/66h D B FIRMWARE IMPENDING FAILURE START UNIT TIMES TOO HIGH
5Dh/67h D B FIRMWARE IMPENDING FAILURE CHANNEL PARAMETRICS
5Dh/68h D B FIRMWARE IMPENDING FAILURE CONTROLLER DETECTED
5Dh/69h D B FIRMWARE IMPENDING FAILURE THROUGHPUT PERFORMANCE
5Dh/6Ah D B FIRMWARE IMPENDING FAILURE SEEK TIME PERFORMANCE
5Dh/6Bh D B FIRMWARE IMPENDING FAILURE SPIN-UP RETRY COUNT
5Dh/6Ch D B FIRMWARE IMPENDING FAILURE DRIVE CALIBRATION RETRY COUNT
5Dh/FFh DTLPWROMAEBKVF FAILURE PREDICTION THRESHOLD EXCEEDED (FALSE)
5Eh/00h DTLPWRO A K LOW POWER CONDITION ON
5Eh/01h DTLPWRO A K IDLE CONDITION ACTIVATED BY TIMER
5Eh/02h DTLPWRO A K STANDBY CONDITION ACTIVATED BY TIMER
5Eh/03h DTLPWRO A K IDLE CONDITION ACTIVATED BY COMMAND
5Eh/04h DTLPWRO A K STANDBY CONDITION ACTIVATED BY COMMAND
5Eh/05h DTLPWRO A K IDLE_B CONDITION ACTIVATED BY TIMER
5Eh/06h DTLPWRO A K IDLE_B CONDITION ACTIVATED BY COMMAND
5Eh/07h DTLPWRO A K IDLE_C CONDITION ACTIVATED BY TIMER
5Eh/08h DTLPWRO A K IDLE_C CONDITION ACTIVATED BY COMMAND
5Eh/09h DTLPWRO A K STANDBY_Y CONDITION ACTIVATED BY TIMER
5Eh/0Ah DTLPWRO A K STANDBY_Y CONDITION ACTIVATED BY COMMAND
5Eh/41h B POWER STATE CHANGE TO ACTIVE
5Eh/42h B POWER STATE CHANGE TO IDLE
5Eh/43h B POWER STATE CHANGE TO STANDBY
5Eh/45h B POWER STATE CHANGE TO SLEEP
5Eh/47h BK POWER STATE CHANGE TO DEVICE CONTROL
5Fh/00h
60h/00h LAMP FAILURE
61h/00h VIDEO ACQUISITION ERROR
61h/01h UNABLE TO ACQUIRE VIDEO
61h/02h OUT OF FOCUS
62h/00h SCAN HEAD POSITIONING ERROR
63h/00h R END OF USER AREA ENCOUNTERED ON THIS TRACK
63h/01h R PACKET DOES NOT FIT IN AVAILABLE SPACE
64h/00h R ILLEGAL MODE FOR THIS TRACK
64h/01h R INVALID PACKET SIZE
65h/00h DTLPWROMAEBKVF VOLTAGE FAULT
66h/00h AUTOMATIC DOCUMENT FEEDER COVER UP
66h/01h AUTOMATIC DOCUMENT FEEDER LIFT UP
66h/02h DOCUMENT JAM IN AUTOMATIC DOCUMENT FEEDER
66h/03h DOCUMENT MISS FEED AUTOMATIC IN DOCUMENT FEEDER
67h/00h A CONFIGURATION FAILURE
67h/01h A CONFIGURATION OF INCAPABLE LOGICAL UNITS FAILED
67h/02h A ADD LOGICAL UNIT FAILED
67h/03h A MODIFICATION OF LOGICAL UNIT FAILED
67h/04h A EXCHANGE OF LOGICAL UNIT FAILED
67h/05h A REMOVE OF LOGICAL UNIT FAILED
67h/06h A ATTACHMENT OF LOGICAL UNIT FAILED
67h/07h A CREATION OF LOGICAL UNIT FAILED
67h/08h A ASSIGN FAILURE OCCURRED
67h/09h A MULTIPLY ASSIGNED LOGICAL UNIT
67h/0Ah DTLPWROMAEBKVF SET TARGET PORT GROUPS COMMAND FAILED
67h/0Bh DT B ATA DEVICE FEATURE NOT ENABLED
68h/00h A LOGICAL UNIT NOT CONFIGURED
68h/01h D SUBSIDIARY LOGICAL UNIT NOT CONFIGURED
69h/00h A DATA LOSS ON LOGICAL UNIT
69h/01h A MULTIPLE LOGICAL UNIT FAILURES
69h/02h A PARITY/DATA MISMATCH
6Ah/00h A INFORMATIONAL, REFER TO LOG
6Bh/00h A STATE CHANGE HAS OCCURRED
6Bh/01h A REDUNDANCY LEVEL GOT BETTER
6Bh/02h A REDUNDANCY LEVEL GOT WORSE
6Ch/00h A REBUILD FAILURE OCCURRED
6Dh/00h A RECALCULATE FAILURE OCCURRED
6Eh/00h A COMMAND TO LOGICAL UNIT FAILED
6Fh/00h R COPY PROTECTION KEY EXCHANGE FAILURE - AUTHENTICATION FAILURE
6Fh/01h R COPY PROTECTION KEY EXCHANGE FAILURE - KEY NOT PRESENT
6Fh/02h R COPY PROTECTION KEY EXCHANGE FAILURE - KEY NOT ESTABLISHED
6Fh/03h R READ OF SCRAMBLED SECTOR WITHOUT AUTHENTICATION
6Fh/04h R MEDIA REGION CODE IS MISMATCHED TO LOGICAL UNIT REGION
6Fh/05h R DRIVE REGION MUST BE PERMANENT/REGION RESET COUNT ERROR
6Fh/06h R INSUFFICIENT BLOCK COUNT FOR BINDING NONCE RECORDING
6Fh/07h R CONFLICT IN BINDING NONCE RECORDING
70h/NNh T DECOMPRESSION EXCEPTION SHORT ALGORITHM ID OF NN
71h/00h T DECOMPRESSION EXCEPTION LONG ALGORITHM ID
72h/00h R SESSION FIXATION ERROR
72h/01h R SESSION FIXATION ERROR WRITING LEAD-IN
72h/02h R SESSION FIXATION ERROR WRITING LEAD-OUT
72h/03h R SESSION FIXATION ERROR - INCOMPLETE TRACK IN SESSION
72h/04h R EMPTY OR PARTIALLY WRITTEN RESERVED TRACK
72h/05h R NO MORE TRACK RESERVATIONS ALLOWED
72h/06h R RMZ EXTENSION IS NOT ALLOWED
72h/07h R NO MORE TEST ZONE EXTENSIONS ARE ALLOWED
73h/00h R CD CONTROL ERROR
73h/01h R POWER CALIBRATION AREA ALMOST FULL
73h/02h R POWER CALIBRATION AREA IS FULL
73h/03h R POWER CALIBRATION AREA ERROR
73h/04h R PROGRAM MEMORY AREA UPDATE FAILURE
73h/05h R PROGRAM MEMORY AREA IS FULL
73h/06h R RMA/PMA IS ALMOST FULL
73h/10h R CURRENT POWER CALIBRATION AREA ALMOST FULL
73h/11h R CURRENT POWER CALIBRATION AREA IS FULL
73h/17h R RDZ IS FULL
74h/00h T SECURITY ERROR
74h/01h T UNABLE TO DECRYPT DATA
74h/02h T UNENCRYPTED DATA ENCOUNTERED WHILE DECRYPTING
74h/03h T INCORRECT DATA ENCRYPTION KEY
74h/04h T CRYPTOGRAPHIC INTEGRITY VALIDATION FAILED
74h/05h T ERROR DECRYPTING DATA
74h/06h T UNKNOWN SIGNATURE VERIFICATION KEY
74h/07h T ENCRYPTION PARAMETERS NOT USEABLE
74h/08h DT R M E VF DIGITAL SIGNATURE VALIDATION FAILURE
74h/09h T ENCRYPTION MODE MISMATCH ON READ
74h/0Ah T ENCRYPTED BLOCK NOT RAW READ ENABLED
74h/0Bh T INCORRECT ENCRYPTION PARAMETERS
74h/0Ch DT R MAEBKV UNABLE TO DECRYPT PARAMETER LIST
74h/0Dh T ENCRYPTION ALGORITHM DISABLED
74h/10h DT R MAEBKV SA CREATION PARAMETER VALUE INVALID
74h/11h DT R MAEBKV SA CREATION PARAMETER VALUE REJECTED
74h/12h DT R MAEBKV INVALID SA USAGE
74h/21h T DATA ENCRYPTION CONFIGURATION PREVENTED
74h/30h DT R MAEBKV SA CREATION PARAMETER NOT SUPPORTED
74h/40h DT R MAEBKV AUTHENTICATION FAILED
74h/61h V EXTERNAL DATA ENCRYPTION KEY MANAGER ACCESS ERROR
74h/62h V EXTERNAL DATA ENCRYPTION KEY MANAGER ERROR
74h/63h V EXTERNAL DATA ENCRYPTION KEY NOT FOUND
74h/64h V EXTERNAL DATA ENCRYPTION REQUEST NOT AUTHORIZED
74h/6Eh T EXTERNAL DATA ENCRYPTION CONTROL TIMEOUT
74h/6Fh T EXTERNAL DATA ENCRYPTION CONTROL ERROR
74h/71h DT R M E V LOGICAL UNIT ACCESS NOT AUTHORIZED
74h/79h D SECURITY CONFLICT IN TRANSLATED DEVICE
75h/00h
76h/00h
77h/00h
78h/00h
79h/00h
7Ah/00h
7Bh/00h
7Ch/00h
7Dh/00h
7Eh/00h
7Fh/00h
+2
View File
@@ -7,3 +7,5 @@ http://www.netneurotic.net/mac/openfirmware.html
http://www.netbsd.org/ports/macppc/faq.html
http://mail-index.netbsd.org/port-macppc/1999/03/21/0001.html
http://mail-index.netbsd.org/port-macppc/1999/06/25/0006.html
http://ps-2.kev009.com/solinno.co.uk/7043-140/files/docs/ {OF,PReP}
http://www.openfirmware.org/1275/bindings/chrp/
+74
View File
@@ -0,0 +1,74 @@
Notes on Sam460ex Haiku port -*- org -*-
* U-Boot commands
** no-fdt no-initrd
# (seems the U-Boot input buffer is quite limited, can't paste much more on single line in minicom)
setenv ipaddr 192.168.4.100; tftpboot 0x4000000 192.168.4.2:haiku_loader_linux.ub; bootm 0x4000000
** with FDT and tgz as initrd
setenv ipaddr 192.168.4.100
tftpboot 0x4000000 192.168.4.2:haiku_loader_linux.ub
tftpboot 0x8000000 192.168.4.2:haiku_initrd.ub
tftpboot 0xc000000 192.168.4.2:sam460ex.dtb
fdt addr 0xc000000
fdt header
bootm 0x4000000 0x8000000 0xc000000 plop
** for environment:
setenv booth1 'setenv ipaddr 192.168.4.100; tftpboot 0x4000000 192.168.4.2:haiku_loader_linux.ub'
setenv booth2 'tftpboot 0x8000000 192.168.4.2:haiku_initrd.ub'
setenv booth3 'tftpboot 0xc000000 192.168.4.2:sam460ex.dtb'
setenv booth4 'bootm 0x4000000 0x8000000 0xc000000 plop'
setenv booth 'run booth1; run booth2; run booth3; run booth4'
saveenv
run booth
* TODO U-Boot API?
** TODO move Partenope hack to proper official U-Boot API?
** TODO reserved regs?
BoardSetup +=:?
TARGET_BOOT_CCFLAGS += -ffixed-r2 -ffixed-r14 -ffixed-r29 ;
TARGET_BOOT_C++FLAGS += -ffixed-r2 -ffixed-r14 -ffixed-r29 ;
* Other ports
** AROS port
https://www.gitorious.org/aros/aros/commits/sam460
** Linux port
http://kernel.org/doc/ols/2003/ols2003-pages-340-350.pdf
** NetBSD
https://wiki.netbsd.org/users/rkujawa/sam4x0/
* PPC
** Classic
http://class.ee.iastate.edu/cpre211/labs/quickrefPPC.html
http://www.ibm.com/developerworks/library/l-ppc/
http://www.csd.uwo.ca/~mburrel/stuff/ppc-asm.html
** Book-E
http://www.linux-kvm.org/page/PowerPC_Book_E_MMU
http://wiki.freebsd.org/powerpc/BookE
http://en.wikipedia.org/wiki/Memory_management_unit#PowerPC
** 440
http://elinux.org/Book_E_and_PPC_440
*** amcc 4x0
http://c0ff33.net/drop/PPC440_UM2013.pdf
http://www.embeddeddeveloper.com/assets/processors/amcc/datasheets/PP460EX_DS2063.pdf
*** Freescale 440 (different mmu!!)
http://www.freescale.com/files/32bit/doc/white_paper/POWRPCARCPRMRM.pdf
* FDT
http://www.denx.de/wiki/U-Boot/UBootFdtInfo
http://wiki.freebsd.org/FlattenedDeviceTree#Supporting_library_.28libfdt.29
(see also arm docs)
** Sam440 dts
http://lxr.linux.no/linux+v3.4/arch/powerpc/boot/dts/sam440ep.dts
** Sam460ex dts: identical to amcc,Canyonlands !?
http://www.denx.de/wiki/view/DULG/Appendix#Section_13.1.
* OF framebuffer
(not really usable from U-Boot (yet?))
http://www.feedface.com/howto/forth.html
http://mail-index.netbsd.org/port-macppc/2004/12/13/0046.html
http://lists.freebsd.org/pipermail/svn-src-user/2012-January/004806.html
http://www.openfirmware.info/Bindings
* TODO kdebug/disasm/ppc
http://code.google.com/p/ppcd/
+1 -1
View File
@@ -95,7 +95,7 @@ struct sigaction {
#define SS_ONSTACK 0x1
#define SS_DISABLE 0x2
#define MINSIGSTKSZ 4096
#define MINSIGSTKSZ 8192
#define SIGSTKSZ 16384
/* for signals using an alternate stack */
+800
View File
@@ -0,0 +1,800 @@
/*
* Copyright 2013, Haiku, Inc. All Rights Reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* Jérôme Duval
*
* Generated based on http://www.t10.org/lists/asc-num.txt 20130919
* and http://www.t10.org/lists/2sensekey.htm
*/
// "standardized" error code to simplify handling of scsi errors
typedef enum {
err_act_ok, // executed successfully
err_act_retry, // failed, retry 3 times
err_act_fail, // failed, don't retry
err_act_many_retries, // failed, retry multiple times (currently 10 times)
err_act_start, // device requires a "start" command
err_act_invalid_req, // request is invalid
err_act_tur, // device requires a "test unit ready" command
err_act_rescan // device requires a rescan
} err_act;
typedef struct _scsi_sense_key_table
{
uint8 key;
const char * label;
err_act action;
status_t err;
} scsi_sense_key_table;
scsi_sense_key_table sSCSISenseKeyTable[] =
{
{ 0x00, "No sense", err_act_ok, B_OK },
{ 0x01, "Recovered error", err_act_ok, B_OK },
{ 0x02, "Not ready", err_act_ok, B_DEV_NOT_READY },
{ 0x03, "Medium error", err_act_fail, B_DEV_RECALIBRATE_ERROR },
{ 0x04, "Hardware error", err_act_fail, B_DEV_SEEK_ERROR },
{ 0x05, "Illegal request", err_act_fail, B_DEV_INVALID_IOCTL },
{ 0x06, "Unit attention", err_act_fail, B_DEV_NOT_READY },
{ 0x07, "Data protect", err_act_fail, B_READ_ONLY_DEVICE },
{ 0x08, "Blank check", err_act_fail, B_DEV_UNREADABLE },
{ 0x09, "Vendor specific", err_act_fail, B_ERROR },
{ 0x0A, "Copy aborted", err_act_fail, B_ERROR },
{ 0x0B, "Aborted command", err_act_fail, B_CANCELED },
{ 0x0D, "Volume overflow", err_act_fail, B_DEV_SEEK_ERROR },
{ 0x0E, "Miscompare", err_act_ok, B_OK },
{ 0x0F, "Completed", err_act_ok, B_OK },
};
typedef struct _scsi_sense_asc_table
{
unsigned short asc_ascq;
const char * label;
err_act action;
status_t err;
} scsi_sense_asc_table;
scsi_sense_asc_table sSCSISenseAscTable[] =
{
{ 0x0000, "No additional sense information", err_act_ok, B_OK }, // DTLPWROMAEBKVF
{ 0x0001, "Filemark detected", err_act_fail, B_ERROR }, // T
{ 0x0002, "End-of-partition/medium detected", err_act_fail, B_ERROR }, // T
{ 0x0003, "Setmark detected", err_act_fail, B_ERROR }, // T
{ 0x0004, "Beginning-of-partition/medium detected", err_act_fail, B_ERROR }, // T
{ 0x0005, "End-of-data detected", err_act_fail, B_ERROR }, // TL
{ 0x0006, "I/O process terminated", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x0007, "Programmable early warning detected", err_act_fail, B_ERROR }, // T
{ 0x0011, "Audio play operation in progress", err_act_fail, B_DEV_NOT_READY }, // R
{ 0x0012, "Audio play operation paused", err_act_ok, B_OK }, // R
{ 0x0013, "Audio play operation successfully completed", err_act_ok, B_OK }, // R
{ 0x0014, "Audio play operation stopped due to error", err_act_fail, B_ERROR }, // R
{ 0x0015, "No current audio status to return", err_act_ok, B_OK }, // R
{ 0x0016, "Operation in progress", err_act_fail, B_DEV_NOT_READY }, // DTLPWROMAEBKVF
{ 0x0017, "Cleaning requested", err_act_fail, B_ERROR }, // DTL WROMAEBKVF
{ 0x0018, "Erase operation in progress", err_act_fail, B_ERROR }, // T
{ 0x0019, "Locate operation in progress", err_act_fail, B_ERROR }, // T
{ 0x001A, "Rewind operation in progress", err_act_fail, B_ERROR }, // T
{ 0x001B, "Set capacity operation in progress", err_act_fail, B_ERROR }, // T
{ 0x001C, "Verify operation in progress", err_act_fail, B_ERROR }, // T
{ 0x001D, "ATA pass through information available", err_act_fail, B_ERROR }, // DT B
{ 0x001E, "Conflicting SA creation request", err_act_fail, B_ERROR }, // DT R MAEBKV
{ 0x001F, "Logical unit transitioning to another power condition", err_act_fail, B_ERROR }, // DT B
{ 0x0020, "Extended copy information available", err_act_fail, B_ERROR }, // DT P B
{ 0x0100, "No index/sector signal", err_act_fail, B_ERROR }, // D W O BK
{ 0x0200, "No seek complete", err_act_fail, B_ERROR }, // D WRO BK
{ 0x0300, "Peripheral device write fault", err_act_fail, B_ERROR }, // DTL W O BK
{ 0x0301, "No write current", err_act_fail, B_ERROR }, // T
{ 0x0302, "Excessive write errors", err_act_fail, B_ERROR }, // T
{ 0x0400, "Logical unit not ready, cause not reportable", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x0401, "Logical unit is in process of becoming ready", err_act_many_retries, B_DEV_NOT_READY }, // DTLPWROMAEBKVF
{ 0x0402, "Logical unit not ready, initializing command required", err_act_start, B_NO_INIT }, // DTLPWROMAEBKVF
{ 0x0403, "Logical unit not ready, manual intervention required", err_act_fail, B_DEV_NOT_READY }, // DTLPWROMAEBKVF
{ 0x0404, "Logical unit not ready, format in progress", err_act_fail, B_DEV_NOT_READY }, // DTL RO B
{ 0x0405, "Logical unit not ready, rebuild in progress", err_act_fail, B_DEV_NOT_READY }, // DT W O A BK F
{ 0x0406, "Logical unit not ready, recalculation in progress", err_act_fail, B_DEV_NOT_READY }, // DT W O A BK
{ 0x0407, "Logical unit not ready, operation in progress", err_act_fail, B_DEV_NOT_READY }, // DTLPWROMAEBKVF
{ 0x0408, "Logical unit not ready, long write in progress", err_act_fail, B_DEV_NOT_READY }, // R
{ 0x0409, "Logical unit not ready, self-test in progress", err_act_fail, B_DEV_NOT_READY }, // DTLPWROMAEBKVF
{ 0x040A, "Logical unit not accessible, asymmetric access state transition", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x040B, "Logical unit not accessible, target port in standby state", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x040C, "Logical unit not accessible, target port in unavailable state", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x040D, "Logical unit not ready, structure check required", err_act_fail, B_ERROR }, // F
{ 0x0410, "Logical unit not ready, auxiliary memory not accessible", err_act_fail, B_ERROR }, // DT WROM B
{ 0x0411, "Logical unit not ready, notify (enable spinup) required", err_act_tur, B_DEV_NOT_READY }, // DT WRO AEB VF
{ 0x0412, "Logical unit not ready, offline", err_act_fail, B_ERROR }, // M V
{ 0x0413, "Logical unit not ready, SA creation in progress", err_act_fail, B_ERROR }, // DT R MAEBKV
{ 0x0414, "Logical unit not ready, space allocation in progress", err_act_fail, B_ERROR }, // D B
{ 0x0415, "Logical unit not ready, robotics disabled", err_act_fail, B_ERROR }, // M
{ 0x0416, "Logical unit not ready, configuration required", err_act_fail, B_ERROR }, // M
{ 0x0417, "Logical unit not ready, calibration required", err_act_fail, B_ERROR }, // M
{ 0x0418, "Logical unit not ready, a door is open", err_act_fail, B_ERROR }, // M
{ 0x0419, "Logical unit not ready, operating in sequential mode", err_act_fail, B_ERROR }, // M
{ 0x041A, "Logical unit not ready, START STOP unit command in progress", err_act_fail, B_ERROR }, // D B
{ 0x041B, "Logical unit not ready, sanitize in progress", err_act_fail, B_ERROR }, // D B
{ 0x041C, "Logical unit not ready, additional power use not yet granted", err_act_fail, B_ERROR }, // DT MAEB
{ 0x041D, "Logical unit not ready, configuration in progress", err_act_fail, B_ERROR }, // D
{ 0x041E, "Logical unit not ready, microcode activation required", err_act_fail, B_ERROR }, // D
{ 0x0500, "Logical unit does not respond to selection", err_act_fail, B_ERROR }, // DTL WROMAEBKVF
{ 0x0600, "No reference position found", err_act_fail, B_ERROR }, // D WROM BK
{ 0x0700, "Multiple peripheral devices selected", err_act_fail, B_ERROR }, // DTL WROM BK
{ 0x0800, "Logical unit communication failure", err_act_fail, B_ERROR }, // DTL WROMAEBKVF
{ 0x0801, "Logical unit communication time-out", err_act_fail, B_ERROR }, // DTL WROMAEBKVF
{ 0x0802, "Logical unit communication parity error", err_act_fail, B_ERROR }, // DTL WROMAEBKVF
{ 0x0803, "Logical unit communication CRC error (Ultra-DMA/32)", err_act_fail, B_ERROR }, // DT ROM BK
{ 0x0804, "Unreachable copy target", err_act_fail, B_ERROR }, // DTLPWRO K
{ 0x0900, "Track following error", err_act_fail, B_ERROR }, // DT WRO B
{ 0x0901, "Tracking servo failure", err_act_fail, B_ERROR }, // WRO K
{ 0x0902, "Focus servo failure", err_act_fail, B_ERROR }, // WRO K
{ 0x0903, "Spindle servo failure", err_act_fail, B_ERROR }, // WRO
{ 0x0904, "Head select fault", err_act_fail, B_ERROR }, // DT WRO B
{ 0x0A00, "Error log overflow", err_act_fail, ENOSPC }, // DTLPWROMAEBKVF
{ 0x0B00, "Warning", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x0B01, "Warning - specified temperature exceeded", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x0B02, "Warning - enclosure degraded", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x0B03, "Warning - background self-test failed", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x0B04, "Warning - background pre-scan detected medium error", err_act_fail, B_ERROR }, // DTLPWRO AEBKVF
{ 0x0B05, "Warning - background medium scan detected medium error", err_act_fail, B_ERROR }, // DTLPWRO AEBKVF
{ 0x0B06, "Warning - non-volatile cache now volatile", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x0B07, "Warning - degraded power to non-volatile cache", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x0B08, "Warning - power loss expected", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x0B09, "Warning - device statistics notification active", err_act_fail, B_ERROR }, // D
{ 0x0C00, "Write error", err_act_fail, B_ERROR }, // T R
{ 0x0C01, "Write error - recovered with auto reallocation", err_act_ok, B_OK }, // K
{ 0x0C02, "Write error - auto reallocation failed", err_act_fail, B_ERROR }, // D W O BK
{ 0x0C03, "Write error - recommend reassignment", err_act_fail, B_ERROR }, // D W O BK
{ 0x0C04, "Compression check miscompare error", err_act_fail, B_ERROR }, // DT W O B
{ 0x0C05, "Data expansion occurred during compression", err_act_fail, B_ERROR }, // DT W O B
{ 0x0C06, "Block not compressible", err_act_fail, B_ERROR }, // DT W O B
{ 0x0C07, "Write error - recovery needed", err_act_fail, B_ERROR }, // R
{ 0x0C08, "Write error - recovery failed", err_act_fail, B_ERROR }, // R
{ 0x0C09, "Write error - loss of streaming", err_act_fail, B_ERROR }, // R
{ 0x0C0A, "Write error - padding blocks added", err_act_fail, B_ERROR }, // R
{ 0x0C0B, "Auxiliary memory write error", err_act_fail, B_ERROR }, // DT WROM B
{ 0x0C0C, "Write error - unexpected unsolicited data", err_act_fail, B_ERROR }, // DTLPWRO AEBKVF
{ 0x0C0D, "Write error - not enough unsolicited data", err_act_fail, B_ERROR }, // DTLPWRO AEBKVF
{ 0x0C0E, "Multiple write errors", err_act_fail, B_ERROR }, // DT W O BK
{ 0x0C0F, "Defects in error window", err_act_fail, B_ERROR }, // R
{ 0x0D00, "Error detected by third party temporary initiator", err_act_fail, B_ERROR }, // DTLPWRO A K
{ 0x0D01, "Third party device failure", err_act_fail, B_ERROR }, // DTLPWRO A K
{ 0x0D02, "Copy target device not reachable", err_act_fail, B_ERROR }, // DTLPWRO A K
{ 0x0D03, "Incorrect copy target device type", err_act_fail, B_ERROR }, // DTLPWRO A K
{ 0x0D04, "Copy target device data underrun", err_act_fail, B_ERROR }, // DTLPWRO A K
{ 0x0D05, "Copy target device data overrun", err_act_fail, B_ERROR }, // DTLPWRO A K
{ 0x0E00, "Invalid information unit", err_act_fail, B_ERROR }, // DT PWROMAEBK F
{ 0x0E01, "Information unit too short", err_act_fail, B_ERROR }, // DT PWROMAEBK F
{ 0x0E02, "Information unit too long", err_act_fail, B_ERROR }, // DT PWROMAEBK F
{ 0x0E03, "Invalid field in command information unit", err_act_fail, B_ERROR }, // DT P R MAEBK F
{ 0x1000, "ID CRC or ECC error", err_act_fail, B_ERROR }, // D W O BK
{ 0x1001, "Logical block guard check failed", err_act_fail, B_ERROR }, // DT W O
{ 0x1002, "Logical block application tag check failed", err_act_fail, B_ERROR }, // DT W O
{ 0x1003, "Logical block reference tag check failed", err_act_fail, B_ERROR }, // DT W O
{ 0x1004, "Logical block protection error on recover buffered data", err_act_fail, B_ERROR }, // T
{ 0x1005, "Logical block protection method error", err_act_fail, B_ERROR }, // T
{ 0x1100, "Unrecovered read error", err_act_fail, B_IO_ERROR }, // DT WRO BK
{ 0x1101, "Read retries exhausted", err_act_fail, B_IO_ERROR }, // DT WRO BK
{ 0x1102, "Error too long to correct", err_act_fail, B_IO_ERROR }, // DT WRO BK
{ 0x1103, "Multiple read errors", err_act_fail, B_IO_ERROR }, // DT W O BK
{ 0x1104, "Unrecovered read error - auto reallocate failed", err_act_fail, B_IO_ERROR }, // D W O BK
{ 0x1105, "L-EC uncorrectable error", err_act_fail, B_IO_ERROR }, // WRO B
{ 0x1106, "CIRC unrecovered error", err_act_fail, B_IO_ERROR }, // WRO B
{ 0x1107, "Data re-synchronization error", err_act_fail, B_ERROR }, // W O B
{ 0x1108, "Incomplete block read", err_act_fail, B_ERROR }, // T
{ 0x1109, "No gap found", err_act_fail, B_ERROR }, // T
{ 0x110A, "Miscorrected error", err_act_fail, B_ERROR }, // DT O BK
{ 0x110B, "Unrecovered read error - recommend reassignment", err_act_fail, B_IO_ERROR }, // D W O BK
{ 0x110C, "Unrecovered read error - recommend rewrite the data", err_act_fail, B_IO_ERROR }, // D W O BK
{ 0x110D, "De-compression CRC error", err_act_fail, B_ERROR }, // DT WRO B
{ 0x110E, "Cannot decompress using declared algorithm", err_act_fail, B_ERROR }, // DT WRO B
{ 0x110F, "Error readingUPC/EAN number", err_act_fail, B_ERROR }, // R
{ 0x1110, "Error reading ISRC number", err_act_fail, B_ERROR }, // R
{ 0x1111, "Read error - loss of streaming", err_act_fail, B_ERROR }, // R
{ 0x1112, "Auxiliary memory read error", err_act_fail, B_ERROR }, // DT WROM B
{ 0x1113, "Read error - failed retransmission request", err_act_fail, B_ERROR }, // DTLPWRO AEBKVF
{ 0x1114, "Read error - LBA marked bad by application client", err_act_fail, B_ERROR }, // D
{ 0x1115, "Write after sanitize required", err_act_fail, B_ERROR }, // D
{ 0x1200, "Address mark not found for ID field", err_act_fail, B_ERROR }, // D W O BK
{ 0x1300, "Address mark not found for data field", err_act_fail, B_ERROR }, // D W O BK
{ 0x1400, "Recorded entity not found", err_act_fail, B_ERROR }, // DTL WRO BK
{ 0x1401, "Record not found", err_act_fail, B_ERROR }, // DT WRO BK
{ 0x1402, "Filemark or setmark not found", err_act_fail, B_ERROR }, // T
{ 0x1403, "End-of-data not found", err_act_fail, B_ERROR }, // T
{ 0x1404, "Block sequence error", err_act_fail, B_ERROR }, // T
{ 0x1405, "Record not found - recommend reassignment", err_act_fail, B_ERROR }, // DT W O BK
{ 0x1406, "Record not found - data auto-reallocated", err_act_fail, B_ERROR }, // DT W O BK
{ 0x1407, "Locate operation failure", err_act_fail, B_ERROR }, // T
{ 0x1500, "Random positioning error", err_act_fail, B_ERROR }, // DTL WROM BK
{ 0x1501, "Mechanical positioning error", err_act_fail, B_ERROR }, // DTL WROM BK
{ 0x1502, "Positioning error detected by read of medium", err_act_fail, B_ERROR }, // DT WRO BK
{ 0x1600, "Data synchronization mark error", err_act_fail, B_ERROR }, // D W O BK
{ 0x1601, "Data sync error - data rewritten", err_act_fail, B_ERROR }, // D W O BK
{ 0x1602, "Data sync error - recommend rewrite", err_act_fail, B_ERROR }, // D W O BK
{ 0x1603, "Data sync error - data auto-reallocated", err_act_ok, B_OK }, // D W O BK
{ 0x1604, "Data sync error - recommend reassignment", err_act_fail, B_ERROR }, // D W O BK
{ 0x1700, "Recovered data with no error correction applied", err_act_ok, B_OK }, // DT WRO BK
{ 0x1701, "Recovered data with retries", err_act_ok, B_OK }, // DT WRO BK
{ 0x1702, "Recovered data with positive head offset", err_act_ok, B_OK }, // DT WRO BK
{ 0x1703, "Recovered data with negative head offset", err_act_ok, B_OK }, // DT WRO BK
{ 0x1704, "Recovered data with retries and/or CIRC applied", err_act_ok, B_OK }, // WRO B
{ 0x1705, "Recovered data using previous sector ID", err_act_ok, B_OK }, // D WRO BK
{ 0x1706, "Recovered data without ECC - data auto-reallocated", err_act_ok, B_OK }, // D W O BK
{ 0x1707, "Recovered data without ECC - recommend reassignment", err_act_ok, B_OK }, // D WRO BK
{ 0x1708, "Recovered data without ECC - recommend rewrite", err_act_ok, B_OK }, // D WRO BK
{ 0x1709, "Recovered data without ECC - data rewritten", err_act_ok, B_OK }, // D WRO BK
{ 0x1800, "Recovered data with error correction applied", err_act_ok, B_OK }, // DT WRO BK
{ 0x1801, "Recovered data with error corr. & retries applied", err_act_ok, B_OK }, // D WRO BK
{ 0x1802, "Recovered data - data auto-reallocated", err_act_ok, B_OK }, // D WRO BK
{ 0x1803, "Recovered data with CIRC", err_act_ok, B_OK }, // R
{ 0x1804, "Recovered data with l-EC", err_act_ok, B_OK }, // R
{ 0x1805, "Recovered data - recommend reassignment", err_act_ok, B_OK }, // D WRO BK
{ 0x1806, "Recovered data - recommend rewrite", err_act_ok, B_OK }, // D WRO BK
{ 0x1807, "Recovered data with ECC - data rewritten", err_act_ok, B_OK }, // D W O BK
{ 0x1808, "Recovered data with linking", err_act_fail, B_ERROR }, // R
{ 0x1900, "Defect list error", err_act_fail, B_ERROR }, // D O K
{ 0x1901, "Defect list not available", err_act_fail, B_ERROR }, // D O K
{ 0x1902, "Defect list error in primary list", err_act_fail, B_ERROR }, // D O K
{ 0x1903, "Defect list error in grown list", err_act_fail, B_ERROR }, // D O K
{ 0x1A00, "Parameter list length error", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x1B00, "Synchronous data transfer error", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x1C00, "Defect list not found", err_act_fail, B_ERROR }, // D O BK
{ 0x1C01, "Primary defect list not found", err_act_fail, B_ERROR }, // D O BK
{ 0x1C02, "Grown defect list not found", err_act_fail, B_ERROR }, // D O BK
{ 0x1D00, "Miscompare during verify operation", err_act_fail, B_ERROR }, // DT WRO BK
{ 0x1D01, "Miscompare verify of unmapped LBA", err_act_fail, B_ERROR }, // D B
{ 0x1E00, "Recovered ID with ECC correction", err_act_ok, B_OK }, // D W O BK
{ 0x1F00, "Partial defect list transfer", err_act_fail, B_ERROR }, // D O K
{ 0x2000, "Invalid command operation code", err_act_fail, B_DEV_INVALID_IOCTL }, // DTLPWROMAEBKVF
{ 0x2001, "Access denied - initiator pending-enrolled", err_act_fail, B_ERROR }, // DT PWROMAEBK
{ 0x2002, "Access denied - no access rights", err_act_fail, B_ERROR }, // DT PWROMAEBK
{ 0x2003, "Access denied - invalid mgmt ID key", err_act_fail, B_ERROR }, // DT PWROMAEBK
{ 0x2004, "Illegal command while in write capable state", err_act_fail, B_ERROR }, // T
{ 0x2005, "Obsolete", err_act_fail, B_ERROR }, // T
{ 0x2006, "Illegal command while in explicit address mode", err_act_fail, B_ERROR }, // T
{ 0x2007, "Illegal command while in implicit address mode", err_act_fail, B_ERROR }, // T
{ 0x2008, "Access denied - enrollment conflict", err_act_fail, B_ERROR }, // DT PWROMAEBK
{ 0x2009, "Access denied - invalid LU identifier", err_act_fail, B_ERROR }, // DT PWROMAEBK
{ 0x200A, "Access denied - invalid proxy token", err_act_fail, B_ERROR }, // DT PWROMAEBK
{ 0x200B, "Access denied - ACL LUN conflict", err_act_fail, B_ERROR }, // DT PWROMAEBK
{ 0x200C, "Illegal command when not in append-only mode", err_act_fail, B_DEV_INVALID_IOCTL }, // T
{ 0x2100, "Logical block address out of range", err_act_fail, B_BAD_VALUE }, // DT WRO BK
{ 0x2101, "Invalid element address", err_act_fail, B_BAD_VALUE }, // DT WROM BK
{ 0x2102, "Invalid address for write", err_act_fail, B_ERROR }, // R
{ 0x2103, "Invalid write crossing layer jump", err_act_fail, B_ERROR }, // R
{ 0x2200, "Illegal function (use 20 00, 24 00, or 26 00)", err_act_fail, B_DEV_INVALID_IOCTL }, // D
{ 0x2300, "Invalid token operation, cause not reportable", err_act_fail, B_ERROR }, // DT P B
{ 0x2301, "Invalid token operation, unsupported token type", err_act_fail, B_ERROR }, // DT P B
{ 0x2302, "Invalid token operation, remote token usage not supported", err_act_fail, B_ERROR }, // DT P B
{ 0x2303, "Invalid token operation, remote ROD token creation not supported", err_act_fail, B_ERROR }, // DT P B
{ 0x2304, "Invalid token operation, token unknown", err_act_fail, B_ERROR }, // DT P B
{ 0x2305, "Invalid token operation, token corrupt", err_act_fail, B_ERROR }, // DT P B
{ 0x2306, "Invalid token operation, token revoked", err_act_fail, B_ERROR }, // DT P B
{ 0x2307, "Invalid token operation, token expired", err_act_fail, B_ERROR }, // DT P B
{ 0x2308, "Invalid token operation, token cancelled", err_act_fail, B_ERROR }, // DT P B
{ 0x2309, "Invalid token operation, token deleted", err_act_fail, B_ERROR }, // DT P B
{ 0x230A, "Invalid token operation, invalid token length", err_act_fail, B_ERROR }, // DT P B
{ 0x2400, "Invalid field in CDB", err_act_fail, B_BAD_VALUE }, // DTLPWROMAEBKVF
{ 0x2401, "CDB decryption error", err_act_fail, B_ERROR }, // DTLPWRO AEBKVF
{ 0x2402, "Obsolete", err_act_fail, B_ERROR }, // T
{ 0x2403, "Obsolete", err_act_fail, B_ERROR }, // T
{ 0x2404, "Security audit value frozen", err_act_fail, B_ERROR }, // F
{ 0x2405, "Security working key frozen", err_act_fail, B_ERROR }, // F
{ 0x2406, "NONCE not unique", err_act_fail, B_ERROR }, // F
{ 0x2407, "NONCE timestamp out of range", err_act_fail, B_ERROR }, // F
{ 0x2408, "Invalid XCDB", err_act_fail, B_ERROR }, // DT R MAEBKV
{ 0x2500, "Logical unit not supported", err_act_fail, ENXIO }, // DTLPWROMAEBKVF
{ 0x2600, "Invalid field in parameter list", err_act_fail, B_BAD_VALUE }, // DTLPWROMAEBKVF
{ 0x2601, "Parameter not supported", err_act_fail, B_BAD_VALUE }, // DTLPWROMAEBKVF
{ 0x2602, "Parameter value invalid", err_act_fail, B_BAD_VALUE }, // DTLPWROMAEBKVF
{ 0x2603, "Threshold parameters not supported", err_act_fail, B_BAD_VALUE }, // DTLPWROMAE K
{ 0x2604, "Invalid release of persistent reservation", err_act_fail, B_BAD_VALUE }, // DTLPWROMAEBKVF
{ 0x2605, "Data decryption error", err_act_fail, B_ERROR }, // DTLPWRO A BK
{ 0x2606, "Too many target descriptors", err_act_fail, B_ERROR }, // DTLPWRO K
{ 0x2607, "Unsupported target descriptor type code", err_act_fail, B_ERROR }, // DTLPWRO K
{ 0x2608, "Too many segment descriptors", err_act_fail, B_ERROR }, // DTLPWRO K
{ 0x2609, "Unsupported segment descriptor type code", err_act_fail, B_ERROR }, // DTLPWRO K
{ 0x260A, "Unexpected inexact segment", err_act_fail, B_ERROR }, // DTLPWRO K
{ 0x260B, "Inline data length exceeded", err_act_fail, B_ERROR }, // DTLPWRO K
{ 0x260C, "Invalid operation for copy source or destination", err_act_fail, B_ERROR }, // DTLPWRO K
{ 0x260D, "Copy segment granularity violation", err_act_fail, B_ERROR }, // DTLPWRO K
{ 0x260E, "Invalid parameter while port is enabled", err_act_fail, B_ERROR }, // DT PWROMAEBK
{ 0x260F, "Invalid data-out buffer integrity check value", err_act_fail, B_ERROR }, // F
{ 0x2610, "Data decryption key fail limit reached", err_act_fail, B_ERROR }, // T
{ 0x2611, "Incomplete key-associated data set", err_act_fail, B_ERROR }, // T
{ 0x2612, "Vendor specific key reference not found", err_act_fail, B_ERROR }, // T
{ 0x2700, "Write protected", err_act_fail, B_READ_ONLY_DEVICE }, // DT WRO BK
{ 0x2701, "Hardware write protected", err_act_fail, B_READ_ONLY_DEVICE }, // DT WRO BK
{ 0x2702, "Logical unit software write protected", err_act_fail, B_READ_ONLY_DEVICE }, // DT WRO BK
{ 0x2703, "Associated write protect", err_act_fail, B_READ_ONLY_DEVICE }, // T R
{ 0x2704, "Persistent write protect", err_act_fail, B_READ_ONLY_DEVICE }, // T R
{ 0x2705, "Permanent write protect", err_act_fail, B_READ_ONLY_DEVICE }, // T R
{ 0x2706, "Conditional write protect", err_act_fail, B_READ_ONLY_DEVICE }, // R F
{ 0x2707, "Space allocation failed write protect", err_act_fail, B_READ_ONLY_DEVICE }, // D B
{ 0x2800, "Not ready to ready change, medium may have changed", err_act_fail, B_DEV_MEDIA_CHANGED }, // DTLPWROMAEBKVF
{ 0x2801, "Import or export element accessed", err_act_fail, ENXIO }, // DT WROM B
{ 0x2802, "Format-layer may have changed", err_act_fail, B_DEV_MEDIA_CHANGED }, // R
{ 0x2803, "Import/export element accessed, medium changed", err_act_fail, B_ERROR }, // M
{ 0x2900, "Power on, reset, or bus device reset occurred", err_act_retry, B_DEV_NOT_READY }, // DTLPWROMAEBKVF
{ 0x2901, "Power on occurred", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x2902, "SCSI bus reset occurred", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x2903, "Bus device reset function occurred", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x2904, "Device internal reset", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x2905, "Transceiver mode changed to single-ended", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x2906, "Transceiver mode changed to LVD", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x2907, "I_T nexus loss occurred", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x2A00, "Parameters changed", err_act_fail, B_ERROR }, // DTL WROMAEBKVF
{ 0x2A01, "Mode parameters changed", err_act_fail, B_ERROR }, // DTL WROMAEBKVF
{ 0x2A02, "Log parameters changed", err_act_fail, B_ERROR }, // DTL WROMAE K
{ 0x2A03, "Reservations preempted", err_act_fail, B_ERROR }, // DTLPWROMAE K
{ 0x2A04, "Reservations released", err_act_fail, B_ERROR }, // DTLPWROMAE
{ 0x2A05, "Registrations preempted", err_act_fail, B_ERROR }, // DTLPWROMAE
{ 0x2A06, "Asymmetric access state changed", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x2A07, "Implicit asymmetric access state transition failed", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x2A08, "Priority changed", err_act_fail, B_ERROR }, // DT WROMAEBKVF
{ 0x2A09, "Capacity data has changed", err_act_fail, B_ERROR }, // D
{ 0x2A0A, "Error history I_T nexus cleared", err_act_fail, B_ERROR }, // DT
{ 0x2A0B, "Error history snapshot released", err_act_fail, B_ERROR }, // DT
{ 0x2A0C, "Error recovery attributes have changed", err_act_fail, B_ERROR }, // F
{ 0x2A0D, "Data encryption capabilities changed", err_act_fail, B_ERROR }, // T
{ 0x2A10, "Timestamp changed", err_act_fail, B_ERROR }, // DT M E V
{ 0x2A11, "Data encryption parameters changed by another I_T nexus", err_act_fail, B_ERROR }, // T
{ 0x2A12, "Data encryption parameters changed by vendor specific event", err_act_fail, B_ERROR }, // T
{ 0x2A13, "Data encryption key instance counter has changed", err_act_fail, B_ERROR }, // T
{ 0x2A14, "SA creation capabilities data has changed", err_act_fail, B_ERROR }, // DT R MAEBKV
{ 0x2A15, "Medium removal prevention preempted", err_act_fail, B_ERROR }, // T M V
{ 0x2B00, "Copy cannot execute since host cannot disconnect", err_act_fail, B_ERROR }, // DTLPWRO K
{ 0x2C00, "Command sequence error", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x2C01, "Too many windows specified", err_act_fail, B_ERROR }, //
{ 0x2C02, "Invalid combination of windows specified", err_act_fail, B_ERROR }, //
{ 0x2C03, "Current program area is not empty", err_act_fail, B_ERROR }, // R
{ 0x2C04, "Current program area is empty", err_act_fail, B_ERROR }, // R
{ 0x2C05, "Illegal power condition request", err_act_fail, B_ERROR }, // B
{ 0x2C06, "Persistent prevent conflict", err_act_fail, B_ERROR }, // R
{ 0x2C07, "Previous busy status", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x2C08, "Previous task set full status", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x2C09, "Previous reservation conflict status", err_act_fail, B_ERROR }, // DTLPWROM EBKVF
{ 0x2C0A, "Partition or collection contains user objects", err_act_fail, B_ERROR }, // F
{ 0x2C0B, "Not reserved", err_act_fail, B_ERROR }, // T
{ 0x2C0C, "ORWRITE generation does not match", err_act_fail, B_ERROR }, // D
{ 0x2D00, "Overwrite error on update in place", err_act_fail, B_ERROR }, // T
{ 0x2E00, "Insufficient time for operation", err_act_fail, B_ERROR }, // D WROM B
{ 0x2E01, "Command timeout before processing", err_act_fail, B_ERROR }, // D W OM B
{ 0x2E02, "Command timeout during processing", err_act_fail, B_ERROR }, // D W OM B
{ 0x2E03, "Command timeout during processing due to error recovery", err_act_fail, B_ERROR }, // D W OM B
{ 0x2F00, "Commands cleared by another initiator", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x2F01, "Commands cleared by power loss notification", err_act_fail, B_ERROR }, // D
{ 0x2F02, "Commands cleared by device server", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x2F03, "Some commands cleared by queuing layer event", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x3000, "Incompatible medium installed", err_act_fail, B_ERROR }, // DT WROM BK
{ 0x3001, "Cannot read medium - unknown format", err_act_fail, B_ERROR }, // DT WRO BK
{ 0x3002, "Cannot read medium - incompatible format", err_act_fail, B_ERROR }, // DT WRO BK
{ 0x3003, "Cleaning cartridge installed", err_act_fail, B_ERROR }, // DT R M K
{ 0x3004, "Cannot write medium - unknown format", err_act_fail, B_ERROR }, // DT WRO BK
{ 0x3005, "Cannot write medium - incompatible format", err_act_fail, B_ERROR }, // DT WRO BK
{ 0x3006, "Cannot format medium - incompatible medium", err_act_fail, B_ERROR }, // DT WRO B
{ 0x3007, "Cleaning failure", err_act_fail, B_ERROR }, // DTL WROMAEBKVF
{ 0x3008, "Cannot write - application code mismatch", err_act_fail, B_ERROR }, // R
{ 0x3009, "Current session not fixated for append", err_act_fail, B_ERROR }, // R
{ 0x300A, "Cleaning request rejected", err_act_fail, B_ERROR }, // DT WRO AEBK
{ 0x300C, "WORM medium - overwrite attempted", err_act_fail, B_ERROR }, // T
{ 0x300D, "WORM medium - integrity check", err_act_fail, B_ERROR }, // T
{ 0x3010, "Medium not formatted", err_act_fail, B_ERROR }, // R
{ 0x3011, "Incompatible volume type", err_act_fail, B_ERROR }, // M
{ 0x3012, "Incompatible volume qualifier", err_act_fail, B_ERROR }, // M
{ 0x3013, "Cleaning volume expired", err_act_fail, B_ERROR }, // M
{ 0x3100, "Medium format corrupted", err_act_fail, B_ERROR }, // DT WRO BK
{ 0x3101, "Format command failed", err_act_fail, B_ERROR }, // D L RO B
{ 0x3102, "Zoned formatting failed due to spare linking", err_act_fail, B_ERROR }, // R
{ 0x3103, "SANITIZE command failed", err_act_fail, B_ERROR }, // D B
{ 0x3200, "No defect spare location available", err_act_fail, B_ERROR }, // D W O BK
{ 0x3201, "Defect list update failure", err_act_fail, B_ERROR }, // D W O BK
{ 0x3300, "Tape length error", err_act_fail, B_ERROR }, // T
{ 0x3400, "Enclosure failure", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x3500, "Enclosure services failure", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x3501, "Unsupported enclosure function", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x3502, "Enclosure services unavailable", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x3503, "Enclosure services transfer failure", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x3504, "Enclosure services transfer refused", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x3505, "Enclosure services checksum error", err_act_fail, B_ERROR }, // DTL WROMAEBKVF
{ 0x3600, "Ribbon, ink, or toner failure", err_act_fail, B_ERROR }, // L
{ 0x3700, "Rounded parameter", err_act_fail, B_ERROR }, // DTL WROMAEBKVF
{ 0x3800, "Event status notification", err_act_fail, B_ERROR }, // B
{ 0x3802, "ESN - power management class event", err_act_fail, B_ERROR }, // B
{ 0x3804, "ESN - media class event", err_act_fail, B_ERROR }, // B
{ 0x3806, "ESN - device busy class event", err_act_fail, B_ERROR }, // B
{ 0x3807, "Thin provisioning soft threshold reached", err_act_fail, B_ERROR }, // D
{ 0x3900, "Saving parameters not supported", err_act_fail, B_ERROR }, // DTL WROMAE K
{ 0x3A00, "Medium not present", err_act_fail, B_DEV_NO_MEDIA }, // DTL WROM BK
{ 0x3A01, "Medium not present - tray closed", err_act_fail, B_DEV_NO_MEDIA }, // DT WROM BK
{ 0x3A02, "Medium not present - tray open", err_act_fail, B_DEV_NO_MEDIA }, // DT WROM BK
{ 0x3A03, "Medium not present - loadable", err_act_fail, B_DEV_NO_MEDIA }, // DT WROM B
{ 0x3A04, "Medium not present - medium auxiliary memory accessible", err_act_fail, B_DEV_NO_MEDIA }, // DT WRO B
{ 0x3B00, "Sequential positioning error", err_act_fail, B_ERROR }, // TL
{ 0x3B01, "Tape position error at beginning-of-medium", err_act_fail, B_ERROR }, // T
{ 0x3B02, "Tape position error at end-of-medium", err_act_fail, B_ERROR }, // T
{ 0x3B03, "Tape or electronic vertical forms unit not ready", err_act_fail, B_ERROR }, // L
{ 0x3B04, "Slew failure", err_act_fail, B_ERROR }, // L
{ 0x3B05, "Paper jam", err_act_fail, B_ERROR }, // L
{ 0x3B06, "Failed to sense top-of-form", err_act_fail, B_ERROR }, // L
{ 0x3B07, "Failed to sense bottom-of-form", err_act_fail, B_ERROR }, // L
{ 0x3B08, "Reposition error", err_act_fail, B_ERROR }, // T
{ 0x3B09, "Read past end of medium", err_act_fail, B_ERROR }, //
{ 0x3B0A, "Read past beginning of medium", err_act_fail, B_ERROR }, //
{ 0x3B0B, "Position past end of medium", err_act_fail, B_ERROR }, //
{ 0x3B0C, "Position past beginning of medium", err_act_fail, B_ERROR }, // T
{ 0x3B0D, "Medium destination element full", err_act_fail, B_DEVICE_FULL }, // DT WROM BK
{ 0x3B0E, "Medium source element empty", err_act_fail, B_ERROR }, // DT WROM BK
{ 0x3B0F, "End of medium reached", err_act_fail, B_ERROR }, // R
{ 0x3B11, "Medium magazine not accessible", err_act_fail, B_ERROR }, // DT WROM BK
{ 0x3B12, "Medium magazine removed", err_act_fail, B_ERROR }, // DT WROM BK
{ 0x3B13, "Medium magazine inserted", err_act_fail, B_ERROR }, // DT WROM BK
{ 0x3B14, "Medium magazine locked", err_act_fail, B_ERROR }, // DT WROM BK
{ 0x3B15, "Medium magazine unlocked", err_act_fail, B_ERROR }, // DT WROM BK
{ 0x3B16, "Mechanical positioning or changer error", err_act_fail, B_ERROR }, // R
{ 0x3B17, "Read past end of user object", err_act_fail, B_ERROR }, // F
{ 0x3B18, "Element disabled", err_act_fail, B_ERROR }, // M
{ 0x3B19, "Element enabled", err_act_fail, B_ERROR }, // M
{ 0x3B1A, "Data transfer device removed", err_act_fail, B_ERROR }, // M
{ 0x3B1B, "Data transfer device inserted", err_act_fail, B_ERROR }, // M
{ 0x3B1C, "Too many logical objects on partition to support operation", err_act_fail, B_ERROR }, // T
{ 0x3D00, "Invalid bits in IDENTIFY message", err_act_fail, B_ERROR }, // DTLPWROMAE K
{ 0x3E00, "Logical unit has not self-configured yet", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x3E01, "Logical unit failure", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x3E02, "Timeout on logical unit", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x3E03, "Logical unit failed self-test", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x3E04, "Logical unit unable to update self-test log", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x3F00, "Target operating conditions have changed", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x3F01, "Microcode has been changed", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x3F02, "Changed operating definition", err_act_fail, B_ERROR }, // DTLPWROM BK
{ 0x3F03, "INQUIRY data has changed", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x3F04, "Component device attached", err_act_fail, B_ERROR }, // DT WROMAEBK
{ 0x3F05, "Device identifier changed", err_act_fail, B_ERROR }, // DT WROMAEBK
{ 0x3F06, "Redundancy group created or modified", err_act_fail, B_ERROR }, // DT WROMAEB
{ 0x3F07, "Redundancy group deleted", err_act_fail, B_ERROR }, // DT WROMAEB
{ 0x3F08, "Spare created or modified", err_act_fail, B_ERROR }, // DT WROMAEB
{ 0x3F09, "Spare deleted", err_act_fail, B_ERROR }, // DT WROMAEB
{ 0x3F0A, "Volume set created or modified", err_act_fail, B_ERROR }, // DT WROMAEBK
{ 0x3F0B, "Volume set deleted", err_act_fail, B_ERROR }, // DT WROMAEBK
{ 0x3F0C, "Volume set deassigned", err_act_fail, B_ERROR }, // DT WROMAEBK
{ 0x3F0D, "Volume set reassigned", err_act_fail, B_ERROR }, // DT WROMAEBK
{ 0x3F0E, "Reported LUNs data has changed", err_act_rescan, B_ERROR }, // DTLPWROMAE
{ 0x3F0F, "Echo buffer overwritten", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x3F10, "Medium loadable", err_act_fail, B_ERROR }, // DT WROM B
{ 0x3F11, "Medium auxiliary memory accessible", err_act_fail, B_ERROR }, // DT WROM B
{ 0x3F12, "iSCSI IP address added", err_act_fail, B_ERROR }, // DTLPWR MAEBK F
{ 0x3F13, "iSCSI IP address removed", err_act_fail, B_ERROR }, // DTLPWR MAEBK F
{ 0x3F14, "iSCSI IP address changed", err_act_fail, B_ERROR }, // DTLPWR MAEBK F
{ 0x3F15, "Inspect referrals sense descriptors", err_act_fail, B_ERROR }, // DTLPWR MAEBK
{ 0x4000, "RAM failure", err_act_fail, B_ERROR }, // D
{ 0x40ff, "Diagnostic failure on component ID ASQ", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x4100, "Data path failure", err_act_fail, B_ERROR }, // D
{ 0x4200, "Power-on or self-test failure", err_act_fail, B_ERROR }, // D
{ 0x4300, "Message error", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x4400, "Internal target failure", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x4401, "Persistent reservation information lost", err_act_fail, B_ERROR }, // DT P MAEBKVF
{ 0x4471, "ATA device failed set features", err_act_fail, B_ERROR }, // DT B
{ 0x4500, "Select or reselect failure", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x4600, "Unsuccessful soft reset", err_act_fail, B_ERROR }, // DTLPWROM BK
{ 0x4700, "SCSI parity error", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x4701, "Data phase CRC error detected", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x4702, "SCSI parity error detected during ST data phase", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x4703, "Information unit iuCRC error detected", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x4704, "Asynchronous information protection error detected", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x4705, "Protocol service CRC error", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x4706, "PHY test function in progress", err_act_fail, B_ERROR }, // DT MAEBKVF
{ 0x477F, "Some commands cleared by iSCSI protocol event", err_act_fail, B_ERROR }, // DT PWROMAEBK
{ 0x4800, "Initiator detected error message received", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x4900, "Invalid message error", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x4A00, "Command phase error", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x4B00, "Data phase error", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x4B01, "Invalid target port transfer tag received", err_act_fail, B_ERROR }, // DT PWROMAEBK
{ 0x4B02, "Too much write data", err_act_fail, B_ERROR }, // DT PWROMAEBK
{ 0x4B03, "ACK/NAK timeout", err_act_fail, B_ERROR }, // DT PWROMAEBK
{ 0x4B04, "NAK received", err_act_fail, B_ERROR }, // DT PWROMAEBK
{ 0x4B05, "Data offset error", err_act_fail, B_ERROR }, // DT PWROMAEBK
{ 0x4B06, "Initiator response timeout", err_act_fail, B_ERROR }, // DT PWROMAEBK
{ 0x4B07, "Connection lost", err_act_fail, B_ERROR }, // DT PWROMAEBK F
{ 0x4B08, "Data-in buffer overflow - data buffer size", err_act_fail, B_ERROR }, // DT PWROMAEBK F
{ 0x4B09, "Data-in buffer overflow - data buffer descriptor area", err_act_fail, B_ERROR }, // DT PWROMAEBK F
{ 0x4B0A, "Data-in buffer error", err_act_fail, B_ERROR }, // DT PWROMAEBK F
{ 0x4B0B, "Data-out buffer overflow - data buffer size", err_act_fail, B_ERROR }, // DT PWROMAEBK F
{ 0x4B0C, "Data-out buffer overflow - data buffer descriptor area", err_act_fail, B_ERROR }, // DT PWROMAEBK F
{ 0x4B0D, "Data-out buffer error", err_act_fail, B_ERROR }, // DT PWROMAEBK F
{ 0x4B0E, "PCIe fabric error", err_act_fail, B_ERROR }, // DT PWROMAEBK F
{ 0x4B0F, "PCIe completion timeout", err_act_fail, B_ERROR }, // DT PWROMAEBK F
{ 0x4B10, "PCIe completer abort", err_act_fail, B_ERROR }, // DT PWROMAEBK F
{ 0x4B11, "PCIe poisoned TLP received", err_act_fail, B_ERROR }, // DT PWROMAEBK F
{ 0x4B12, "PCIe eCRC check failed", err_act_fail, B_ERROR }, // DT PWROMAEBK F
{ 0x4B13, "PCIe unsupported request", err_act_fail, B_ERROR }, // DT PWROMAEBK F
{ 0x4B14, "PCIe ACS violation", err_act_fail, B_ERROR }, // DT PWROMAEBK F
{ 0x4B15, "PCIe TLP prefix blocked", err_act_fail, B_ERROR }, // DT PWROMAEBK F
{ 0x4C00, "Logical unit failed self-configuration", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x4DFF, "Tagged overlapped commands ASQ", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x4E00, "Overlapped commands attempted", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x5000, "Write append error", err_act_fail, B_ERROR }, // T
{ 0x5001, "Write append position error", err_act_fail, B_ERROR }, // T
{ 0x5002, "Position error related to timing", err_act_fail, B_ERROR }, // T
{ 0x5100, "Erase failure", err_act_fail, B_ERROR }, // T RO
{ 0x5101, "Erase failure - incomplete erase operation detected", err_act_fail, B_ERROR }, // R
{ 0x5200, "Cartridge fault", err_act_fail, B_ERROR }, // T
{ 0x5300, "Media load or eject failed", err_act_fail, B_ERROR }, // DTL WROM BK
{ 0x5301, "Unload tape failure", err_act_fail, B_ERROR }, // T
{ 0x5302, "Medium removal prevented", err_act_fail, B_ERROR }, // DT WROM BK
{ 0x5303, "Medium removal prevented by data transfer element", err_act_fail, B_ERROR }, // M
{ 0x5304, "Medium thread or unthread failure", err_act_fail, B_ERROR }, // T
{ 0x5305, "Volume identifier invalid", err_act_fail, B_ERROR }, // M
{ 0x5306, "Volume identifier missing", err_act_fail, B_ERROR }, // M
{ 0x5307, "Duplicate volume identifier", err_act_fail, B_ERROR }, // M
{ 0x5308, "Element status unknown", err_act_fail, B_ERROR }, // M
{ 0x5400, "SCSI to host system interface failure", err_act_fail, B_ERROR }, // P
{ 0x5500, "System resource failure", err_act_fail, B_ERROR }, // P
{ 0x5501, "System buffer full", err_act_fail, B_DEVICE_FULL }, // D O BK
{ 0x5502, "Insufficient reservation resources", err_act_fail, B_ERROR }, // DTLPWROMAE K
{ 0x5503, "Insufficient resources", err_act_fail, B_ERROR }, // DTLPWROMAE K
{ 0x5504, "Insufficient registration resources", err_act_fail, B_ERROR }, // DTLPWROMAE K
{ 0x5505, "Insufficient access control resources", err_act_fail, B_ERROR }, // DT PWROMAEBK
{ 0x5506, "Auxiliary memory out of space", err_act_fail, B_ERROR }, // DT WROM B
{ 0x5507, "Quota error", err_act_fail, B_ERROR }, // F
{ 0x5508, "Maximum number of supplemental decryption keys exceeded", err_act_fail, B_ERROR }, // T
{ 0x5509, "Medium auxiliary memory not accessible", err_act_fail, B_ERROR }, // M
{ 0x550A, "Data currently unavailable", err_act_fail, B_ERROR }, // M
{ 0x550B, "Insufficient power for operation", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x550C, "Insufficient resources to create ROD", err_act_fail, B_ERROR }, // DT P B
{ 0x550D, "Insufficient resources to create ROD token", err_act_fail, B_ERROR }, // DT P B
{ 0x5700, "Unable to recover table-of-contents", err_act_fail, B_ERROR }, // R
{ 0x5800, "Generation does not exist", err_act_fail, B_ERROR }, // O
{ 0x5900, "Updated block read", err_act_fail, B_ERROR }, // O
{ 0x5A00, "Operator request or state change input", err_act_fail, B_ERROR }, // DTLPWRO BK
{ 0x5A01, "Operator medium removal request", err_act_retry, B_DEV_MEDIA_CHANGE_REQUESTED }, // DT WROM BK
{ 0x5A02, "Operator selected write protect", err_act_fail, B_ERROR }, // DT WRO A BK
{ 0x5A03, "Operator selected write permit", err_act_fail, B_ERROR }, // DT WRO A BK
{ 0x5B00, "Log exception", err_act_fail, B_ERROR }, // DTLPWROM K
{ 0x5B01, "Threshold condition met", err_act_fail, B_ERROR }, // DTLPWROM K
{ 0x5B02, "Log counter at maximum", err_act_fail, B_ERROR }, // DTLPWROM K
{ 0x5B03, "Log list codes exhausted", err_act_fail, B_ERROR }, // DTLPWROM K
{ 0x5C00, "RPL status change", err_act_fail, B_ERROR }, // D O
{ 0x5C01, "Spindles synchronized", err_act_ok, B_OK }, // D O
{ 0x5C02, "Spindles not synchronized", err_act_fail, B_ERROR }, // D O
{ 0x5D00, "Failure prediction threshold exceeded", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x5D01, "Media failure prediction threshold exceeded", err_act_fail, B_ERROR }, // R B
{ 0x5D02, "Logical unit failure prediction threshold exceeded", err_act_fail, B_ERROR }, // R
{ 0x5D03, "Spare area exhaustion prediction threshold exceeded", err_act_fail, B_ERROR }, // R
{ 0x5D10, "Hardware impending failure general hard drive failure", err_act_fail, B_ERROR }, // D B
{ 0x5D11, "Hardware impending failure drive error rate too high", err_act_fail, B_ERROR }, // D B
{ 0x5D12, "Hardware impending failure data error rate too high", err_act_fail, B_ERROR }, // D B
{ 0x5D13, "Hardware impending failure seek error rate too high", err_act_fail, B_ERROR }, // D B
{ 0x5D14, "Hardware impending failure too many block reassigns", err_act_fail, B_ERROR }, // D B
{ 0x5D15, "Hardware impending failure access times too high", err_act_fail, B_ERROR }, // D B
{ 0x5D16, "Hardware impending failure start unit times too high", err_act_fail, B_ERROR }, // D B
{ 0x5D17, "Hardware impending failure channel parametrics", err_act_fail, B_ERROR }, // D B
{ 0x5D18, "Hardware impending failure controller detected", err_act_fail, B_ERROR }, // D B
{ 0x5D19, "Hardware impending failure throughput performance", err_act_fail, B_ERROR }, // D B
{ 0x5D1A, "Hardware impending failure seek time performance", err_act_fail, B_ERROR }, // D B
{ 0x5D1B, "Hardware impending failure spin-up retry count", err_act_fail, B_ERROR }, // D B
{ 0x5D1C, "Hardware impending failure drive calibration retry count", err_act_fail, B_ERROR }, // D B
{ 0x5D20, "Controller impending failure general hard drive failure", err_act_fail, B_ERROR }, // D B
{ 0x5D21, "Controller impending failure drive error rate too high", err_act_fail, B_ERROR }, // D B
{ 0x5D22, "Controller impending failure data error rate too high", err_act_fail, B_ERROR }, // D B
{ 0x5D23, "Controller impending failure seek error rate too high", err_act_fail, B_ERROR }, // D B
{ 0x5D24, "Controller impending failure too many block reassigns", err_act_fail, B_ERROR }, // D B
{ 0x5D25, "Controller impending failure access times too high", err_act_fail, B_ERROR }, // D B
{ 0x5D26, "Controller impending failure start unit times too high", err_act_fail, B_ERROR }, // D B
{ 0x5D27, "Controller impending failure channel parametrics", err_act_fail, B_ERROR }, // D B
{ 0x5D28, "Controller impending failure controller detected", err_act_fail, B_ERROR }, // D B
{ 0x5D29, "Controller impending failure throughput performance", err_act_fail, B_ERROR }, // D B
{ 0x5D2A, "Controller impending failure seek time performance", err_act_fail, B_ERROR }, // D B
{ 0x5D2B, "Controller impending failure spin-up retry count", err_act_fail, B_ERROR }, // D B
{ 0x5D2C, "Controller impending failure drive calibration retry count", err_act_fail, B_ERROR }, // D B
{ 0x5D30, "Data channel impending failure general hard drive failure", err_act_fail, B_ERROR }, // D B
{ 0x5D31, "Data channel impending failure drive error rate too high", err_act_fail, B_ERROR }, // D B
{ 0x5D32, "Data channel impending failure data error rate too high", err_act_fail, B_ERROR }, // D B
{ 0x5D33, "Data channel impending failure seek error rate too high", err_act_fail, B_ERROR }, // D B
{ 0x5D34, "Data channel impending failure too many block reassigns", err_act_fail, B_ERROR }, // D B
{ 0x5D35, "Data channel impending failure access times too high", err_act_fail, B_ERROR }, // D B
{ 0x5D36, "Data channel impending failure start unit times too high", err_act_fail, B_ERROR }, // D B
{ 0x5D37, "Data channel impending failure channel parametrics", err_act_fail, B_ERROR }, // D B
{ 0x5D38, "Data channel impending failure controller detected", err_act_fail, B_ERROR }, // D B
{ 0x5D39, "Data channel impending failure throughput performance", err_act_fail, B_ERROR }, // D B
{ 0x5D3A, "Data channel impending failure seek time performance", err_act_fail, B_ERROR }, // D B
{ 0x5D3B, "Data channel impending failure spin-up retry count", err_act_fail, B_ERROR }, // D B
{ 0x5D3C, "Data channel impending failure drive calibration retry count", err_act_fail, B_ERROR }, // D B
{ 0x5D40, "Servo impending failure general hard drive failure", err_act_fail, B_ERROR }, // D B
{ 0x5D41, "Servo impending failure drive error rate too high", err_act_fail, B_ERROR }, // D B
{ 0x5D42, "Servo impending failure data error rate too high", err_act_fail, B_ERROR }, // D B
{ 0x5D43, "Servo impending failure seek error rate too high", err_act_fail, B_ERROR }, // D B
{ 0x5D44, "Servo impending failure too many block reassigns", err_act_fail, B_ERROR }, // D B
{ 0x5D45, "Servo impending failure access times too high", err_act_fail, B_ERROR }, // D B
{ 0x5D46, "Servo impending failure start unit times too high", err_act_fail, B_ERROR }, // D B
{ 0x5D47, "Servo impending failure channel parametrics", err_act_fail, B_ERROR }, // D B
{ 0x5D48, "Servo impending failure controller detected", err_act_fail, B_ERROR }, // D B
{ 0x5D49, "Servo impending failure throughput performance", err_act_fail, B_ERROR }, // D B
{ 0x5D4A, "Servo impending failure seek time performance", err_act_fail, B_ERROR }, // D B
{ 0x5D4B, "Servo impending failure spin-up retry count", err_act_fail, B_ERROR }, // D B
{ 0x5D4C, "Servo impending failure drive calibration retry count", err_act_fail, B_ERROR }, // D B
{ 0x5D50, "Spindle impending failure general hard drive failure", err_act_fail, B_ERROR }, // D B
{ 0x5D51, "Spindle impending failure drive error rate too high", err_act_fail, B_ERROR }, // D B
{ 0x5D52, "Spindle impending failure data error rate too high", err_act_fail, B_ERROR }, // D B
{ 0x5D53, "Spindle impending failure seek error rate too high", err_act_fail, B_ERROR }, // D B
{ 0x5D54, "Spindle impending failure too many block reassigns", err_act_fail, B_ERROR }, // D B
{ 0x5D55, "Spindle impending failure access times too high", err_act_fail, B_ERROR }, // D B
{ 0x5D56, "Spindle impending failure start unit times too high", err_act_fail, B_ERROR }, // D B
{ 0x5D57, "Spindle impending failure channel parametrics", err_act_fail, B_ERROR }, // D B
{ 0x5D58, "Spindle impending failure controller detected", err_act_fail, B_ERROR }, // D B
{ 0x5D59, "Spindle impending failure throughput performance", err_act_fail, B_ERROR }, // D B
{ 0x5D5A, "Spindle impending failure seek time performance", err_act_fail, B_ERROR }, // D B
{ 0x5D5B, "Spindle impending failure spin-up retry count", err_act_fail, B_ERROR }, // D B
{ 0x5D5C, "Spindle impending failure drive calibration retry count", err_act_fail, B_ERROR }, // D B
{ 0x5D60, "Firmware impending failure general hard drive failure", err_act_fail, B_ERROR }, // D B
{ 0x5D61, "Firmware impending failure drive error rate too high", err_act_fail, B_ERROR }, // D B
{ 0x5D62, "Firmware impending failure data error rate too high", err_act_fail, B_ERROR }, // D B
{ 0x5D63, "Firmware impending failure seek error rate too high", err_act_fail, B_ERROR }, // D B
{ 0x5D64, "Firmware impending failure too many block reassigns", err_act_fail, B_ERROR }, // D B
{ 0x5D65, "Firmware impending failure access times too high", err_act_fail, B_ERROR }, // D B
{ 0x5D66, "Firmware impending failure start unit times too high", err_act_fail, B_ERROR }, // D B
{ 0x5D67, "Firmware impending failure channel parametrics", err_act_fail, B_ERROR }, // D B
{ 0x5D68, "Firmware impending failure controller detected", err_act_fail, B_ERROR }, // D B
{ 0x5D69, "Firmware impending failure throughput performance", err_act_fail, B_ERROR }, // D B
{ 0x5D6A, "Firmware impending failure seek time performance", err_act_fail, B_ERROR }, // D B
{ 0x5D6B, "Firmware impending failure spin-up retry count", err_act_fail, B_ERROR }, // D B
{ 0x5D6C, "Firmware impending failure drive calibration retry count", err_act_fail, B_ERROR }, // D B
{ 0x5DFF, "Failure prediction threshold exceeded (false)", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x5E00, "Low power condition on", err_act_fail, B_ERROR }, // DTLPWRO A K
{ 0x5E01, "Idle condition activated by timer", err_act_fail, B_ERROR }, // DTLPWRO A K
{ 0x5E02, "Standby condition activated by timer", err_act_fail, B_ERROR }, // DTLPWRO A K
{ 0x5E03, "Idle condition activated by command", err_act_fail, B_ERROR }, // DTLPWRO A K
{ 0x5E04, "Standby condition activated by command", err_act_fail, B_ERROR }, // DTLPWRO A K
{ 0x5E05, "Idle-B condition activated by timer", err_act_fail, B_ERROR }, // DTLPWRO A K
{ 0x5E06, "Idle-B condition activated by command", err_act_fail, B_ERROR }, // DTLPWRO A K
{ 0x5E07, "Idle-C condition activated by timer", err_act_fail, B_ERROR }, // DTLPWRO A K
{ 0x5E08, "Idle-C condition activated by command", err_act_fail, B_ERROR }, // DTLPWRO A K
{ 0x5E09, "Standby-Y condition activated by timer", err_act_fail, B_ERROR }, // DTLPWRO A K
{ 0x5E0A, "Standby-Y condition activated by command", err_act_fail, B_ERROR }, // DTLPWRO A K
{ 0x5E41, "Power state change to active", err_act_fail, B_ERROR }, // B
{ 0x5E42, "Power state change to idle", err_act_fail, B_ERROR }, // B
{ 0x5E43, "Power state change to standby", err_act_fail, B_ERROR }, // B
{ 0x5E45, "Power state change to sleep", err_act_fail, B_ERROR }, // B
{ 0x5E47, "Power state change to device control", err_act_fail, B_ERROR }, // BK
{ 0x6000, "Lamp failure", err_act_fail, B_ERROR }, //
{ 0x6100, "Video acquisition error", err_act_fail, B_ERROR }, //
{ 0x6101, "Unable to acquire video", err_act_fail, B_ERROR }, //
{ 0x6102, "Out of focus", err_act_fail, B_ERROR }, //
{ 0x6200, "Scan head positioning error", err_act_fail, B_ERROR }, //
{ 0x6300, "End of user area encountered on this track", err_act_fail, B_ERROR }, // R
{ 0x6301, "Packet does not fit in available space", err_act_fail, B_DEVICE_FULL }, // R
{ 0x6400, "Illegal mode for this track", err_act_fail, B_DEV_NOT_READY }, // R
{ 0x6401, "Invalid packet size", err_act_fail, B_ERROR }, // R
{ 0x6500, "Voltage fault", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x6600, "Automatic document feeder cover up", err_act_fail, B_ERROR }, //
{ 0x6601, "Automatic document feeder lift up", err_act_fail, B_ERROR }, //
{ 0x6602, "Document jam in automatic document feeder", err_act_fail, B_ERROR }, //
{ 0x6603, "Document miss feed automatic in document feeder", err_act_fail, B_ERROR }, //
{ 0x6700, "Configuration failure", err_act_fail, B_ERROR }, // A
{ 0x6701, "Configuration of incapable logical units failed", err_act_fail, B_ERROR }, // A
{ 0x6702, "Add logical unit failed", err_act_fail, B_ERROR }, // A
{ 0x6703, "Modification of logical unit failed", err_act_fail, B_ERROR }, // A
{ 0x6704, "Exchange of logical unit failed", err_act_fail, B_ERROR }, // A
{ 0x6705, "Remove of logical unit failed", err_act_fail, B_ERROR }, // A
{ 0x6706, "Attachment of logical unit failed", err_act_fail, B_ERROR }, // A
{ 0x6707, "Creation of logical unit failed", err_act_fail, B_ERROR }, // A
{ 0x6708, "Assign failure occurred", err_act_fail, B_ERROR }, // A
{ 0x6709, "Multiply assigned logical unit", err_act_fail, B_ERROR }, // A
{ 0x670A, "Set target port groups command failed", err_act_fail, B_ERROR }, // DTLPWROMAEBKVF
{ 0x670B, "ATA device feature not enabled", err_act_fail, B_ERROR }, // DT B
{ 0x6800, "Logical unit not configured", err_act_fail, B_ERROR }, // A
{ 0x6801, "Subsidiary logical unit not configured", err_act_fail, B_ERROR }, // D
{ 0x6900, "Data loss on logical unit", err_act_fail, B_ERROR }, // A
{ 0x6901, "Multiple logical unit failures", err_act_fail, B_ERROR }, // A
{ 0x6902, "Parity/data mismatch", err_act_fail, B_ERROR }, // A
{ 0x6A00, "Informational, refer to log", err_act_fail, B_ERROR }, // A
{ 0x6B00, "State change has occurred", err_act_fail, B_ERROR }, // A
{ 0x6B01, "Redundancy level got better", err_act_fail, B_ERROR }, // A
{ 0x6B02, "Redundancy level got worse", err_act_fail, B_ERROR }, // A
{ 0x6C00, "Rebuild failure occurred", err_act_fail, B_ERROR }, // A
{ 0x6D00, "Recalculate failure occurred", err_act_fail, B_ERROR }, // A
{ 0x6E00, "Command to logical unit failed", err_act_fail, B_ERROR }, // A
{ 0x6F00, "Copy protection key exchange failure - authentication failure", err_act_fail, B_ERROR }, // R
{ 0x6F01, "Copy protection key exchange failure - key not present", err_act_fail, B_ERROR }, // R
{ 0x6F02, "Copy protection key exchange failure - key not established", err_act_fail, B_ERROR }, // R
{ 0x6F03, "Read of scrambled sector without authentication", err_act_fail, B_ERROR }, // R
{ 0x6F04, "Media region code is mismatched to logical unit region", err_act_fail, B_ERROR }, // R
{ 0x6F05, "Drive region must be permanent/region reset count error", err_act_fail, B_ERROR }, // R
{ 0x6F06, "Insufficient block count for binding NONCE recording", err_act_fail, B_ERROR }, // R
{ 0x6F07, "Conflict in binding nonce recording", err_act_fail, B_ERROR }, // R
{ 0x70FF, "Decompression exception short algorithm id ASQ", err_act_fail, B_ERROR }, // T
{ 0x7100, "Decompression exception long algorithm id", err_act_fail, B_ERROR }, // T
{ 0x7200, "Session fixation error", err_act_fail, B_ERROR }, // R
{ 0x7201, "Session fixation error writing lead-in", err_act_fail, B_ERROR }, // R
{ 0x7202, "Session fixation error writing lead-out", err_act_fail, B_ERROR }, // R
{ 0x7203, "Session fixation error - incomplete track in session", err_act_fail, B_ERROR }, // R
{ 0x7204, "Empty or partially written reserved track", err_act_fail, B_ERROR }, // R
{ 0x7205, "No more track reservations allowed", err_act_fail, B_ERROR }, // R
{ 0x7206, "RMZ extension is not allowed", err_act_fail, B_ERROR }, // R
{ 0x7207, "No more test zone extensions are allowed", err_act_fail, B_ERROR }, // R
{ 0x7300, "CD control error", err_act_fail, B_ERROR }, // R
{ 0x7301, "Power calibration area almost full", err_act_fail, B_ERROR }, // R
{ 0x7302, "Power calibration area is full", err_act_fail, B_DEVICE_FULL }, // R
{ 0x7303, "Power calibration area error", err_act_fail, B_ERROR }, // R
{ 0x7304, "Program memory area update failure", err_act_fail, B_ERROR }, // R
{ 0x7305, "Program memory area is full", err_act_fail, B_ERROR }, // R
{ 0x7306, "RMA/PMA is almost full", err_act_fail, B_ERROR }, // R
{ 0x7310, "Current power calibration area almost full", err_act_fail, B_ERROR }, // R
{ 0x7311, "Current power calibration area is full", err_act_fail, B_ERROR }, // R
{ 0x7317, "RDZ is full", err_act_fail, B_ERROR }, // R
{ 0x7400, "Security error", err_act_fail, B_ERROR }, // T
{ 0x7401, "Unable to decrypt data", err_act_fail, B_ERROR }, // T
{ 0x7402, "Unencrypted data encountered while decrypting", err_act_fail, B_ERROR }, // T
{ 0x7403, "Incorrect data encryption key", err_act_fail, B_ERROR }, // T
{ 0x7404, "Cryptographic integrity validation failed", err_act_fail, B_ERROR }, // T
{ 0x7405, "Error decrypting data", err_act_fail, B_ERROR }, // T
{ 0x7406, "Unknown signature verification key", err_act_fail, B_ERROR }, // T
{ 0x7407, "Encryption parameters not useable", err_act_fail, B_ERROR }, // T
{ 0x7408, "Digital signature validation failure", err_act_fail, B_ERROR }, // DT R M E VF
{ 0x7409, "Encryption mode mismatch on read", err_act_fail, B_ERROR }, // T
{ 0x740A, "Encrypted block not raw read enabled", err_act_fail, B_ERROR }, // T
{ 0x740B, "Incorrect encryption parameters", err_act_fail, B_ERROR }, // T
{ 0x740C, "Unable to decrypt parameter list", err_act_fail, B_ERROR }, // DT R MAEBKV
{ 0x740D, "Encryption algorithm disabled", err_act_fail, B_ERROR }, // T
{ 0x7410, "SA creation parameter value invalid", err_act_fail, B_ERROR }, // DT R MAEBKV
{ 0x7411, "SA creation parameter value rejected", err_act_fail, B_ERROR }, // DT R MAEBKV
{ 0x7412, "Invalid SA usage", err_act_fail, B_ERROR }, // DT R MAEBKV
{ 0x7421, "Data encryption configuration prevented", err_act_fail, B_ERROR }, // T
{ 0x7430, "SA creation parameter not supported", err_act_fail, B_ERROR }, // DT R MAEBKV
{ 0x7440, "Authentication failed", err_act_fail, B_ERROR }, // DT R MAEBKV
{ 0x7461, "External data encryption key manager access error", err_act_fail, B_ERROR }, // V
{ 0x7462, "External data encryption key manager error", err_act_fail, B_ERROR }, // V
{ 0x7463, "External data encryption key not found", err_act_fail, B_ERROR }, // V
{ 0x7464, "External data encryption request not authorized", err_act_fail, B_ERROR }, // V
{ 0x746E, "External data encryption control timeout", err_act_fail, B_ERROR }, // T
{ 0x746F, "External data encryption control error", err_act_fail, B_ERROR }, // T
{ 0x7471, "Logical unit access not authorized", err_act_fail, B_ERROR }, // DT R M E V
{ 0x7479, "Security conflict in translated device", err_act_fail, B_ERROR }, // D
};
// Use these values for loop control during searching:
#define SCSI_SENSE_KEY_TABLE_LEN (sizeof(sSCSISenseKeyTable)/sizeof(scsi_sense_key_table))
#define SCSI_SENSE_ASC_ASCQ_TABLE_LEN (sizeof(sSCSISenseAscTable)/sizeof(scsi_sense_asc_table))
status_t
scsi_get_sense_key_info(uint8 key, const char **label, err_act *action, status_t *error)
{
int i;
for (i = 0; i < (int)SCSI_SENSE_KEY_TABLE_LEN; i++) {
if (sSCSISenseKeyTable[i].key == key) {
*label = sSCSISenseKeyTable[i].label;
*action = sSCSISenseKeyTable[i].action;
*error = sSCSISenseKeyTable[i].err;
return B_OK;
}
}
*label = NULL;
return B_BAD_VALUE;
}
status_t
scsi_get_sense_asc_info(uint16 asc_asq, const char **label, err_act *action, status_t *error)
{
int i;
for (i = 0; i < (int)SCSI_SENSE_ASC_ASCQ_TABLE_LEN; i++) {
if (sSCSISenseAscTable[i].asc_ascq == asc_asq) {
*label = sSCSISenseAscTable[i].label;
*action = sSCSISenseAscTable[i].action;
*error = sSCSISenseAscTable[i].err;
return B_OK;
}
}
*label = NULL;
return B_BAD_VALUE;
}
@@ -63,6 +63,7 @@ extern "C" {
extern addr_t arm_get_far(void);
extern int32 arm_get_fsr(void);
extern addr_t arm_get_fp(void);
extern int mmu_read_c1(void);
extern int mmu_write_c1(int val);
@@ -29,6 +29,9 @@ typedef struct {
// to the Open Firmware.
uint32 num_virtual_ranges_to_keep;
addr_range virtual_ranges_to_keep[MAX_VIRTUAL_RANGES_TO_KEEP];
// platform type we booted from
int platform;
} arch_kernel_args;
#endif /* KERNEL_ARCH_PPC_KERNEL_ARGS_H */
@@ -0,0 +1,134 @@
/*
** Copyright 2003, Axel Dörfler, [email protected]. All rights reserved.
** Distributed under the terms of the OpenBeOS License.
*/
#ifndef _KERNEL_ARCH_PPC_MMU_AMCC440_H
#define _KERNEL_ARCH_PPC_MMU_AMCC440_H
#include <SupportDefs.h>
#include <string.h>
#include <arch_cpu.h>
/*** TLB - translation lookaside buffer ***/
#define TLB_COUNT 64
/** valid tlb length values */
enum tlb_length {
TLB_LENGTH_1kB = 0x0,
TLB_LENGTH_4kB = 0x1,
TLB_LENGTH_16kB = 0x2,
TLB_LENGTH_64kB = 0x3,
TLB_LENGTH_256kB = 0x4,
TLB_LENGTH_1MB = 0x5,
TLB_LENGTH_16MB = 0x7,
TLB_LENGTH_256MB = 0x9,
};
#define TLB_V 0x200
/** structure of a real TLB entry */
//FIXME
struct tlb_entry {
// word 0
uint32 effective_page_number : 22;
uint32 valid : 1;
uint32 translation_address_space : 1;
uint32 page_size : 4;
uint32 parity_1 : 4;
//uint32 translation_id : 8;
//FIXME:rest is Classic stuff
// word 0
// upper 32 bit
uint32 page_index : 15; // BEPI, block effective page index
uint32 _reserved0 : 4;
uint32 length : 11;
uint32 kernel_valid : 1; // Vs, Supervisor-state valid
uint32 user_valid : 1; // Vp, User-state valid
// lower 32 bit
uint32 physical_block_number : 15; // BPRN
uint32 write_through : 1; // WIMG
uint32 caching_inhibited : 1;
uint32 memory_coherent : 1;
uint32 guarded : 1;
uint32 _reserved1 : 1;
uint32 protection : 2;
tlb_entry()
{
Clear();
}
void SetVirtualAddress(void *address)
{
page_index = uint32(address) >> 17;
}
void SetPhysicalAddress(void *address)
{
physical_block_number = uint32(address) >> 17;
}
void Clear()
{
memset((void *)this, 0, sizeof(tlb_entry));
}
};
#if 0 // XXX:Classic
/*** PTE - page table entry ***/
enum pte_protection {
PTE_READ_ONLY = 3,
PTE_READ_WRITE = 2,
};
struct page_table_entry {
// upper 32 bit
uint32 valid : 1;
uint32 virtual_segment_id : 24;
uint32 secondary_hash : 1;
uint32 abbr_page_index : 6;
// lower 32 bit
uint32 physical_page_number : 20;
uint32 _reserved0 : 3;
uint32 referenced : 1;
uint32 changed : 1;
uint32 write_through : 1; // WIMG
uint32 caching_inhibited : 1;
uint32 memory_coherent : 1;
uint32 guarded : 1;
uint32 _reserved1 : 1;
uint32 page_protection : 2;
static uint32 PrimaryHash(uint32 virtualSegmentID, uint32 virtualAddress);
static uint32 SecondaryHash(uint32 virtualSegmentID, uint32 virtualAddress);
static uint32 SecondaryHash(uint32 primaryHash);
};
struct page_table_entry_group {
struct page_table_entry entry[8];
};
extern void ppc_get_page_table(page_table_entry_group **_pageTable, size_t *_size);
extern void ppc_set_page_table(page_table_entry_group *pageTable, size_t size);
static inline segment_descriptor
ppc_get_segment_register(void *virtualAddress)
{
return (segment_descriptor)get_sr(virtualAddress);
}
static inline void
ppc_set_segment_register(void *virtualAddress, segment_descriptor segment)
{
set_sr(virtualAddress, *(uint32 *)&segment);
}
#endif
#endif /* _KERNEL_ARCH_PPC_MMU_AMCC440_H */
@@ -11,6 +11,7 @@ struct real_time_data;
enum ppc_platform_type {
PPC_PLATFORM_OPEN_FIRMWARE = 0,
PPC_PLATFORM_U_BOOT
};
namespace BPrivate {
@@ -19,6 +19,12 @@
typedef struct {
void *openfirmware_entry;
char rtc_path[128];
// XXX: HACK: must match the U-Boot platform args
// FIXME: use a union instead?
// Flattened Device Tree blob
void *fdt;
} platform_kernel_args;
#endif /* KERNEL_BOOT_PLATFORM_OPENFIRMWARE_KERNEL_ARGS_H */
@@ -17,7 +17,13 @@
typedef struct {
char dummy;
// XXX: HACK: must match the OF platform args
// FIXME: use a union instead?
void *openfirmware_entry;
char rtc_path[128];
// Flattened Device Tree blob
void *fdt;
} platform_kernel_args;
#endif /* KERNEL_BOOT_PLATFORM_UBOOT_KERNEL_ARGS_H */
@@ -20,7 +20,7 @@ template<typename AddressType>
struct of_region {
AddressType base;
uint32 size;
};
} _PACKED;
struct of_arguments {
const char *name;
@@ -10,8 +10,14 @@
#define STACK_GROWS_DOWNWARDS
//#define ATOMIC_FUNCS_ARE_SYSCALLS
//#define ATOMIC64_FUNCS_ARE_SYSCALLS
// If we're building on ARMv5 or older, all our atomics need to be syscalls... :(
#if _M_ARM <= 5
#define ATOMIC_FUNCS_ARE_SYSCALLS
#endif
// If we're building on ARMv6 or older, 64-bit atomics need to be syscalls...
#if _M_ARM < 7
#define ATOMIC64_FUNCS_ARE_SYSCALLS
#endif
#endif /* _KERNEL_ARCH_ARM_CONFIG_H */
+6
View File
@@ -117,6 +117,12 @@ typedef struct {
size_t readVectorCount, size_t writtenVectorCount,
virtio_callback_func callback, void *callbackCookie);
bool (*queue_is_full)(virtio_queue queue);
bool (*queue_is_empty)(virtio_queue queue);
uint16 (*queue_size)(virtio_queue queue);
} virtio_device_interface;
+8 -12
View File
@@ -611,8 +611,8 @@ display_dce45_crtc_load_lut(uint8 crtcID)
if (info.dceMajor >= 5) {
Write32(OUT, NI_INPUT_CSC_CONTROL + regs->crtcOffset,
(NI_INPUT_CSC_GRPH_MODE(NI_INPUT_CSC_BYPASS) |
NI_INPUT_CSC_OVL_MODE(NI_INPUT_CSC_BYPASS)));
(NI_INPUT_CSC_GRPH_MODE(NI_INPUT_CSC_BYPASS)
| NI_INPUT_CSC_OVL_MODE(NI_INPUT_CSC_BYPASS)));
Write32(OUT, NI_PRESCALE_GRPH_CONTROL + regs->crtcOffset,
NI_GRPH_PRESCALE_BYPASS);
Write32(OUT, NI_PRESCALE_OVL_CONTROL + regs->crtcOffset,
@@ -638,17 +638,15 @@ display_dce45_crtc_load_lut(uint8 crtcID)
Write32(OUT, EVERGREEN_DC_LUT_RW_INDEX, 0);
for (int i = 0; i < 256; i++) {
Write32(OUT, EVERGREEN_DC_LUT_30_COLOR + regs->crtcOffset,
(r[i] << 20) |
(g[i] << 10) |
(b[i] << 0));
(r[i] << 20) | (g[i] << 10) | (b[i] << 0));
}
if (info.dceMajor >= 5) {
Write32(OUT, NI_DEGAMMA_CONTROL + regs->crtcOffset,
(NI_GRPH_DEGAMMA_MODE(NI_DEGAMMA_BYPASS) |
NI_OVL_DEGAMMA_MODE(NI_DEGAMMA_BYPASS) |
NI_ICON_DEGAMMA_MODE(NI_DEGAMMA_BYPASS) |
NI_CURSOR_DEGAMMA_MODE(NI_DEGAMMA_BYPASS)));
(NI_GRPH_DEGAMMA_MODE(NI_DEGAMMA_BYPASS)
| NI_OVL_DEGAMMA_MODE(NI_DEGAMMA_BYPASS)
| NI_ICON_DEGAMMA_MODE(NI_DEGAMMA_BYPASS)
| NI_CURSOR_DEGAMMA_MODE(NI_DEGAMMA_BYPASS)));
Write32(OUT, NI_GAMUT_REMAP_CONTROL + regs->crtcOffset,
(NI_GRPH_GAMUT_REMAP_MODE(NI_GAMUT_REMAP_BYPASS) |
NI_OVL_GAMUT_REMAP_MODE(NI_GAMUT_REMAP_BYPASS)));
@@ -693,9 +691,7 @@ display_avivo_crtc_load_lut(uint8 crtcID)
Write32(OUT, AVIVO_DC_LUT_RW_INDEX, 0);
for (int i = 0; i < 256; i++) {
Write32(OUT, AVIVO_DC_LUT_30_COLOR,
(r[i] << 20) |
(g[i] << 10) |
(b[i] << 0));
(r[i] << 20) | (g[i] << 10) | (b[i] << 0));
}
Write32(OUT, AVIVO_D1GRPH_LUT_SEL + regs->crtcOffset, crtcID);
@@ -772,7 +772,7 @@ dp_link_train(uint8 crtcID)
{
TRACE("%s\n", __func__);
uint32 connectorIndex = gDisplay[crtcID]->connectorIndex;
uint32 connectorIndex = gDisplay[crtcID]->connectorIndex;
dp_info* dp = &gConnector[connectorIndex]->dpInfo;
display_mode* mode = &gDisplay[crtcID]->currentMode;
@@ -5,6 +5,7 @@ UsePrivateHeaders kernel [ FDirName kernel arch $(TARGET_ARCH) ]
[ FDirName kernel boot platform $(HAIKU_BOOT_PLATFORM) ] ;
SEARCH_SOURCE += [ FDirName $(SUBDIR) openfirmware ] ;
SEARCH_SOURCE += [ FDirName $(SUBDIR) u-boot ] ;
KernelStaticLibrary pci_arch_bus_manager :
pci_controller.cpp
@@ -14,4 +15,7 @@ KernelStaticLibrary pci_arch_bus_manager :
pci_openfirmware.cpp
uninorth.cpp
grackle.cpp
# U-Boot
pci_u-boot.cpp
;
@@ -11,6 +11,7 @@
#include "pci_private.h"
#include "openfirmware/pci_openfirmware.h"
#include "u-boot/pci_u-boot.h"
status_t
@@ -19,9 +20,12 @@ pci_controller_init(void)
switch (PPCPlatform::Default()->PlatformType()) {
case PPC_PLATFORM_OPEN_FIRMWARE:
return ppc_openfirmware_pci_controller_init();
break;
case PPC_PLATFORM_U_BOOT:
return ppc_uboot_pci_controller_init();
default:
panic("pci: unknown platform");
}
return B_OK;
return B_ERROR;
}
@@ -0,0 +1,24 @@
/*
* Copyright 2006, Ingo Weinhold <[email protected]>.
* All rights reserved. Distributed under the terms of the MIT License.
*/
#include "pci_u-boot.h"
#include <stdlib.h>
#include <string.h>
#include <KernelExport.h>
//#include <platform/openfirmware/devices.h>
//#include <platform/openfirmware/openfirmware.h>
//#include <platform/openfirmware/pci.h>
status_t
ppc_uboot_pci_controller_init(void)
{
return B_ERROR;
}
@@ -0,0 +1,13 @@
/*
* Copyright 2012, François Revol <[email protected]>.
* All rights reserved. Distributed under the terms of the MIT License.
*/
#ifndef PCI_BUS_MANAGER_PPC_U_BOOT_H
#define PCI_BUS_MANAGER_PPC_U_BOOT_H
#include <SupportDefs.h>
status_t ppc_uboot_pci_controller_init(void);
#endif // PCI_BUS_MANAGER_PPC_U_BOOT_H
@@ -8,6 +8,7 @@ KernelAddon ps2 :
ps2_alps.cpp
ps2_common.cpp
ps2_dev.cpp
ps2_elantech.cpp
ps2_keyboard.cpp
ps2_module.cpp
ps2_standard_mouse.cpp
@@ -67,8 +67,8 @@ public:
private:
bool fFired;
uint8 fLastPackage[PS2_PACKET_ALPS];
timer fEventTimer;
alps_cookie* fCookie;
timer fEventTimer;
alps_cookie* fCookie;
};
@@ -112,7 +112,7 @@ typedef struct alps_model_info {
static const struct alps_model_info gALPSModelInfos[] = {
{{0x32, 0x02, 0x14}, 0xf8, 0xf8, ALPS_PASS | ALPS_DUALPOINT},
// Toshiba Salellite Pro M10
// Toshiba Salellite Pro M10
// {{0x33, 0x02, 0x0a}, 0x88, 0xf8, ALPS_OLDPROTO},
// UMAX-530T
{{0x53, 0x02, 0x0a}, 0xf8, 0xf8, 0},
@@ -155,15 +155,6 @@ static const struct alps_model_info gALPSModelInfos[] = {
static alps_model_info* sFoundModel = NULL;
#define PS2_MOUSE_CMD_SET_SCALE11 0xe6
#define PS2_MOUSE_CMD_SET_SCALE21 0xe7
#define PS2_MOUSE_CMD_SET_RES 0xe8
#define PS2_MOUSE_CMD_GET_INFO 0xe9
#define PS2_MOUSE_CMD_SET_STREAM 0xea
#define PS2_MOUSE_CMD_SET_POLL 0xf0
#define PS2_MOUSE_CMD_SET_RATE 0xf3
// touchpad proportions
#define EDGE_MOTION_WIDTH 55
// increase the touchpad size a little bit
@@ -279,16 +270,16 @@ probe_alps(ps2_dev* dev)
TRACE("ALPS: probe\n");
val[0] = 0;
if (ps2_dev_command(dev, PS2_MOUSE_CMD_SET_RES, val, 1, NULL, 0) != B_OK
|| ps2_dev_command(dev, PS2_MOUSE_CMD_SET_SCALE11, NULL, 0, NULL, 0)
if (ps2_dev_command(dev, PS2_CMD_MOUSE_SET_RES, val, 1, NULL, 0) != B_OK
|| ps2_dev_command(dev, PS2_CMD_MOUSE_SET_SCALE11, NULL, 0, NULL, 0)
!= B_OK
|| ps2_dev_command(dev, PS2_MOUSE_CMD_SET_SCALE11, NULL, 0, NULL, 0)
|| ps2_dev_command(dev, PS2_CMD_MOUSE_SET_SCALE11, NULL, 0, NULL, 0)
!= B_OK
|| ps2_dev_command(dev, PS2_MOUSE_CMD_SET_SCALE11, NULL, 0, NULL, 0)
|| ps2_dev_command(dev, PS2_CMD_MOUSE_SET_SCALE11, NULL, 0, NULL, 0)
!= B_OK)
return B_ERROR;
if (ps2_dev_command(dev, PS2_MOUSE_CMD_GET_INFO, NULL, 0, val, 3)
if (ps2_dev_command(dev, PS2_CMD_MOUSE_GET_INFO, NULL, 0, val, 3)
!= B_OK)
return B_ERROR;
@@ -296,16 +287,16 @@ probe_alps(ps2_dev* dev)
return B_ERROR;
val[0] = 0;
if (ps2_dev_command(dev, PS2_MOUSE_CMD_SET_RES, val, 1, NULL, 0) != B_OK
|| ps2_dev_command(dev, PS2_MOUSE_CMD_SET_SCALE21, NULL, 0, NULL, 0)
if (ps2_dev_command(dev, PS2_CMD_MOUSE_SET_RES, val, 1, NULL, 0) != B_OK
|| ps2_dev_command(dev, PS2_CMD_MOUSE_SET_SCALE21, NULL, 0, NULL, 0)
!= B_OK
|| ps2_dev_command(dev, PS2_MOUSE_CMD_SET_SCALE21, NULL, 0, NULL, 0)
|| ps2_dev_command(dev, PS2_CMD_MOUSE_SET_SCALE21, NULL, 0, NULL, 0)
!= B_OK
|| ps2_dev_command(dev, PS2_MOUSE_CMD_SET_SCALE21, NULL, 0, NULL, 0)
|| ps2_dev_command(dev, PS2_CMD_MOUSE_SET_SCALE21, NULL, 0, NULL, 0)
!= B_OK)
return B_ERROR;
if (ps2_dev_command(dev, PS2_MOUSE_CMD_GET_INFO, NULL, 0, val, 3)
if (ps2_dev_command(dev, PS2_CMD_MOUSE_GET_INFO, NULL, 0, val, 3)
!= B_OK)
return B_ERROR;
@@ -337,12 +328,12 @@ switch_hardware_tab(ps2_dev* dev, bool on)
{
uint8 val[3];
uint8 arg = 0x00;
uint8 command = PS2_MOUSE_CMD_SET_RES;
uint8 command = PS2_CMD_MOUSE_SET_RES;
if (on) {
arg = 0x0A;
command = PS2_MOUSE_CMD_SET_RATE;
command = PS2_CMD_KEYBOARD_SET_TYPEMATIC;
}
if (ps2_dev_command(dev, PS2_MOUSE_CMD_GET_INFO, NULL, 0, val, 3) != B_OK
if (ps2_dev_command(dev, PS2_CMD_MOUSE_GET_INFO, NULL, 0, val, 3) != B_OK
|| ps2_dev_command(dev, PS2_CMD_DISABLE, NULL, 0, NULL, 0) != B_OK
|| ps2_dev_command(dev, PS2_CMD_DISABLE, NULL, 0, NULL, 0) != B_OK
|| ps2_dev_command(dev, command, &arg, 1, NULL, 0) != B_OK)
@@ -355,9 +346,9 @@ switch_hardware_tab(ps2_dev* dev, bool on)
status_t
enable_passthrough(ps2_dev* dev, bool on)
{
uint8 command = PS2_MOUSE_CMD_SET_SCALE11;
uint8 command = PS2_CMD_MOUSE_SET_SCALE11;
if (on)
command = PS2_MOUSE_CMD_SET_SCALE21;
command = PS2_CMD_MOUSE_SET_SCALE21;
if (ps2_dev_command(dev, command, NULL, 0, NULL, 0) != B_OK
|| ps2_dev_command(dev, command, NULL, 0, NULL, 0) != B_OK
@@ -438,7 +429,7 @@ alps_open(const char *name, uint32 flags, void **_cookie)
if ((sFoundModel->flags & ALPS_PASS) != 0
&& enable_passthrough(dev, true) != B_OK)
goto err4;
// switch tap mode off
if (switch_hardware_tab(dev, false) != B_OK)
goto err4;
@@ -455,7 +446,7 @@ alps_open(const char *name, uint32 flags, void **_cookie)
&& enable_passthrough(dev, false) != B_OK)
goto err4;
if (ps2_dev_command(dev, PS2_MOUSE_CMD_SET_STREAM, NULL, 0, NULL, 0) != B_OK)
if (ps2_dev_command(dev, PS2_CMD_MOUSE_SET_STREAM, NULL, 0, NULL, 0) != B_OK)
goto err4;
if (ps2_dev_command(dev, PS2_CMD_ENABLE, NULL, 0, NULL, 0) != B_OK)
@@ -633,4 +624,3 @@ device_hooks gALPSDeviceHooks = {
alps_read,
alps_write,
};
@@ -1,3 +1,10 @@
/*
* Copyright 2011, Haiku, Inc.
* Distributed under the terms of the MIT License.
*
* Authors:
* Clemens Zeidler ([email protected])
*/
#ifndef ALPS_H
#define ALPS_H
@@ -369,7 +369,7 @@ ps2_init(void)
//ps2_selftest();
// Setup the command byte with disabled keyboard and AUX interrupts
// to prevent interrupts storm on some KBCs during active multiplexing
// to prevent interrupts storm on some KBCs during active multiplexing
// activation procedure. Fixes #7635.
status = ps2_setup_command_byte(false);
if (status) {
@@ -391,8 +391,9 @@ ps2_init(void)
}
if (gActiveMultiplexingEnabled) {
if (ps2_dev_command_timeout(&ps2_device[PS2_DEVICE_MOUSE], 0xe6,
NULL, 0, NULL, 0, 100000) == B_TIMED_OUT) {
if (ps2_dev_command_timeout(&ps2_device[PS2_DEVICE_MOUSE],
PS2_CMD_MOUSE_SET_SCALE11, NULL, 0, NULL, 0, 100000)
== B_TIMED_OUT) {
INFO("ps2: accessing multiplexed mouse port 0 timed out, ignoring it!\n");
} else {
ps2_service_notify_device_added(&ps2_device[PS2_DEVICE_MOUSE]);
@@ -28,6 +28,7 @@
#else
# define INFO(x...)
#endif
#define ERROR(x...) dprintf(x)
//#define TRACE_PS2
#ifdef TRACE_PS2
@@ -48,7 +48,13 @@
#define PS2_BITS_TRANSLATE_SCANCODES 0x40
// data words
#define PS2_CMD_MOUSE_SET_SCALE11 0xe6
#define PS2_CMD_MOUSE_SET_SCALE21 0xe7
#define PS2_CMD_MOUSE_SET_RES 0xe8
#define PS2_CMD_MOUSE_GET_INFO 0xe9
#define PS2_CMD_MOUSE_SET_STREAM 0xea
#define PS2_CMD_KEYBOARD_SET_LEDS 0xed
#define PS2_CMD_MOUSE_SET_POLL 0xf0
#define PS2_CMD_KEYBOARD_SET_TYPEMATIC 0xf3
#define PS2_CMD_ECHO 0xee
#define PS2_CMD_TEST_PASSED 0xaa
@@ -56,6 +62,7 @@
#define PS2_CMD_SET_SAMPLE_RATE 0xf3
#define PS2_CMD_ENABLE 0xf4
#define PS2_CMD_DISABLE 0xf5
#define PS2_CMD_MOUSE_RESET_DIS 0xf6
#define PS2_CMD_RESET 0xff
#define PS2_CMD_RESEND 0xfe
@@ -79,6 +86,7 @@
#define PS2_PACKET_INTELLIMOUSE 4
#define PS2_PACKET_SYNAPTICS 6
#define PS2_PACKET_ALPS 6
#define PS2_PACKET_ELANTECH 6 // version 1 is only 4
#define PS2_MAX_PACKET_SIZE 6
// Should be equal to the biggest packet size
@@ -14,6 +14,7 @@
#include "ps2_service.h"
#include "ps2_alps.h"
#include "ps2_elantech.h"
#include "ps2_standard_mouse.h"
#include "ps2_synaptics.h"
#include "ps2_trackpoint.h"
@@ -88,6 +89,12 @@ ps2_dev_detect_pointing(ps2_dev *dev, device_hooks **hooks)
goto dev_found;
}
status = probe_elantech(dev);
if (status == B_OK) {
*hooks = &gElantechDeviceHooks;
goto dev_found;
}
// reset the mouse for the case that the previous probes leaf the mouse in
// a undefined state
status = ps2_reset_mouse(dev);
@@ -190,7 +197,7 @@ ps2_dev_publish(ps2_dev *dev)
if (atomic_get(&dev->flags) & PS2_FLAG_KEYB) {
status = devfs_publish_device(dev->name, &gKeyboardDeviceHooks);
} else {
// Check if this is the "pass-through" device and wait until
// Check if this is the "pass-through" device and wait until
// the parent_dev goes to enabled state. It is required to prevent
// from messing up the Synaptics command sequences in synaptics_open.
if (dev->parent_dev) {
@@ -204,7 +211,7 @@ ps2_dev_publish(ps2_dev *dev)
snooze(timeout / 20);
}
TRACE("ps2: publishing %s: parent %s is %s; wait time %" B_PRId64
"\n", dev->name, dev->parent_dev->name,
"\n", dev->name, dev->parent_dev->name,
status == B_OK ? "enabled" : "busy", system_time() - start);
}
@@ -490,3 +497,23 @@ ps2_dev_command_timeout(ps2_dev *dev, uint8 cmd, const uint8 *out,
return dev->command(dev, cmd, out, out_count, in, in_count, timeout);
}
status_t
ps2_dev_sliced_command(ps2_dev *dev, uint8 cmd)
{
if (ps2_dev_command(dev, PS2_CMD_MOUSE_SET_SCALE11) != B_OK)
return B_ERROR;
uint8 val = (cmd >> 6) & 3;
if (ps2_dev_command(dev, PS2_CMD_MOUSE_SET_RES, &val, 1) != B_OK)
return B_ERROR;
val = (cmd >> 4) & 3;
if (ps2_dev_command(dev, PS2_CMD_MOUSE_SET_RES, &val, 1) != B_OK)
return B_ERROR;
val = (cmd >> 2) & 3;
if (ps2_dev_command(dev, PS2_CMD_MOUSE_SET_RES, &val, 1) != B_OK)
return B_ERROR;
val = cmd & 3;
if (ps2_dev_command(dev, PS2_CMD_MOUSE_SET_RES, &val, 1) != B_OK)
return B_ERROR;
return B_OK;
}
@@ -76,10 +76,12 @@ void ps2_dev_exit(void);
status_t standard_command_timeout(ps2_dev *dev, uint8 cmd, const uint8 *out,
int out_count, uint8 *in, int in_count, bigtime_t timeout);
status_t ps2_dev_command(ps2_dev *dev, uint8 cmd, const uint8 *out,
int out_count, uint8 *in, int in_count);
status_t ps2_dev_command(ps2_dev *dev, uint8 cmd, const uint8 *out = NULL,
int out_count = 0, uint8 *in = NULL, int in_count = 0);
status_t ps2_dev_command_timeout(ps2_dev *dev, uint8 cmd, const uint8 *out,
int out_count, uint8 *in, int in_count, bigtime_t timeout);
status_t ps2_dev_sliced_command(ps2_dev *dev, uint8 cmd);
status_t ps2_reset_mouse(ps2_dev *dev);
@@ -0,0 +1,801 @@
/*
* Copyright 2013, Haiku, Inc.
* Distributed under the terms of the MIT License.
*
* Hardware specs taken from the linux driver, thanks a lot!
* Based on ps2_alps.c
*
* Authors:
* Jérôme Duval <korli@users.berlios.de>
*/
#include "ps2_elantech.h"
#include <stdlib.h>
#include <string.h>
#include "ps2_service.h"
static int32 generate_event(timer* timer);
const bigtime_t kEventInterval = 1000 * 50;
class EventProducer {
public:
EventProducer()
{
fFired = false;
}
status_t
FireEvent(elantech_cookie* cookie, uint8* package)
{
fCookie = cookie;
memcpy(fLastPackage, package, sizeof(uint8) * PS2_PACKET_ELANTECH);
status_t status = add_timer(&fEventTimer, &generate_event,
kEventInterval, B_ONE_SHOT_RELATIVE_TIMER);
if (status == B_OK)
fFired = true;
return status;
}
bool
CancelEvent()
{
if (!fFired)
return false;
fFired = false;
return cancel_timer(&fEventTimer);
}
void
InjectEvent()
{
if (packet_buffer_write(fCookie->ring_buffer, fLastPackage,
PS2_PACKET_ELANTECH) != PS2_PACKET_ELANTECH) {
// buffer is full, drop new data
return;
}
release_sem_etc(fCookie->sem, 1, B_DO_NOT_RESCHEDULE);
}
private:
bool fFired;
uint8 fLastPackage[PS2_PACKET_ELANTECH];
timer fEventTimer;
elantech_cookie* fCookie;
};
static EventProducer gEventProducer;
static int32
generate_event(timer* timer)
{
gEventProducer.InjectEvent();
return 0;
}
const char* kElantechPath[4] = {
"input/touchpad/ps2/elantech_0",
"input/touchpad/ps2/elantech_1",
"input/touchpad/ps2/elantech_2",
"input/touchpad/ps2/elantech_3"
};
#define ELANTECH_CMD_GET_ID 0x00
#define ELANTECH_CMD_GET_VERSION 0x01
#define ELANTECH_CMD_GET_CAPABILITIES 0x02
#define ELANTECH_CMD_GET_SAMPLE 0x03
#define ELANTECH_CMD_GET_RESOLUTION 0x04
#define ELANTECH_CMD_REGISTER_READ 0x10
#define ELANTECH_CMD_REGISTER_WRITE 0x11
#define ELANTECH_CMD_REGISTER_READWRITE 0x00
#define ELANTECH_CMD_PS2_CUSTOM_CMD 0xf8
// touchpad proportions
#define EDGE_MOTION_WIDTH 55
#define MIN_PRESSURE 0
#define REAL_MAX_PRESSURE 50
#define MAX_PRESSURE 255
#define ELANTECH_HISTORY_SIZE 256
static hardware_specs gHardwareSpecs;
static status_t
get_elantech_movement(elantech_cookie *cookie, mouse_movement *movement)
{
touch_event event;
uint8 event_buffer[PS2_PACKET_ELANTECH];
status_t status = acquire_sem_etc(cookie->sem, 1, B_CAN_INTERRUPT, 0);
if (status < B_OK)
return status;
if (!cookie->dev->active) {
TRACE("ELANTECH: read_event: Error device no longer active\n");
return B_ERROR;
}
if (packet_buffer_read(cookie->ring_buffer, event_buffer,
cookie->dev->packet_size) != cookie->dev->packet_size) {
TRACE("ELANTECH: error copying buffer\n");
return B_ERROR;
}
if (cookie->crcEnabled && (event_buffer[3] & 0x08) != 0) {
TRACE("ELANTECH: bad crc buffer\n");
return B_ERROR;
} else if (!cookie->crcEnabled && ((event_buffer[0] & 0x0c) != 0x04
|| (event_buffer[3] & 0x1c) != 0x10)) {
TRACE("ELANTECH: bad crc buffer\n");
return B_ERROR;
}
uint8 type = event_buffer[3] & 3;
TRACE("ELANTECH: packet type %d\n", type);
TRACE("ELANTECH: packet content 0x%02x%02x%02x%02x%02x%02x\n",
event_buffer[0], event_buffer[1], event_buffer[2], event_buffer[3],
event_buffer[4], event_buffer[5]);
switch (type) {
case 0:
// fingers
cookie->fingers = event_buffer[1] & 0x1f;
break;
case 1:
if ((((event_buffer[3] & 0xe0) >> 5) - 1) != 0) {
// only process first finger
return B_OK;
}
event.zPressure = (event_buffer[1] & 0xf0)
| ((event_buffer[4] & 0xf0) >> 4);
cookie->previousZ = event.zPressure;
event.xPosition = ((event_buffer[1] & 0xf) << 8) | event_buffer[2];
event.yPosition = (((event_buffer[4] & 0xf) << 8)
| event_buffer[5]);
TRACE("ELANTECH: buttons 0x%x x %ld y %ld z %d\n",
event.buttons, event.xPosition, event.yPosition,
event.zPressure);
break;
case 2:
TRACE("ELANTECH: packet type motion\n");
// TODO
return B_OK;
default:
TRACE("ELANTECH: unknown packet type %d\n", type);
return B_ERROR;
}
event.buttons = 0;
// finger on touchpad
if ((cookie->fingers & 1) != 0) {
// finger with normal width
event.wValue = 4;
} else {
event.wValue = 3;
}
status = cookie->movementMaker.EventToMovement(&event, movement);
if (cookie->movementMaker.WasEdgeMotion()
|| cookie->movementMaker.TapDragStarted()) {
gEventProducer.FireEvent(cookie, event_buffer);
}
return status;
}
static void
default_settings(touchpad_settings *set)
{
memcpy(set, &kDefaultTouchpadSettings, sizeof(touchpad_settings));
}
static status_t
synaptics_dev_send_command(ps2_dev* dev, uint8 cmd, uint8 *in, int in_count)
{
uint8 val;
if (ps2_dev_sliced_command(dev, cmd) != B_OK
|| ps2_dev_command(dev, PS2_CMD_MOUSE_GET_INFO, NULL, 0, in, in_count)
!= B_OK) {
TRACE("ELANTECH: synaptics_dev_send_command failed\n");
return B_ERROR;
}
return B_OK;
}
static status_t
elantech_dev_send_command(ps2_dev* dev, uint8 cmd, uint8 *in, int in_count)
{
uint8 val;
if (ps2_dev_command(dev, ELANTECH_CMD_PS2_CUSTOM_CMD) != B_OK
|| ps2_dev_command(dev, cmd) != B_OK
|| ps2_dev_command(dev, PS2_CMD_MOUSE_GET_INFO, NULL, 0, in, in_count)
!= B_OK) {
TRACE("ELANTECH: elantech_dev_send_command failed\n");
return B_ERROR;
}
return B_OK;
}
status_t
probe_elantech(ps2_dev* dev)
{
int i;
uint8 val[3];
TRACE("ELANTECH: probe\n");
ps2_dev_command(dev, PS2_CMD_MOUSE_RESET_DIS);
if (ps2_dev_command(dev, PS2_CMD_DISABLE) != B_OK
|| ps2_dev_command(dev, PS2_CMD_MOUSE_SET_SCALE11) != B_OK
|| ps2_dev_command(dev, PS2_CMD_MOUSE_SET_SCALE11) != B_OK
|| ps2_dev_command(dev, PS2_CMD_MOUSE_SET_SCALE11) != B_OK) {
TRACE("ELANTECH: not found (1)\n");
return B_ERROR;
}
if (ps2_dev_command(dev, PS2_CMD_MOUSE_GET_INFO, NULL, 0, val, 3)
!= B_OK) {
TRACE("ELANTECH: not found (2)\n");
return B_ERROR;
}
if (val[0] != 0x3c || val[1] != 0x3 || (val[2] != 0xc8 && val[2] != 0x0)) {
TRACE("ELANTECH: not found (3)\n");
return B_ERROR;
}
val[0] = 0;
if (synaptics_dev_send_command(dev, ELANTECH_CMD_GET_VERSION, val, 3)
!= B_OK) {
TRACE("ELANTECH: not found (4)\n");
return B_ERROR;
}
if (val[0] == 0x0 || val[2] == 10 || val[2] == 20 || val[2] == 40
|| val[2] == 60 || val[2] == 80 || val[2] == 100 || val[2] == 200) {
TRACE("ELANTECH: not found (5)\n");
return B_ERROR;
}
INFO("Elantech found\n");
dev->name = kElantechPath[dev->idx];
dev->packet_size = PS2_PACKET_ELANTECH;
return B_OK;
}
static status_t
elantech_write_reg(elantech_cookie* cookie, uint8 reg, uint8 value)
{
if (reg < 0x7 || reg > 0x26)
return B_BAD_VALUE;
if (reg > 0x11 && reg < 0x20)
return B_BAD_VALUE;
ps2_dev* dev = cookie->dev;
switch (cookie->version) {
case 1:
// TODO
return B_ERROR;
break;
case 2:
if (ps2_dev_command(dev, ELANTECH_CMD_PS2_CUSTOM_CMD) != B_OK
|| ps2_dev_command(dev, ELANTECH_CMD_REGISTER_WRITE) != B_OK
|| ps2_dev_command(dev, ELANTECH_CMD_PS2_CUSTOM_CMD) != B_OK
|| ps2_dev_command(dev, reg) != B_OK
|| ps2_dev_command(dev, ELANTECH_CMD_PS2_CUSTOM_CMD) != B_OK
|| ps2_dev_command(dev, value) != B_OK
|| ps2_dev_command(dev, PS2_CMD_MOUSE_SET_SCALE11) != B_OK)
return B_ERROR;
break;
case 3:
if (ps2_dev_command(dev, ELANTECH_CMD_PS2_CUSTOM_CMD) != B_OK
|| ps2_dev_command(dev, ELANTECH_CMD_REGISTER_READWRITE) != B_OK
|| ps2_dev_command(dev, ELANTECH_CMD_PS2_CUSTOM_CMD) != B_OK
|| ps2_dev_command(dev, reg) != B_OK
|| ps2_dev_command(dev, ELANTECH_CMD_PS2_CUSTOM_CMD) != B_OK
|| ps2_dev_command(dev, value) != B_OK
|| ps2_dev_command(dev, PS2_CMD_MOUSE_SET_SCALE11) != B_OK)
return B_ERROR;
break;
case 4:
if (ps2_dev_command(dev, ELANTECH_CMD_PS2_CUSTOM_CMD) != B_OK
|| ps2_dev_command(dev, ELANTECH_CMD_REGISTER_READWRITE) != B_OK
|| ps2_dev_command(dev, ELANTECH_CMD_PS2_CUSTOM_CMD) != B_OK
|| ps2_dev_command(dev, reg) != B_OK
|| ps2_dev_command(dev, ELANTECH_CMD_PS2_CUSTOM_CMD) != B_OK
|| ps2_dev_command(dev, ELANTECH_CMD_REGISTER_READWRITE) != B_OK
|| ps2_dev_command(dev, ELANTECH_CMD_PS2_CUSTOM_CMD) != B_OK
|| ps2_dev_command(dev, value) != B_OK
|| ps2_dev_command(dev, PS2_CMD_MOUSE_SET_SCALE11) != B_OK)
return B_ERROR;
break;
default:
TRACE("ELANTECH: read_write_reg: unknown version\n");
return B_ERROR;
}
return B_OK;
}
static status_t
elantech_read_reg(elantech_cookie* cookie, uint8 reg, uint8 *value)
{
if (reg < 0x7 || reg > 0x26)
return B_BAD_VALUE;
if (reg > 0x11 && reg < 0x20)
return B_BAD_VALUE;
ps2_dev* dev = cookie->dev;
uint8 val[3];
switch (cookie->version) {
case 1:
// TODO
return B_ERROR;
break;
case 2:
if (ps2_dev_command(dev, ELANTECH_CMD_PS2_CUSTOM_CMD) != B_OK
|| ps2_dev_command(dev, ELANTECH_CMD_REGISTER_READ) != B_OK
|| ps2_dev_command(dev, ELANTECH_CMD_PS2_CUSTOM_CMD) != B_OK
|| ps2_dev_command(dev, reg) != B_OK
|| ps2_dev_command(dev, PS2_CMD_MOUSE_GET_INFO, NULL, 0, val,
3) != B_OK)
return B_ERROR;
break;
case 3:
case 4:
if (ps2_dev_command(dev, ELANTECH_CMD_PS2_CUSTOM_CMD) != B_OK
|| ps2_dev_command(dev, ELANTECH_CMD_REGISTER_READWRITE)
!= B_OK
|| ps2_dev_command(dev, ELANTECH_CMD_PS2_CUSTOM_CMD) != B_OK
|| ps2_dev_command(dev, reg) != B_OK
|| ps2_dev_command(dev, PS2_CMD_MOUSE_GET_INFO, NULL, 0, val,
3) != B_OK)
return B_ERROR;
break;
default:
TRACE("ELANTECH: read_write_reg: unknown version\n");
return B_ERROR;
}
if (cookie->version == 4)
*value = val[1];
else
*value = val[0];
return B_OK;
}
static status_t
switch_hardware_tab(ps2_dev* dev, bool on)
{
uint8 val[3];
uint8 arg = 0x00;
uint8 command = PS2_CMD_MOUSE_SET_RES;
if (on) {
arg = 0x0A;
command = PS2_CMD_SET_SAMPLE_RATE;
}
if (ps2_dev_command(dev, PS2_CMD_MOUSE_GET_INFO, NULL, 0, val, 3) != B_OK
|| ps2_dev_command(dev, PS2_CMD_DISABLE, NULL, 0, NULL, 0) != B_OK
|| ps2_dev_command(dev, PS2_CMD_DISABLE, NULL, 0, NULL, 0) != B_OK
|| ps2_dev_command(dev, command, &arg, 1, NULL, 0) != B_OK)
return B_ERROR;
return B_OK;
}
static status_t
get_resolution_v4(elantech_cookie* cookie, uint32* x, uint32* y)
{
uint8 val[3];
if (elantech_dev_send_command(cookie->dev, ELANTECH_CMD_GET_RESOLUTION,
val, 3) != B_OK)
return B_ERROR;
*x = (val[1] & 0xf) * 10 + 790;
*y = ((val[1] & 0xf) >> 4) * 10 + 790;
return B_OK;
}
static status_t
get_range(elantech_cookie* cookie, uint32* x_min, uint32* y_min, uint32* x_max,
uint32* y_max, uint32 *width)
{
status_t status = B_OK;
uint8 val[3];
switch (cookie->version) {
case 1:
*x_min = 32;
*y_min = 32;
*x_max = 544;
*y_max = 344;
*width = 0;
break;
case 2:
// TODO
break;
case 3:
if ((cookie->send_command)(cookie->dev, ELANTECH_CMD_GET_ID, val, 3)
!= B_OK) {
return B_ERROR;
}
*x_min = 0;
*y_min = 0;
*x_max = ((val[0] & 0xf) << 8) | val[1];
*y_max = ((val[0] & 0xf0) << 4) | val[2];
*width = 0;
break;
case 4:
if ((cookie->send_command)(cookie->dev, ELANTECH_CMD_GET_ID, val, 3)
!= B_OK) {
return B_ERROR;
}
*x_min = 0;
*y_min = 0;
*x_max = ((val[0] & 0xf) << 8) | val[1];
*y_max = ((val[0] & 0xf0) << 4) | val[2];
if (cookie->capabilities[1] < 2 || cookie->capabilities[1] > *x_max)
return B_ERROR;
*width = *x_max / (cookie->capabilities[1] - 1);
break;
}
return B_OK;
}
static status_t
enable_absolute_mode(elantech_cookie* cookie)
{
status_t status = B_OK;
switch (cookie->version) {
case 1:
status = elantech_write_reg(cookie, 0x10, 0x16);
if (status == B_OK)
status = elantech_write_reg(cookie, 0x11, 0x8f);
break;
case 2:
status = elantech_write_reg(cookie, 0x10, 0x54);
if (status == B_OK)
status = elantech_write_reg(cookie, 0x11, 0x88);
if (status == B_OK)
status = elantech_write_reg(cookie, 0x12, 0x60);
break;
case 3:
status = elantech_write_reg(cookie, 0x10, 0xb);
break;
case 4:
status = elantech_write_reg(cookie, 0x7, 0x1);
break;
}
if (cookie->version < 4) {
uint8 val;
for (uint8 retry = 0; retry < 5; retry++) {
status = elantech_read_reg(cookie, 0x10, &val);
if (status != B_OK)
break;
snooze(100);
}
}
return status;
}
status_t
elantech_open(const char *name, uint32 flags, void **_cookie)
{
TRACE("ELANTECH: open %s\n", name);
ps2_dev* dev;
int i;
for (dev = NULL, i = 0; i < PS2_DEVICE_COUNT; i++) {
if (0 == strcmp(ps2_device[i].name, name)) {
dev = &ps2_device[i];
break;
}
}
if (dev == NULL) {
TRACE("ps2: dev = NULL\n");
return B_ERROR;
}
if (atomic_or(&dev->flags, PS2_FLAG_OPEN) & PS2_FLAG_OPEN)
return B_BUSY;
elantech_cookie* cookie = (elantech_cookie*)malloc(
sizeof(elantech_cookie));
if (cookie == NULL)
goto err1;
memset(cookie, 0, sizeof(*cookie));
cookie->movementMaker.Init();
cookie->previousZ = 0;
*_cookie = cookie;
cookie->dev = dev;
dev->cookie = cookie;
dev->disconnect = &elantech_disconnect;
dev->handle_int = &elantech_handle_int;
default_settings(&cookie->settings);
dev->packet_size = PS2_PACKET_ELANTECH;
cookie->ring_buffer = create_packet_buffer(
ELANTECH_HISTORY_SIZE * dev->packet_size);
if (cookie->ring_buffer == NULL) {
TRACE("ELANTECH: can't allocate mouse actions buffer\n");
goto err2;
}
// create the mouse semaphore, used for synchronization between
// the interrupt handler and the read operation
cookie->sem = create_sem(0, "ps2_elantech_sem");
if (cookie->sem < 0) {
TRACE("ELANTECH: failed creating semaphore!\n");
goto err3;
}
uint8 val[3];
if (synaptics_dev_send_command(dev, ELANTECH_CMD_GET_VERSION, val, 3)
!= B_OK) {
TRACE("ELANTECH: get version failed!\n");
goto err4;
}
cookie->fwVersion = (val[0] << 16) | (val[1] << 8) | val[2];
if (cookie->fwVersion < 0x020030 || cookie->fwVersion == 0x020600)
cookie->version = 1;
else {
switch (val[0] & 0xf) {
case 2:
case 4:
cookie->version = 2;
break;
case 5:
cookie->version = 3;
case 6:
case 7:
cookie->version = 4;
break;
default:
TRACE("ELANTECH: unknown version!\n");
goto err4;
}
}
TRACE("ELANTECH: version 0x%lx (0x%lx)\n", cookie->version,
cookie->fwVersion);
if (cookie->version >= 3)
cookie->send_command = &elantech_dev_send_command;
else
cookie->send_command = &synaptics_dev_send_command;
cookie->crcEnabled = (cookie->fwVersion & 0x4000) == 0x4000;
if ((cookie->send_command)(cookie->dev, ELANTECH_CMD_GET_CAPABILITIES,
cookie->capabilities, 3) != B_OK) {
TRACE("ELANTECH: get capabilities failed!\n");
return B_ERROR;
}
if (enable_absolute_mode(cookie) != B_OK) {
TRACE("ELANTECH: failed enabling absolute mode!\n");
goto err4;
}
TRACE("ELANTECH: enabled absolute mode!\n");
uint32 x_min, x_max, y_min, y_max, width;
if (get_range(cookie, &x_min, &y_min, &x_max, &y_max, &width) != B_OK) {
TRACE("ELANTECH: get range failed!\n");
goto err4;
}
TRACE("ELANTECH: range x %ld-%ld y %ld-%ld (%ld)\n", x_min, x_max,
y_min, y_max, width);
uint32 x_res, y_res;
if (get_resolution_v4(cookie, &x_res, &y_res) != B_OK) {
TRACE("ELANTECH: get resolution failed!\n");
goto err4;
}
TRACE("ELANTECH: resolution x %ld y %ld (dpi)\n", x_res, y_res);
gHardwareSpecs.edgeMotionWidth = EDGE_MOTION_WIDTH;
gHardwareSpecs.areaStartX = x_min;
gHardwareSpecs.areaEndX = x_max;
gHardwareSpecs.areaStartY = y_min;
gHardwareSpecs.areaEndY = y_max;
gHardwareSpecs.minPressure = MIN_PRESSURE;
gHardwareSpecs.realMaxPressure = REAL_MAX_PRESSURE;
gHardwareSpecs.maxPressure = MAX_PRESSURE;
cookie->movementMaker.SetSettings(&cookie->settings);
cookie->movementMaker.SetSpecs(&gHardwareSpecs);
if (ps2_dev_command(dev, PS2_CMD_ENABLE, NULL, 0, NULL, 0) != B_OK)
goto err4;
atomic_or(&dev->flags, PS2_FLAG_ENABLED);
TRACE("ELANTECH: open %s success\n", name);
return B_OK;
err4:
delete_sem(cookie->sem);
err3:
delete_packet_buffer(cookie->ring_buffer);
err2:
free(cookie);
err1:
atomic_and(&dev->flags, ~PS2_FLAG_OPEN);
TRACE("ELANTECH: open %s failed\n", name);
return B_ERROR;
}
status_t
elantech_close(void *_cookie)
{
gEventProducer.CancelEvent();
elantech_cookie *cookie = (elantech_cookie*)_cookie;
ps2_dev_command_timeout(cookie->dev, PS2_CMD_DISABLE, NULL, 0, NULL, 0,
150000);
delete_packet_buffer(cookie->ring_buffer);
delete_sem(cookie->sem);
atomic_and(&cookie->dev->flags, ~PS2_FLAG_OPEN);
atomic_and(&cookie->dev->flags, ~PS2_FLAG_ENABLED);
// Reset the touchpad so it generate standard ps2 packets instead of
// extended ones. If not, BeOS is confused with such packets when rebooting
// without a complete shutdown.
status_t status = ps2_reset_mouse(cookie->dev);
if (status != B_OK) {
INFO("ps2: reset failed\n");
return B_ERROR;
}
TRACE("ELANTECH: close %s done\n", cookie->dev->name);
return B_OK;
}
status_t
elantech_freecookie(void *_cookie)
{
free(_cookie);
return B_OK;
}
status_t
elantech_ioctl(void *_cookie, uint32 op, void *buffer, size_t length)
{
elantech_cookie *cookie = (elantech_cookie*)_cookie;
mouse_movement movement;
status_t status;
switch (op) {
case MS_READ:
TRACE("ELANTECH: MS_READ get event\n");
if ((status = get_elantech_movement(cookie, &movement)) != B_OK)
return status;
return user_memcpy(buffer, &movement, sizeof(movement));
case MS_IS_TOUCHPAD:
TRACE("ELANTECH: MS_IS_TOUCHPAD\n");
return B_OK;
case MS_SET_TOUCHPAD_SETTINGS:
TRACE("ELANTECH: MS_SET_TOUCHPAD_SETTINGS");
user_memcpy(&cookie->settings, buffer, sizeof(touchpad_settings));
return B_OK;
case MS_SET_CLICKSPEED:
TRACE("ELANTECH: ioctl MS_SETCLICK (set click speed)\n");
return user_memcpy(&cookie->movementMaker.click_speed, buffer,
sizeof(bigtime_t));
default:
TRACE("ELANTECH: unknown opcode: %ld\n", op);
return B_BAD_VALUE;
}
}
static status_t
elantech_read(void* cookie, off_t pos, void* buffer, size_t* _length)
{
*_length = 0;
return B_NOT_ALLOWED;
}
static status_t
elantech_write(void* cookie, off_t pos, const void* buffer, size_t* _length)
{
*_length = 0;
return B_NOT_ALLOWED;
}
int32
elantech_handle_int(ps2_dev* dev)
{
elantech_cookie* cookie = (elantech_cookie*)dev->cookie;
// we got a real event cancel the fake event
gEventProducer.CancelEvent();
uint8 val;
val = cookie->dev->history[0].data;
cookie->buffer[cookie->packet_index] = val;
cookie->packet_index++;
if (cookie->packet_index < PS2_PACKET_ELANTECH)
return B_HANDLED_INTERRUPT;
cookie->packet_index = 0;
if (packet_buffer_write(cookie->ring_buffer,
cookie->buffer, cookie->dev->packet_size)
!= cookie->dev->packet_size) {
// buffer is full, drop new data
return B_HANDLED_INTERRUPT;
}
release_sem_etc(cookie->sem, 1, B_DO_NOT_RESCHEDULE);
return B_INVOKE_SCHEDULER;
}
void
elantech_disconnect(ps2_dev *dev)
{
elantech_cookie *cookie = (elantech_cookie*)dev->cookie;
// the mouse device might not be opened at this point
INFO("ELANTECH: elantech_disconnect %s\n", dev->name);
if ((dev->flags & PS2_FLAG_OPEN) != 0)
release_sem(cookie->sem);
}
device_hooks gElantechDeviceHooks = {
elantech_open,
elantech_close,
elantech_freecookie,
elantech_ioctl,
elantech_read,
elantech_write,
};
@@ -0,0 +1,59 @@
/*
* Copyright 2013, Haiku, Inc.
* Distributed under the terms of the MIT License.
*
* The elantech_model_info struct and all the hardware specs are taken from the
* linux driver, thanks a lot!
*
* Authors:
* Jérôme Duval <korli@users.berlios.de>
*/
#ifndef _PS2_ELANTECH_H
#define _PS2_ELANTECH_H
#include <KernelExport.h>
#include <touchpad_settings.h>
#include "movement_maker.h"
#include "packet_buffer.h"
#include "ps2_dev.h"
typedef struct {
ps2_dev* dev;
sem_id sem;
struct packet_buffer* ring_buffer;
size_t packet_index;
uint8 buffer[PS2_PACKET_ELANTECH];
uint8 mode;
uint8 previousZ;
TouchpadMovement movementMaker;
touchpad_settings settings;
uint32 version;
uint32 fwVersion;
uint8 capabilities[3];
bool crcEnabled;
uint32 fingers;
status_t (*send_command)(ps2_dev* dev, uint8 cmd, uint8 *in, int in_count);
} elantech_cookie;
status_t probe_elantech(ps2_dev *dev);
status_t elantech_open(const char *name, uint32 flags, void **_cookie);
status_t elantech_close(void *_cookie);
status_t elantech_freecookie(void *_cookie);
status_t elantech_ioctl(void *_cookie, uint32 op, void *buffer, size_t length);
int32 elantech_handle_int(ps2_dev *dev);
void elantech_disconnect(ps2_dev *dev);
extern device_hooks gElantechDeviceHooks;
#endif /* _PS2_ELANTECH_H */
@@ -134,6 +134,31 @@ virtio_queue_request(virtio_queue cookie, const physical_entry *readEntry,
}
bool
virtio_queue_is_full(virtio_queue cookie)
{
VirtioQueue *queue = (VirtioQueue *)cookie;
return queue->IsFull();
}
bool
virtio_queue_is_empty(virtio_queue cookie)
{
VirtioQueue *queue = (VirtioQueue *)cookie;
return queue->IsEmpty();
}
uint16
virtio_queue_size(virtio_queue cookie)
{
VirtioQueue *queue = (VirtioQueue *)cookie;
return queue->Size();
}
// #pragma mark -
@@ -222,7 +247,10 @@ virtio_device_interface virtio_device_module = {
virtio_alloc_queues,
virtio_setup_interrupt,
virtio_queue_request,
virtio_queue_request_v
virtio_queue_request_v,
virtio_queue_is_full,
virtio_queue_is_empty,
virtio_queue_size
};
virtio_for_controller_interface virtio_for_controller_module = {
@@ -107,6 +107,7 @@ public:
bool IsFull() const { return fRingFree == 0; }
bool IsEmpty() const { return fRingFree == fRingSize; }
uint16 Size() const { return fRingSize; }
VirtioDevice* Device() { return fDevice; }
@@ -1154,7 +1154,7 @@ TRACE("build tree!\n");
static void
hda_codec_switch_init(hda_audio_group* audioGroup)
hda_audio_group_switch_init(hda_audio_group* audioGroup)
{
for (uint32 i = 0; i < audioGroup->widget_count; i++) {
hda_widget& widget = audioGroup->widgets[i];
@@ -1175,10 +1175,8 @@ hda_codec_switch_init(hda_audio_group* audioGroup)
static void
hda_codec_check_sense(hda_codec* codec, bool disable)
hda_audio_group_check_sense(hda_audio_group* audioGroup, bool disable)
{
hda_audio_group* audioGroup = codec->audio_groups[0];
for (uint32 i = 0; i < audioGroup->widget_count; i++) {
hda_widget& widget = audioGroup->widgets[i];
@@ -1233,7 +1231,8 @@ hda_codec_switch_handler(hda_codec* codec)
codec->unsol_response_read %= MAX_CODEC_UNSOL_RESPONSES;
bool disable = response & 1;
hda_codec_check_sense(codec, disable);
hda_audio_group* audioGroup = codec->audio_groups[0];
hda_audio_group_check_sense(audioGroup, disable);
}
return B_OK;
}
@@ -1285,8 +1284,8 @@ hda_codec_new_audio_group(hda_codec* codec, uint32 audioGroupNodeID)
if (hda_audio_group_build_tree(audioGroup) != B_OK)
goto err;
hda_codec_switch_init(audioGroup);
hda_audio_group_switch_init(audioGroup);
audioGroup->playback_stream = hda_stream_new(audioGroup, STREAM_PLAYBACK);
audioGroup->record_stream = hda_stream_new(audioGroup, STREAM_RECORD);
TRACE("hda: streams playback %p, record %p\n", audioGroup->playback_stream,
@@ -1295,6 +1294,7 @@ hda_codec_new_audio_group(hda_codec* codec, uint32 audioGroupNodeID)
if (audioGroup->playback_stream != NULL
|| audioGroup->record_stream != NULL) {
codec->audio_groups[codec->num_audio_groups++] = audioGroup;
hda_audio_group_check_sense(audioGroup, false);
return B_OK;
}
@@ -1527,8 +1527,6 @@ hda_codec_new(hda_controller* controller, uint32 codecAddress)
}
}
hda_codec_check_sense(codec, false);
codec->unsol_response_thread = spawn_kernel_thread(
(status_t(*)(void*))hda_codec_switch_handler,
"hda_codec_unsol_thread", B_LOW_PRIORITY, codec);
@@ -63,6 +63,9 @@ nor_init_device(void *_info, void **_cookie)
if (info->id < 0)
return info->id;
info->mapped += HIDDEN_BLOCKS * info->blocksize;
*_cookie = info;
return B_OK;
}
@@ -1,7 +1,7 @@
SubDir HAIKU_TOP src add-ons kernel drivers disk usb usb_disk ;
SubDirSysHdrs $(HAIKU_TOP) src add-ons kernel bus_managers usb ;
UsePrivateHeaders kernel ;
UsePrivateHeaders drivers kernel ;
KernelAddon usb_disk :
usb_disk.cpp
@@ -18,6 +18,7 @@
#include <fs/devfs.h>
#include "scsi_sense.h"
#include "usb_disk_scsi.h"
@@ -136,11 +137,11 @@ status_t usb_disk_receive_csw(disk_device *device,
status_t usb_disk_operation(device_lun *lun, uint8 operation,
uint8 opLength, uint32 logicalBlockAddress,
uint16 transferLength, void *data, size_t *dataLength,
bool directionIn);
bool directionIn, err_act *action = NULL);
status_t usb_disk_request_sense(device_lun *lun);
status_t usb_disk_request_sense(device_lun *lun, err_act *action);
status_t usb_disk_mode_sense(device_lun *lun);
status_t usb_disk_test_unit_ready(device_lun *lun);
status_t usb_disk_test_unit_ready(device_lun *lun, err_act *action = NULL);
status_t usb_disk_inquiry(device_lun *lun);
status_t usb_disk_reset_capacity(device_lun *lun);
status_t usb_disk_update_capacity(device_lun *lun);
@@ -265,7 +266,7 @@ usb_disk_receive_csw(disk_device *device, command_status_wrapper *status)
status_t
usb_disk_operation(device_lun *lun, uint8 operation, uint8 opLength,
uint32 logicalBlockAddress, uint16 transferLength, void *data,
size_t *dataLength, bool directionIn)
size_t *dataLength, bool directionIn, err_act *_action)
{
TRACE("operation: lun: %u; op: %u; oplen: %u; lba: %" B_PRIu32
"; tlen: %u; data: %p; dlen: %p (%lu); in: %c\n",
@@ -407,7 +408,7 @@ usb_disk_operation(device_lun *lun, uint8 operation, uint8 opLength,
" failed at the SCSI level\n", operation);
}
result = usb_disk_request_sense(lun);
result = usb_disk_request_sense(lun, _action);
return result == B_OK ? B_ERROR : result;
}
}
@@ -437,7 +438,7 @@ usb_disk_operation(device_lun *lun, uint8 operation, uint8 opLength,
status_t
usb_disk_request_sense(device_lun *lun)
usb_disk_request_sense(device_lun *lun, err_act *_action)
{
size_t dataLength = sizeof(scsi_request_sense_6_parameter);
scsi_request_sense_6_parameter parameter;
@@ -449,56 +450,42 @@ usb_disk_request_sense(device_lun *lun)
return result;
}
const char *label = NULL;
err_act action = err_act_fail;
status_t status = B_ERROR;
scsi_get_sense_asc_info((parameter.additional_sense_code << 8)
| parameter.additional_sense_code_qualifier, &label, &action,
&status);
if (parameter.sense_key > SCSI_SENSE_KEY_NOT_READY
&& parameter.sense_key != SCSI_SENSE_KEY_UNIT_ATTENTION) {
TRACE_ALWAYS("request_sense: key: 0x%02x; asc: 0x%02x; ascq: "
"0x%02x;\n", parameter.sense_key, parameter.additional_sense_code,
parameter.additional_sense_code_qualifier);
"0x%02x; %s\n", parameter.sense_key, parameter.additional_sense_code,
parameter.additional_sense_code_qualifier,
label ? label : "(unknown)");
}
switch (parameter.sense_key) {
case SCSI_SENSE_KEY_NO_SENSE:
case SCSI_SENSE_KEY_RECOVERED_ERROR:
return B_OK;
case SCSI_SENSE_KEY_HARDWARE_ERROR:
case SCSI_SENSE_KEY_MEDIUM_ERROR:
TRACE_ALWAYS("request_sense: media or hardware error\n");
return B_DEV_UNREADABLE;
case SCSI_SENSE_KEY_ILLEGAL_REQUEST:
TRACE_ALWAYS("request_sense: illegal request\n");
return B_DEV_INVALID_IOCTL;
case SCSI_SENSE_KEY_UNIT_ATTENTION:
if (parameter.additional_sense_code
!= SCSI_ASC_MEDIUM_NOT_PRESENT) {
TRACE_ALWAYS("request_sense: media changed\n");
lun->media_changed = true;
lun->media_present = true;
return B_DEV_MEDIA_CHANGED;
}
// fall through
case SCSI_SENSE_KEY_NOT_READY:
TRACE("request_sense: device not ready (asc 0x%02x ascq 0x%02x)\n",
parameter.additional_sense_code,
parameter.additional_sense_code_qualifier);
lun->media_present = false;
usb_disk_reset_capacity(lun);
return B_DEV_NOT_READY;
case SCSI_SENSE_KEY_DATA_PROTECT:
TRACE_ALWAYS("request_sense: write protected\n");
return B_READ_ONLY_DEVICE;
case SCSI_SENSE_KEY_ABORTED_COMMAND:
TRACE_ALWAYS("request_sense: command aborted\n");
return B_CANCELED;
if ((parameter.additional_sense_code == 0
&& parameter.additional_sense_code_qualifier == 0)
|| label == NULL) {
scsi_get_sense_key_info(parameter.sense_key, &label, &action, &status);
}
return B_ERROR;
if (status == B_DEV_MEDIA_CHANGED) {
lun->media_changed = true;
lun->media_present = true;
} else if (parameter.sense_key == SCSI_SENSE_KEY_UNIT_ATTENTION
&& status != B_DEV_NO_MEDIA) {
lun->media_present = true;
} else if (status == B_DEV_NOT_READY) {
lun->media_present = false;
usb_disk_reset_capacity(lun);
}
if (_action != NULL)
*_action = action;
return status;
}
@@ -524,7 +511,7 @@ usb_disk_mode_sense(device_lun *lun)
status_t
usb_disk_test_unit_ready(device_lun *lun)
usb_disk_test_unit_ready(device_lun *lun, err_act *_action)
{
// if unsupported we assume the unit is fixed and therefore always ok
if (!lun->device->tur_supported)
@@ -533,10 +520,10 @@ usb_disk_test_unit_ready(device_lun *lun)
status_t result;
if (lun->device->is_atapi) {
result = usb_disk_operation(lun, SCSI_START_STOP_UNIT_6, 6, 0, 1,
NULL, NULL, false);
NULL, NULL, false, _action);
} else {
result = usb_disk_operation(lun, SCSI_TEST_UNIT_READY_6, 6, 0, 0,
NULL, NULL, true);
NULL, NULL, true, _action);
}
if (result == B_DEV_INVALID_IOCTL) {
@@ -554,11 +541,14 @@ usb_disk_inquiry(device_lun *lun)
size_t dataLength = sizeof(scsi_inquiry_6_parameter);
scsi_inquiry_6_parameter parameter;
status_t result = B_ERROR;
err_act action = err_act_ok;
for (uint32 tries = 0; tries < 3; tries++) {
result = usb_disk_operation(lun, SCSI_INQUIRY_6, 6, 0, dataLength,
&parameter, &dataLength, true);
if (result == B_OK)
&parameter, &dataLength, true, &action);
if (result == B_OK || (action != err_act_retry
&& action != err_act_many_retries)) {
break;
}
}
if (result != B_OK) {
TRACE_ALWAYS("getting inquiry data failed: %s\n", strerror(result));
@@ -612,6 +602,7 @@ usb_disk_update_capacity(device_lun *lun)
size_t dataLength = sizeof(scsi_read_capacity_10_parameter);
scsi_read_capacity_10_parameter parameter;
status_t result = B_ERROR;
err_act action = err_act_ok;
// Retry reading the capacity up to three times. The first try might only
// yield a unit attention telling us that the device or media status
@@ -620,9 +611,11 @@ usb_disk_update_capacity(device_lun *lun)
// reads.
for (int32 i = 0; i < 3; i++) {
result = usb_disk_operation(lun, SCSI_READ_CAPACITY_10, 10, 0, 0,
&parameter, &dataLength, true);
if (result == B_OK)
&parameter, &dataLength, true, &action);
if (result == B_OK || (action != err_act_retry
&& action != err_act_many_retries)) {
break;
}
}
if (result != B_OK) {
@@ -801,10 +794,11 @@ usb_disk_device_added(usb_device newDevice, void **cookie)
// initialize this lun
result = usb_disk_inquiry(lun);
err_act action = err_act_ok;
for (uint32 tries = 0; tries < 8; tries++) {
TRACE("usb lun %"B_PRIu8" inquiry attempt %"B_PRIu32" begin\n",
i, tries);
status_t ready = usb_disk_test_unit_ready(lun);
status_t ready = usb_disk_test_unit_ready(lun, &action);
if (ready == B_OK || ready == B_DEV_NO_MEDIA) {
if (lun->device_type == B_CD)
lun->write_protected = true;
@@ -821,7 +815,8 @@ usb_disk_device_added(usb_device newDevice, void **cookie)
}
TRACE("usb lun %"B_PRIu8" inquiry attempt %"B_PRIu32" failed\n",
i, tries);
if (action != err_act_retry && action != err_act_many_retries)
break;
bigtime_t snoozeTime = 1000000 * tries;
TRACE("snoozing %"B_PRIu64" microseconds for usb lun\n",
snoozeTime);
@@ -1095,7 +1090,17 @@ usb_disk_ioctl(void *cookie, uint32 op, void *buffer, size_t length)
switch (op) {
case B_GET_MEDIA_STATUS:
{
*(status_t *)buffer = usb_disk_test_unit_ready(lun);
err_act action = err_act_ok;
for (uint32 tries = 0; tries < 3; tries++) {
status_t ready = usb_disk_test_unit_ready(lun, &action);
if (ready == B_OK || ready == B_DEV_NO_MEDIA
|| (action != err_act_retry
&& action != err_act_many_retries)) {
*(status_t *)buffer = ready;
break;
}
snooze(500000);
}
TRACE("B_GET_MEDIA_STATUS: 0x%08" B_PRIx32 "\n",
*(status_t *)buffer);
result = B_OK;
@@ -173,6 +173,7 @@ const struct supported_device {
// Redwood
{0x68da, 4, 0, RADEON_REDWOOD, CHIP_STD, "Radeon HD 5500"},
{0x68d9, 4, 0, RADEON_REDWOOD, CHIP_STD, "Radeon HD 5570"},
{0x675f, 4, 0, RADEON_REDWOOD, CHIP_STD, "Radeon HD 5570"},
{0x68b9, 4, 0, RADEON_REDWOOD, CHIP_STD, "Radeon HD 5600"},
{0x68c1, 4, 0, RADEON_REDWOOD, CHIP_STD, "Radeon HD 5650"},
{0x68d8, 4, 0, RADEON_REDWOOD, CHIP_STD, "Radeon HD 5670"},
@@ -125,8 +125,8 @@ GetInodeNames(const char** root, const char* _path)
status_t
FileSystem::Mount(FileSystem** _fs, RPC::Server* serv, const char* fsPath,
dev_t id, const MountConfiguration& configuration)
FileSystem::Mount(FileSystem** _fs, RPC::Server* serv, const char* serverName,
const char* fsPath, dev_t id, const MountConfiguration& configuration)
{
ASSERT(_fs != NULL);
ASSERT(serv != NULL);
@@ -222,23 +222,23 @@ FileSystem::Mount(FileSystem** _fs, RPC::Server* serv, const char* fsPath,
result = Inode::CreateInode(fs, fi, &inode);
if (result != B_OK)
return result;
RootInode* rootInode = reinterpret_cast<RootInode*>(inode);
fs->fRoot = rootInode;
char* name = strrchr(fsPath, '/');
if (name != NULL) {
name++;
reinterpret_cast<RootInode*>(inode)->SetName(name);
} else if (fsPath[0] != '\0')
reinterpret_cast<RootInode*>(inode)->SetName(fsPath);
else {
char* address = serv->ID().UniversalAddress();
if (address != NULL)
reinterpret_cast<RootInode*>(inode)->SetName(address);
else
reinterpret_cast<RootInode*>(inode)->SetName("NFS4 Share");
free(address);
}
char* fsName = strdup(fsPath);
if (fsName == NULL)
return B_NO_MEMORY;
for (int i = strlen(fsName) - 1; i >= 0 && fsName[i] == '/'; i--)
fsName[i] = '\0';
fs->fRoot = reinterpret_cast<RootInode*>(inode);
char* name = strrchr(fsName, '/');
if (name != NULL)
rootInode->SetName(name + 1);
else if (fsName[0] != '\0')
rootInode->SetName(fsName);
else
rootInode->SetName(serverName);
free(fsName);
fs->NFSServer()->AddFileSystem(fs);
*_fs = fs;
@@ -32,7 +32,8 @@ struct MountConfiguration {
class FileSystem : public DoublyLinkedListLinkImpl<FileSystem> {
public:
static status_t Mount(FileSystem** pfs, RPC::Server* serv,
const char* path, dev_t id,
const char* path, const char* serverName,
dev_t id,
const MountConfiguration& configuration);
~FileSystem();
@@ -74,8 +74,8 @@ CreateNFS4Server(RPC::Server* serv)
// dirtime=X - attempt revalidate directory cache not more often than each X
// seconds
static status_t
ParseArguments(const char* _args, AddressResolver** address, char** _path,
MountConfiguration* conf)
ParseArguments(const char* _args, AddressResolver** address, char** _server,
char** _path, MountConfiguration* conf)
{
if (_args == NULL)
return B_BAD_VALUE;
@@ -94,12 +94,18 @@ ParseArguments(const char* _args, AddressResolver** address, char** _path,
return B_MISMATCHED_VALUES;
*path++ = '\0';
*address = new AddressResolver(args);
if (*address == NULL)
*_server = strdup(args);
if (*_server == NULL)
return B_NO_MEMORY;
*address = new AddressResolver(args);
if (*address == NULL) {
delete *_server;
return B_NO_MEMORY;
}
*_path = strdup(path);
if (*_path == NULL) {
delete *_server;
delete *address;
return B_NO_MEMORY;
}
@@ -176,7 +182,8 @@ nfs4_mount(fs_volume* volume, const char* device, uint32 flags,
AddressResolver* resolver;
MountConfiguration config;
char* path;
result = ParseArguments(args, &resolver, &path, &config);
char* serverName;
result = ParseArguments(args, &resolver, &serverName, &path, &config);
if (result != B_OK)
return result;
MemoryDeleter pathDeleter(path);
@@ -188,7 +195,9 @@ nfs4_mount(fs_volume* volume, const char* device, uint32 flags,
return result;
FileSystem* fs;
result = FileSystem::Mount(&fs, server, path, volume->id, config);
result = FileSystem::Mount(&fs, server, serverName, path, volume->id,
config);
free(serverName);
if (result != B_OK) {
gRPCServerManager->Release(server);
return result;
+7 -4
View File
@@ -1,5 +1,5 @@
/*
* Copyright 2006-2012, Haiku, Inc. All rights reserved.
* Copyright 2006-2013, Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
@@ -288,10 +288,12 @@ NetworkStatusView::MessageReceived(BMessage* message)
{
const char* deviceName;
const char* name;
BNetworkAddress address;
if (message->FindString("device", &deviceName) == B_OK
&& message->FindString("name", &name) == B_OK) {
&& message->FindString("name", &name) == B_OK
&& message->FindFlat("address", &address) == B_OK) {
BNetworkDevice device(deviceName);
status_t status = device.JoinNetwork(name);
status_t status = device.JoinNetwork(address);
if (status != B_OK) {
BString text
= B_TRANSLATE("Could not join wireless network:\n");
@@ -467,6 +469,7 @@ NetworkStatusView::MouseDown(BPoint point)
BMessage* message = new BMessage(kMsgJoinNetwork);
message->AddString("device", wifiInterface);
message->AddString("name", network.name);
message->AddFlat("address", &network.address);
BMenuItem* item = new WirelessNetworkMenuItem(network.name,
network.signal_strength,
@@ -506,7 +509,7 @@ NetworkStatusView::_AboutRequested()
{
BAboutWindow* window = new BAboutWindow(
B_TRANSLATE_SYSTEM_NAME("NetworkStatus"), kSignature);
const char* authors[] = {
"Axel Dörfler",
"Hugo Santos",
+21
View File
@@ -50,6 +50,10 @@
# include <mach-o/arch.h>
#endif
#ifdef __HAIKU__
# include <OS.h>
#endif
#include "system.h"
#include "error.h"
#include "quote.h"
@@ -339,6 +343,23 @@ main (int argc, char **argv)
# endif
}
#endif
#ifdef __HAIKU__
{
system_info sysinfo;
get_system_info(&sysinfo);
switch (sysinfo.platform_type) {
case B_AT_CLONE_PLATFORM:
element = "x86";
break;
case B_64_BIT_PC_PLATFORM:
element = "x86_64";
break;
}
}
#endif
if (! (toprint == UINT_MAX && element == unknown))
print_element (element);
}
+468
View File
@@ -0,0 +1,468 @@
/*
* Copyright (c) 2012 Oleksandr Tymoshenko <gonzo@bluezbox.com>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $FreeBSD$
*/
/ {
#address-cells = <1>;
#size-cells = <1>;
cpus {
cpu@0 {
compatible = "arm,1176jzf-s";
};
};
SOC: axi {
compatible = "simple-bus";
#address-cells = <1>;
#size-cells = <1>;
reg = <0x20000000 0x01000000>;
ranges = <0 0x20000000 0x01000000>;
intc: interrupt-controller {
compatible = "broadcom,bcm2835-armctrl-ic",
"broadcom,bcm2708-armctrl-ic";
reg = <0xB200 0x200>;
interrupt-controller;
#interrupt-cells = <1>;
/* Bank 0
* 0: ARM_TIMER
* 1: ARM_MAILBOX
* 2: ARM_DOORBELL_0
* 3: ARM_DOORBELL_1
* 4: VPU0_HALTED
* 5: VPU1_HALTED
* 6: ILLEGAL_TYPE0
* 7: ILLEGAL_TYPE1
*/
/* Bank 1
* 0: TIMER0 16: DMA0
* 1: TIMER1 17: DMA1
* 2: TIMER2 18: VC_DMA2
* 3: TIMER3 19: VC_DMA3
* 4: CODEC0 20: DMA4
* 5: CODEC1 21: DMA5
* 6: CODEC2 22: DMA6
* 7: VC_JPEG 23: DMA7
* 8: ISP 24: DMA8
* 9: VC_USB 25: DMA9
* 10: VC_3D 26: DMA10
* 11: TRANSPOSER 27: DMA11
* 12: MULTICORESYNC0 28: DMA12
* 13: MULTICORESYNC1 29: AUX
* 14: MULTICORESYNC2 30: ARM
* 15: MULTICORESYNC3 31: VPUDMA
*/
/* Bank 2
* 0: HOSTPORT 16: SMI
* 1: VIDEOSCALER 17: GPIO0
* 2: CCP2TX 18: GPIO1
* 3: SDC 19: GPIO2
* 4: DSI0 20: GPIO3
* 5: AVE 21: VC_I2C
* 6: CAM0 22: VC_SPI
* 7: CAM1 23: VC_I2SPCM
* 8: HDMI0 24: VC_SDIO
* 9: HDMI1 25: VC_UART
* 10: PIXELVALVE1 26: SLIMBUS
* 11: I2CSPISLV 27: VEC
* 12: DSI1 28: CPG
* 13: PWA0 29: RNG
* 14: PWA1 30: VC_ARASANSDIO
* 15: CPR 31: AVSPMON
*/
};
timer {
compatible = "broadcom,bcm2835-system-timer",
"broadcom,bcm2708-system-timer";
reg = <0x3000 0x1000>;
interrupts = <8 9 10 11>;
interrupt-parent = <&intc>;
clock-frequency = <1000000>;
};
armtimer {
/* Not AMBA compatible */
compatible = "broadcom,bcm2835-sp804", "arm,sp804";
reg = <0xB400 0x24>;
interrupts = <0>;
interrupt-parent = <&intc>;
};
watchdog0 {
compatible = "broadcom,bcm2835-wdt",
"broadcom,bcm2708-wdt";
reg = <0x10001c 0x0c>; /* 0x1c, 0x20, 0x24 */
};
gpio: gpio {
compatible = "broadcom,bcm2835-gpio",
"broadcom,bcm2708-gpio";
reg = <0x200000 0xb0>;
/* Unusual arrangement of interrupts
* (determined by testing)
* 17: Bank 0 (GPIOs 0-31)
* 19: Bank 1 (GPIOs 32-53)
* 18: Bank 2
* 20: All banks (GPIOs 0-53)
*/
interrupts = <57 59 58 60>;
interrupt-parent = <&intc>;
gpio-controller;
#gpio-cells = <2>;
interrupt-controller;
#interrupt-cells = <1>;
pinctrl-names = "default";
pinctrl-0 = <&pins_reserved>;
/* Pins that can short 3.3V to GND in output mode: 46-47
* Pins used by VideoCore: 48-53
*/
broadcom,read-only = <46>, <47>, <48>, <49>, <50>,
<51>, <52>, <53>;
/* BSC0 */
pins_bsc0_a: bsc0_a {
broadcom,pins = <0>, <1>;
};
pins_bsc0_b: bsc0_b {
broadcom,pins = <28>, <29>;
};
pins_bsc0_c: bsc0_c {
broadcom,pins = <44>, <45>;
};
/* BSC1 */
pins_bsc1_a: bsc1_a {
broadcom,pins = <2>, <3>;
};
pins_bsc1_b: bsc1_b {
broadcom,pins = <44>, <45>;
};
/* GPCLK0 */
pins_gpclk0_a: gpclk0_a {
broadcom,pins = <4>;
};
pins_gpclk0_b: gpclk0_b {
broadcom,pins = <20>;
};
pins_gpclk0_c: gpclk0_c {
broadcom,pins = <32>;
};
pins_gpclk0_d: gpclk0_d {
broadcom,pins = <34>;
};
/* GPCLK1 */
pins_gpclk1_a: gpclk1_a {
broadcom,pins = <5>;
};
pins_gpclk1_b: gpclk1_b {
broadcom,pins = <21>;
};
pins_gpclk1_c: gpclk1_c {
broadcom,pins = <42>;
};
pins_gpclk1_d: gpclk1_d {
broadcom,pins = <44>;
};
/* GPCLK2 */
pins_gpclk2_a: gpclk2_a {
broadcom,pins = <6>;
};
pins_gpclk2_b: gpclk2_b {
broadcom,pins = <43>;
};
/* SPI0 */
pins_spi0_a: spi0_a {
broadcom,pins = <7>, <8>, <9>, <10>, <11>;
};
pins_spi0_b: spi0_b {
broadcom,pins = <35>, <36>, <37>, <38>, <39>;
};
/* PWM */
pins_pwm0_a: pwm0_a {
broadcom,pins = <12>;
};
pins_pwm0_b: pwm0_b {
broadcom,pins = <18>;
};
pins_pwm0_c: pwm0_c {
broadcom,pins = <40>;
};
pins_pwm1_a: pwm1_a {
broadcom,pins = <13>;
};
pins_pwm1_b: pwm1_b {
broadcom,pins = <19>;
};
pins_pwm1_c: pwm1_c {
broadcom,pins = <41>;
};
pins_pwm1_d: pwm1_d {
broadcom,pins = <45>;
};
/* UART0 */
pins_uart0_a: uart0_a {
broadcom,pins = <14>, <15>;
};
pins_uart0_b: uart0_b {
broadcom,pins = <32>, <33>;
};
pins_uart0_c: uart0_c {
broadcom,pins = <36>, <37>;
};
pins_uart0_fc_a: uart0_fc_a {
broadcom,pins = <16>, <17>;
};
pins_uart0_fc_b: uart0_fc_b {
broadcom,pins = <30>, <31>;
};
pins_uart0_fc_c: uart0_fc_c {
broadcom,pins = <39>, <38>;
};
/* PCM */
pins_pcm_a: pcm_a {
broadcom,pins = <18>, <19>, <20>, <21>;
};
pins_pcm_b: pcm_b {
broadcom,pins = <28>, <29>, <30>, <31>;
};
/* Secondary Address Bus */
pins_sm_addr_a: sm_addr_a {
broadcom,pins = <5>, <4>, <3>, <2>, <1>, <0>;
};
pins_sm_addr_b: sm_addr_b {
broadcom,pins = <33>, <32>, <31>, <30>, <29>,
<28>;
};
pins_sm_ctl_a: sm_ctl_a {
broadcom,pins = <6>, <7>;
};
pins_sm_ctl_b: sm_ctl_b {
broadcom,pins = <34>, <35>;
};
pins_sm_data_8bit_a: sm_data_8bit_a {
broadcom,pins = <8>, <9>, <10>, <11>, <12>,
<13>, <14>, <15>;
};
pins_sm_data_8bit_b: sm_data_8bit_b {
broadcom,pins = <36>, <37>, <38>, <39>, <40>,
<41>, <42>, <43>;
};
pins_sm_data_16bit: sm_data_16bit {
broadcom,pins = <16>, <17>, <18>, <19>, <20>,
<21>, <22>, <23>;
};
pins_sm_data_18bit: sm_data_18bit {
broadcom,pins = <24>, <25>;
};
/* BSCSL */
pins_bscsl: bscsl {
broadcom,pins = <18>, <19>;
};
/* SPISL */
pins_spisl: spisl {
broadcom,pins = <18>, <19>, <20>, <21>;
};
/* SPI1 */
pins_spi1: spi1 {
broadcom,pins = <16>, <17>, <18>, <19>, <20>,
<21>;
};
/* UART1 */
pins_uart1_a: uart1_a {
broadcom,pins = <14>, <15>;
};
pins_uart1_b: uart1_b {
broadcom,pins = <32>, <33>;
};
pins_uart1_c: uart1_c {
broadcom,pins = <40>, <41>;
};
pins_uart1_fc_a: uart1_fc_a {
broadcom,pins = <16>, <17>;
};
pins_uart1_fc_b: uart1_fc_b {
broadcom,pins = <30>, <31>;
};
pins_uart1_fc_c: uart1_fc_c {
broadcom,pins = <43>, <42>;
};
/* SPI2 */
pins_spi2: spi2 {
broadcom,pins = <40>, <41>, <42>, <43>, <44>,
<45>;
};
/* ARM JTAG */
pins_arm_jtag_trst: arm_jtag_trst {
broadcom,pins = <22>;
};
pins_arm_jtag_a: arm_jtag_a {
broadcom,pins = <4>, <5>, <6>, <12>, <13>;
};
pins_arm_jtag_b: arm_jtag_b {
broadcom,pins = <23>, <24>, <25>, <26>, <27>;
};
/* Reserved */
pins_reserved: reserved {
broadcom,pins = <48>, <49>, <50>, <51>, <52>,
<53>;
};
};
dma: dma {
compatible = "broadcom,bcm2835-dma",
"broadcom,bcm2708-dma";
reg = <0x7000 0x1000>, <0xE05000 0x1000>;
interrupts = <24 25 26 27 28 29 30 31 32 33 34 35 36>;
interrupt-parent = <&intc>;
broadcom,channels = <0>; /* Set by VideoCore */
};
vc_mbox: mbox {
compatible = "broadcom,bcm2835-mbox",
"broadcom,bcm2708-mbox";
reg = <0xB880 0x40>;
interrupts = <1>;
interrupt-parent = <&intc>;
/* Channels
* 0: Power
* 1: Frame buffer
* 2: Virtual UART
* 3: VCHIQ
* 4: LEDs
* 5: Buttons
* 6: Touch screen
*/
};
sdhci {
compatible = "broadcom,bcm2835-sdhci",
"broadcom,bcm2708-sdhci";
reg = <0x300000 0x100>;
interrupts = <70>;
interrupt-parent = <&intc>;
clock-frequency = <50000000>; /* Set by VideoCore */
};
uart0: uart0 {
compatible = "broadcom,bcm2835-uart",
"broadcom,bcm2708-uart", "arm,pl011",
"arm,primecell";
reg = <0x201000 0x1000>;
interrupts = <65>;
interrupt-parent = <&intc>;
clock-frequency = <3000000>; /* Set by VideoCore */
reg-shift = <2>;
};
vchiq {
compatible = "broadcom,bcm2835-vchiq";
reg = <0xB800 0x50>;
interrupts = <2>;
interrupt-parent = <&intc>;
};
usb {
compatible = "broadcom,bcm2835-usb",
"broadcom,bcm2708-usb",
"synopsys,designware-hs-otg2";
reg = <0x980000 0x20000>;
interrupts = <17>;
interrupt-parent = <&intc>;
#address-cells = <1>;
#size-cells = <0>;
};
};
};
+14
View File
@@ -0,0 +1,14 @@
/* The pxa3xx skeleton simply augments the 2xx version */
/include/ "pxa2xx.dtsi"
/ {
model = "Marvell PXA27x familiy SoC";
compatible = "marvell,pxa27x";
pxabus {
pxairq: interrupt-controller@40d00000 {
marvell,intc-priority;
marvell,intc-nr-irqs = <34>;
};
};
};
+135
View File
@@ -0,0 +1,135 @@
/*
* pxa2xx.dtsi - Device Tree Include file for Marvell PXA2xx family SoC
*
* Copyright (C) 2011 Marek Vasut <marek.vasut@gmail.com>
*
* Licensed under GPLv2 or later.
*/
/include/ "skeleton.dtsi"
/ {
model = "Marvell PXA2xx family SoC";
compatible = "marvell,pxa2xx";
interrupt-parent = <&pxairq>;
aliases {
serial0 = &ffuart;
serial1 = &btuart;
serial2 = &stuart;
serial3 = &hwuart;
/* i2c0 = &pwri2c; */
i2c1 = &pxai2c1;
};
cpus {
#address-cells = <0>;
#size-cells = <0>;
cpu {
compatible = "marvell,xscale";
device_type = "cpu";
};
};
pxabus {
compatible = "simple-bus";
#address-cells = <1>;
#size-cells = <1>;
ranges;
pxairq: interrupt-controller@40d00000 {
#interrupt-cells = <1>;
compatible = "marvell,pxa-intc";
interrupt-controller;
interrupt-parent;
marvell,intc-nr-irqs = <32>;
reg = <0x40d00000 0xd0>;
};
gpio: gpio@40e00000 {
compatible = "mrvl,pxa-gpio";
#address-cells = <0x1>;
#size-cells = <0x1>;
reg = <0x40e00000 0x10000>;
gpio-controller;
#gpio-cells = <0x2>;
interrupts = <10>;
interrupt-names = "gpio_mux";
interrupt-controller;
#interrupt-cells = <0x2>;
ranges;
gcb0: gpio@40e00000 {
reg = <0x40e00000 0x4>;
};
gcb1: gpio@40e00004 {
reg = <0x40e00004 0x4>;
};
gcb2: gpio@40e00008 {
reg = <0x40e00008 0x4>;
};
gcb3: gpio@40e0000c {
reg = <0x40e0000c 0x4>;
};
};
ffuart: uart@40100000 {
compatible = "mrvl,pxa-uart";
reg = <0x40100000 0x30>;
interrupts = <22>;
status = "disabled";
};
btuart: uart@40200000 {
compatible = "mrvl,pxa-uart";
reg = <0x40200000 0x30>;
interrupts = <21>;
status = "disabled";
};
stuart: uart@40700000 {
compatible = "mrvl,pxa-uart";
reg = <0x40700000 0x30>;
interrupts = <20>;
status = "disabled";
};
hwuart: uart@41100000 {
compatible = "mrvl,pxa-uart";
reg = <0x41100000 0x30>;
interrupts = <7>;
status = "disabled";
};
pxai2c1: i2c@40301680 {
compatible = "mrvl,pxa-i2c";
reg = <0x40301680 0x30>;
interrupts = <18>;
#address-cells = <0x1>;
#size-cells = <0>;
status = "disabled";
};
usb0: ohci@4c000000 {
compatible = "mrvl,pxa-ohci";
reg = <0x4c000000 0x10000>;
interrupts = <3>;
status = "disabled";
};
mmc0: mmc@41100000 {
compatible = "mrvl,pxa-mmc";
reg = <0x41100000 0x1000>;
interrupts = <23>;
status = "disabled";
};
rtc@40900000 {
compatible = "marvell,pxa-rtc";
reg = <0x40900000 0x3c>;
interrupts = <30 31>;
};
};
};
+381
View File
@@ -0,0 +1,381 @@
/*
* Copyright (c) 2012 Oleksandr Tymoshenko <gonzo@bluezbox.com>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $FreeBSD$
*/
/dts-v1/;
/include/ "bcm2835.dtsi"
/memreserve/ 0x08000000 0x08000000; /* Set by VideoCore */
/ {
model = "Raspberry Pi (BCM2835)";
compatible = "raspberrypi,model-a", "raspberrypi,model-b",
"broadcom,bcm2835-vc", "broadcom,bcm2708-vc";
memory {
device_type = "memory";
reg = <0 0x8000000>; /* 128MB, Set by VideoCore */
};
system {
revision = <0>; /* Set by VideoCore */
serial = <0 0>; /* Set by VideoCore */
};
axi {
gpio: gpio {
/* BSC0 */
pins_bsc0_a: bsc0_a {
broadcom,function = "ALT0";
};
pins_bsc0_b: bsc0_b {
broadcom,function = "ALT0";
};
pins_bsc0_c: bsc0_c {
broadcom,function = "ALT1";
};
/* BSC1 */
pins_bsc1_a: bsc1_a {
broadcom,function = "ALT0";
};
pins_bsc1_b: bsc1_b {
broadcom,function = "ALT2";
};
/* GPCLK0 */
pins_gpclk0_a: gpclk0_a {
broadcom,function = "ALT0";
};
pins_gpclk0_b: gpclk0_b {
broadcom,function = "ALT5";
};
pins_gpclk0_c: gpclk0_c {
broadcom,function = "ALT0";
};
pins_gpclk0_d: gpclk0_d {
broadcom,function = "ALT0";
};
/* GPCLK1 */
pins_gpclk1_a: gpclk1_a {
broadcom,function = "ALT0";
};
pins_gpclk1_b: gpclk1_b {
broadcom,function = "ALT5";
};
pins_gpclk1_c: gpclk1_c {
broadcom,function = "ALT0";
};
pins_gpclk1_d: gpclk1_d {
broadcom,function = "ALT0";
};
/* GPCLK2 */
pins_gpclk2_a: gpclk2_a {
broadcom,function = "ALT0";
};
pins_gpclk2_b: gpclk2_b {
broadcom,function = "ALT0";
};
/* SPI0 */
pins_spi0_a: spi0_a {
broadcom,function = "ALT0";
};
pins_spi0_b: spi0_b {
broadcom,function = "ALT0";
};
/* PWM */
pins_pwm0_a: pwm0_a {
broadcom,function = "ALT0";
};
pins_pwm0_b: pwm0_b {
broadcom,function = "ALT5";
};
pins_pwm0_c: pwm0_c {
broadcom,function = "ALT0";
};
pins_pwm1_a: pwm1_a {
broadcom,function = "ALT0";
};
pins_pwm1_b: pwm1_b {
broadcom,function = "ALT5";
};
pins_pwm1_c: pwm1_c {
broadcom,function = "ALT0";
};
pins_pwm1_d: pwm1_d {
broadcom,function = "ALT0";
};
/* UART0 */
pins_uart0_a: uart0_a {
broadcom,function = "ALT0";
};
pins_uart0_b: uart0_b {
broadcom,function = "ALT3";
};
pins_uart0_c: uart0_c {
broadcom,function = "ALT2";
};
pins_uart0_fc_a: uart0_fc_a {
broadcom,function = "ALT3";
};
pins_uart0_fc_b: uart0_fc_b {
broadcom,function = "ALT3";
};
pins_uart0_fc_c: uart0_fc_c {
broadcom,function = "ALT2";
};
/* PCM */
pins_pcm_a: pcm_a {
broadcom,function = "ALT0";
};
pins_pcm_b: pcm_b {
broadcom,function = "ALT2";
};
/* Secondary Address Bus */
pins_sm_addr_a: sm_addr_a {
broadcom,function = "ALT1";
};
pins_sm_addr_b: sm_addr_b {
broadcom,function = "ALT1";
};
pins_sm_ctl_a: sm_ctl_a {
broadcom,function = "ALT1";
};
pins_sm_ctl_b: sm_ctl_b {
broadcom,function = "ALT1";
};
pins_sm_data_8bit_a: sm_data_8bit_a {
broadcom,function = "ALT1";
};
pins_sm_data_8bit_b: sm_data_8bit_b {
broadcom,function = "ALT1";
};
pins_sm_data_16bit: sm_data_16bit {
broadcom,function = "ALT1";
};
pins_sm_data_18bit: sm_data_18bit {
broadcom,function = "ALT1";
};
/* BSCSL */
pins_bscsl: bscsl {
broadcom,function = "ALT3";
};
/* SPISL */
pins_spisl: spisl {
broadcom,function = "ALT3";
};
/* SPI1 */
pins_spi1: spi1 {
broadcom,function = "ALT4";
};
/* UART1 */
pins_uart1_a: uart1_a {
broadcom,function = "ALT5";
};
pins_uart1_b: uart1_b {
broadcom,function = "ALT5";
};
pins_uart1_c: uart1_c {
broadcom,function = "ALT5";
};
pins_uart1_fc_a: uart1_fc_a {
broadcom,function = "ALT5";
};
pins_uart1_fc_b: uart1_fc_b {
broadcom,function = "ALT5";
};
pins_uart1_fc_c: uart1_fc_c {
broadcom,function = "ALT5";
};
/* SPI2 */
pins_spi2: spi2 {
broadcom,function = "ALT4";
};
/* ARM JTAG */
pins_arm_jtag_trst: arm_jtag_trst {
broadcom,function = "ALT4";
};
pins_arm_jtag_a: arm_jtag_a {
broadcom,function = "ALT5";
};
pins_arm_jtag_b: arm_jtag_b {
broadcom,function = "ALT4";
};
/* Reserved */
pins_reserved: reserved {
broadcom,function = "ALT3";
};
};
usb {
hub {
compatible = "usb,hub", "usb,device";
reg = <0x00000001>;
#address-cells = <1>;
#size-cells = <0>;
ethernet {
compatible = "net,ethernet",
"usb,device";
reg = <0x00000001>;
mac-address = [00 00 00 00 00 00];
};
};
};
};
display {
compatible = "broadcom,bcm2835-fb", "broadcom,bcm2708-fb";
broadcom,vc-mailbox = <&vc_mbox>;
broadcom,vc-channel = <1>;
broadcom,width = <0>; /* Set by VideoCore */
broadcom,height = <0>; /* Set by VideoCore */
broadcom,depth = <0>; /* Set by VideoCore */
};
leds {
compatible = "gpio-leds";
ok {
label = "ok";
gpios = <&gpio 16 1>;
/* Don't change this - it configures
* how the led driver determines if
* the led is on or off when it loads.
*/
default-state = "keep";
/* This is the real default state. */
linux,default-trigger = "default-on";
};
};
power: regulator {
compatible = "broadcom,bcm2835-power-mgr",
"broadcom,bcm2708-power-mgr",
"simple-bus";
#address-cells = <1>;
#size-cells = <0>;
broadcom,vc-mailbox = <&vc_mbox>;
broadcom,vc-channel = <0>;
regulator-name = "VideoCore";
regulator-min-microvolt = <5000000>;
regulator-max-microvolt = <5000000>;
regulator-always-on = <1>;
sd_card_power: regulator@0 {
compatible = "broadcom,bcm2835-power-dev",
"broadcom,bcm2708-power-dev";
reg = <0>;
vin-supply = <&power>;
regulator-name = "SD Card";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
};
/* This is for the controller itself, not the root port */
usb_hcd_power: regulator@3 {
compatible = "broadcom,bcm2835-power-dev",
"broadcom,bcm2708-power-dev";
reg = <3>;
vin-supply = <&power>;
regulator-name = "USB HCD";
regulator-min-microvolt = <5000000>;
regulator-max-microvolt = <5000000>;
};
};
aliases {
uart0 = &uart0;
};
chosen {
bootargs = ""; /* Set by VideoCore */
stdin = "uart0";
stdout = "uart0";
};
};
+13
View File
@@ -0,0 +1,13 @@
/*
* Skeleton device tree; the bare minimum needed to boot; just include and
* add a compatible value. The bootloader will typically populate the memory
* node.
*/
/ {
#address-cells = <1>;
#size-cells = <1>;
chosen { };
aliases { };
memory { device_type = "memory"; reg = <0 0>; };
};
+41
View File
@@ -0,0 +1,41 @@
/dts-v1/;
/include/ "pxa27x.dtsi"
/ {
model = "Gumstix Verdex";
compatible = "gumstix,verdex", "marvell,pxa27x";
chosen {
bootargs = "console=ttyS0,115200 debug";
};
memory {
reg = <0xa0000000 0x10000000>;
};
pxabus {
ffuart: uart@40100000 {
status = "okay";
};
usb0: ohci@4c000000 {
status = "okay";
};
/* The devices below should be in pxa27x.dtsi, but I kept them here
so to keep the files from upstream as clean as possible for now */
lcdc: lcdc@44000000 {
compatible = "mrvl,pxa-lcdc" ;
reg = <0x44000000 0xa0> ;
interrupts = <17> ;
};
timers: timers@40a00000 {
compatible = "mrvl,pxa-timers" ;
reg = <0x40a00000 0xc0> ;
interrupts = <26>, <27>, <28>, <29>, <7> ;
interrupt-names = "OST_0", "OST_1", "OST_2", "OST_3", "OST_4_11" ;
};
};
};
@@ -863,6 +863,7 @@ ScreenSaverWindow::ScreenSaverWindow()
// Create the tab view
fTabView = new BTabView("tab_view", B_WIDTH_FROM_LABEL);
fTabView->SetBorder(B_NO_BORDER);
// Create the controls inside the tabs
fFadeView = new FadeView(B_TRANSLATE("General"), fSettings);
@@ -878,7 +879,7 @@ ScreenSaverWindow::ScreenSaverWindow()
B_ALIGN_USE_FULL_HEIGHT));
topView->SetExplicitMinSize(BSize(fMinWidth, fMinHeight));
BLayoutBuilder::Group<>(topView, B_VERTICAL)
.SetInsets(-1, B_USE_SMALL_SPACING, -1, -1)
.SetInsets(0, B_USE_SMALL_SPACING, 0, 0)
.Add(fTabView)
.End();
@@ -0,0 +1,51 @@
/*
* Copyright 2011-2012 Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* Alexander von Gluck IV, kallisti5@unixzen.com
*/
#ifndef _ARCH_FRAMEBUFFER_H
#define _ARCH_FRAMEBUFFER_H
#include <boot/platform.h>
#include <SupportDefs.h>
#define TRACE_VIDEO
#ifdef TRACE_VIDEO
# define TRACE(x...) dprintf(x)
# define CALLED() dprintf("%s()\n", __func__);
#else
# define TRACE(x...) ;
# define CALLED() ;
#endif
#define ERROR(x...) dprintf(x)
class ArchFramebuffer {
public:
ArchFramebuffer(addr_t base)
:
fBase(base) {};
~ArchFramebuffer() {};
virtual status_t Init() { return B_OK; };
virtual status_t Probe() { return B_OK; };
virtual status_t SetDefaultMode() { return B_OK; };
virtual status_t SetVideoMode(int width, int height, int depth)
{ return B_OK; };
virtual addr_t Base() { return fBase; };
protected:
addr_t fBase;
private:
int fCurrentWidth;
int fCurrentHeight;
int fCurrentDepth;
};
#endif /* _ARCH_FRAMEBUFFER_H */
+4
View File
@@ -52,6 +52,7 @@ BootMergeObject boot_platform_u-boot_common.o :
uimage.cpp
video.cpp
fdt_support.cpp
openfirmware.cpp
$(genericPlatformSources)
$(libFDTSources)
@@ -247,6 +248,9 @@ Depends haiku-mmc-image : haiku-$(HAIKU_BOOT_BOARD).mmc ;
SEARCH on [ FGristFiles $(genericPlatformSources) ]
= [ FDirName $(HAIKU_TOP) src system boot platform generic ] ;
SEARCH on [ FGristFiles openfirmware.cpp fdt_support.cpp ]
= [ FDirName $(HAIKU_TOP) src system kernel platform u-boot ] ;
SEARCH on [ FGristFiles $(libFDTSources) ]
= [ FDirName $(HAIKU_TOP) src libs libfdt ] ;
@@ -6,19 +6,27 @@ UsePrivateHeaders kernel [ FDirName kernel arch $(TARGET_KERNEL_ARCH) ]
[ FDirName kernel boot platform $(HAIKU_BOOT_PLATFORM) ] ;
UsePrivateHeaders [ FDirName kernel arch $(TARGET_KERNEL_ARCH) board $(TARGET_BOOT_BOARD) ] ;
UseLibraryHeaders [ FDirName libfdt ] ;
SubDirC++Flags -fno-rtti ;
BootMergeObject boot_platform_u-boot_ppc_amcc440.o :
arch_mmu_amcc440.cpp
: -fno-pic -mcpu=440
;
BootMergeObject boot_platform_u-boot_ppc.o :
# must come first to have _start_* at correct locations
shell.S
#arch_mmu.cpp
arch_mmu.cpp
arch_cpu_asm.S
arch_start_kernel.S
arch_cpu.cpp
#mmu.cpp
: -fno-pic
: boot_platform_u-boot_ppc_amcc440.o
;
SEARCH on [ FGristFiles arch_cpu_asm.S arch_mmu.cpp ]
SEARCH on [ FGristFiles arch_cpu_asm.S ]
= [ FDirName $(HAIKU_TOP) src system kernel arch $(TARGET_KERNEL_ARCH) ] ;
@@ -17,26 +17,142 @@
#include <boot/stage2.h>
#include <arch/cpu.h>
#include <arch/ppc/arch_cpu.h>
#include <arch/ppc/arch_platform.h>
#include <arch_kernel.h>
#include <arch_system_info.h>
#include <platform/openfirmware/devices.h>
#include <platform/openfirmware/openfirmware.h>
#include <string.h>
// TODO: try to move remaining FDT code to OF calls
extern "C" {
#include <fdt.h>
#include <libfdt.h>
#include <libfdt_env.h>
};
//#define TRACE_CPU
extern void *gFDT;
#define TRACE_CPU
#ifdef TRACE_CPU
# define TRACE(x) dprintf x
#else
# define TRACE(x) ;
#endif
//uint32 gTimeConversionFactor;
// FIXME: this is ugly; introduce a cpu type in kernel args
bool gIs440 = false;
static void
calculate_cpu_conversion_factor()
static status_t
enumerate_cpus(void)
{
#warning U-Boot:TODO!
// iterate through the "/cpus" node to find all CPUs
int cpus = of_finddevice("/cpus");
if (cpus == OF_FAILED) {
printf("enumerate_cpus(): Failed to open \"/cpus\"!\n");
return B_ERROR;
}
char cpuPath[256];
int cookie = 0;
int cpuCount = 0;
while (of_get_next_device(&cookie, cpus, "cpu", cpuPath,
sizeof(cpuPath)) == B_OK) {
TRACE(("found CPU: %s\n", cpuPath));
// For the first CPU get the frequencies of CPU, bus, and time base.
// We assume they are the same for all CPUs.
if (cpuCount == 0) {
int cpu = of_finddevice(cpuPath);
if (cpu == OF_FAILED) {
printf("enumerate_cpus: Failed get CPU device node!\n");
return B_ERROR;
}
// TODO: Does encode-int really encode quadlet (32 bit numbers)
// only?
int32 clockFrequency;
if (of_getprop(cpu, "clock-frequency", &clockFrequency, 4)
== OF_FAILED) {
printf("enumerate_cpus: Failed to get CPU clock "
"frequency!\n");
return B_ERROR;
}
int32 busFrequency = 0;
if (of_getprop(cpu, "bus-frequency", &busFrequency, 4)
== OF_FAILED) {
//printf("enumerate_cpus: Failed to get bus clock "
// "frequency!\n");
//return B_ERROR;
}
int32 timeBaseFrequency;
if (of_getprop(cpu, "timebase-frequency", &timeBaseFrequency, 4)
== OF_FAILED) {
printf("enumerate_cpus: Failed to get time base "
"frequency!\n");
return B_ERROR;
}
gKernelArgs.arch_args.cpu_frequency = clockFrequency;
gKernelArgs.arch_args.bus_frequency = busFrequency;
gKernelArgs.arch_args.time_base_frequency = timeBaseFrequency;
TRACE((" CPU clock frequency: %ld\n", clockFrequency));
//TRACE((" bus clock frequency: %ld\n", busFrequency));
TRACE((" time base frequency: %ld\n", timeBaseFrequency));
}
cpuCount++;
}
if (cpuCount == 0) {
printf("enumerate_cpus(): Found no CPUs!\n");
return B_ERROR;
}
gKernelArgs.num_cpus = cpuCount;
// FDT doesn't list bus frequency on the cpu node but on the plb node
if (gKernelArgs.arch_args.bus_frequency == 0) {
int plb = of_finddevice("/plb");
int32 busFrequency = 0;
if (of_getprop(plb, "clock-frequency", &busFrequency, 4)
== OF_FAILED) {
printf("enumerate_cpus: Failed to get bus clock "
"frequency!\n");
return B_ERROR;
}
gKernelArgs.arch_args.bus_frequency = busFrequency;
}
TRACE((" bus clock frequency: %Ld\n",
gKernelArgs.arch_args.bus_frequency));
#if 0
//XXX:Classic
// allocate the kernel stacks (the memory stuff is already initialized
// at this point)
addr_t stack = (addr_t)arch_mmu_allocate((void*)0x80000000,
cpuCount * (KERNEL_STACK_SIZE + KERNEL_STACK_GUARD_PAGES * B_PAGE_SIZE),
B_READ_AREA | B_WRITE_AREA, false);
if (!stack) {
printf("enumerate_cpus(): Failed to allocate kernel stack(s)!\n");
return B_NO_MEMORY;
}
for (int i = 0; i < cpuCount; i++) {
gKernelArgs.cpu_kstack[i].start = stack;
gKernelArgs.cpu_kstack[i].size = KERNEL_STACK_SIZE
+ KERNEL_STACK_GUARD_PAGES * B_PAGE_SIZE;
stack += KERNEL_STACK_SIZE + KERNEL_STACK_GUARD_PAGES * B_PAGE_SIZE;
}
#endif
return B_OK;
}
@@ -44,17 +160,69 @@ static status_t
check_cpu_features()
{
uint32 msr;
uint32 pvr;
bool is_440 = false;
bool is_460 = false;
bool pvr_unknown = false;
bool fdt_unknown = true;
const char *fdt_model = NULL;
#if BOARD_CPU_TYPE_PPC440
// the FPU is implemented as an Auxiliary Processing Unit,
// so we must enable transfers by setting the DAPUIB bit to 0
asm volatile(
"mfccr0 %%r3\n"
"\tlis %%r4,~(1<<(20-16))\n"
"\tand %%r3,%%r3,%%r4\n"
"\tmtccr0 %%r3"
: : : "r3", "r4");
#endif
// attempt to detect processor version, either from PVR or FDT
// TODO:someday we'll support other things than 440/460...
// read the Processor Version Register
pvr = get_pvr();
uint16 version = (uint16)(pvr >> 16);
uint16 revision = (uint16)(pvr & 0xffff);
switch (version) {
case AMCC440EP:
is_440 = true;
break;
case AMCC460EX:
is_460 = true;
break;
default:
pvr_unknown = true;
}
// if we have an FDT...
// XXX: use it only as fallback?
if (gFDT != NULL/* && pvr_unknown*/) {
// TODO: for MP support we must check /chosen/cpu first
int node = fdt_path_offset(gFDT, "/cpus/cpu@0");
int len;
fdt_model = (const char *)fdt_getprop(gFDT, node, "model", &len);
// TODO: partial match ? "PowerPC,440" && isalpha(next char) ?
if (fdt_model) {
if (!strcmp(fdt_model, "PowerPC,440EP")) {
is_440 = true;
fdt_unknown = false;
} else if (!strcmp(fdt_model, "PowerPC,460EX")) {
is_460 = true;
fdt_unknown = false;
}
}
}
if (is_460)
is_440 = true;
gIs440 = is_440;
// some cpu-dependent tweaking
if (is_440) {
// the FPU is implemented as an Auxiliary Processing Unit,
// so we must enable transfers by setting the DAPUIB bit to 0
asm volatile(
"mfccr0 %%r3\n"
"\tlis %%r4,~(1<<(20-16))\n"
"\tand %%r3,%%r3,%%r4\n"
"\tmtccr0 %%r3"
: : : "r3", "r4");
}
// we do need an FPU for vsnprintf to work
// on Sam460ex at least U-Boot doesn't enable the FPU for us
@@ -68,6 +236,11 @@ check_cpu_features()
return B_ERROR;
}
TRACE(("CPU detection:\n"));
TRACE(("PVR revision %sknown: 0x%8lx\n", pvr_unknown ? "un" : "", pvr));
TRACE(("FDT model %sknown: %s\n", fdt_unknown ? "un" : "", fdt_model));
TRACE(("flags: %s440 %s460\n", is_440 ? "" : "!", is_460 ? "" : "!"));
return B_OK;
}
@@ -92,6 +265,11 @@ arch_spin(bigtime_t microseconds)
extern "C" status_t
boot_arch_cpu_init(void)
{
// This is U-Boot
gKernelArgs.arch_args.platform = PPC_PLATFORM_U_BOOT;
// first check some features
// including some necessary for dprintf()...
status_t err = check_cpu_features();
if (err != B_OK) {
@@ -99,10 +277,8 @@ boot_arch_cpu_init(void)
return err;
}
calculate_cpu_conversion_factor();
gKernelArgs.num_cpus = 1;
// this will eventually be corrected later on
// now enumerate correctly all CPUs and get system frequencies
enumerate_cpus();
return B_OK;
}
@@ -0,0 +1,425 @@
/*
* Copyright 2004-2008, Axel Dörfler, axeld@pinc-software.de.
* Based on code written by Travis Geiselbrecht for NewOS.
*
* Distributed under the terms of the MIT License.
*/
#include "mmu.h"
#include <boot/platform.h>
#include <boot/stdio.h>
#include <boot/kernel_args.h>
#include <boot/stage2.h>
#include <arch/cpu.h>
#include <arch_kernel.h>
#include <platform/openfirmware/openfirmware.h>
#ifdef __ARM__
#include <arm_mmu.h>
#endif
#include <kernel.h>
#include <board_config.h>
#include <OS.h>
#include <string.h>
/*! This implements boot loader mmu support for Book-E PowerPC,
which only support a limited number of TLB and no hardware page table walk,
and does not standardize at how to use the mmu, requiring vendor-specific
code.
Like Linux, we pin one of the TLB entries to a fixed translation,
however we use it differently.
cf. http://kernel.org/doc/ols/2003/ols2003-pages-340-350.pdf
This translation uses a single large page (16 or 256MB are possible) which
directly maps the begining of the RAM.
We use it as a linear space to allocate from at boot time,
loading the kernel and modules into it, and other required data.
Near the end we reserve a page table (it doesn't need to be aligned),
but unlike Linux we use the same globally hashed page table that is
implemented by Classic PPC, to allow reusing code if possible, and also
to limit fragmentation which would occur by using a tree-based page table.
However this means we might actually run out of page table entries in case
of too many collisions.
The kernel will then create areas to cover this already-mapped space.
This also means proper permission bits (RWX) will not be applicable to
separate areas which are enclosed by this mapping.
We put the kernel stack at the end of the mapping so that the guard page is
outsite and thus unmapped. (we don't support SMP)
*/
/*! The (physical) memory layout of the boot loader is currently as follows:
0x00000000 kernel
0x00400000 ...modules
(at least on the Sam460ex U-Boot; we'll need to accomodate other setups)
0x01000000 boot loader
0x01800000 Flattened Device Tree
0x01900000 boot.tgz (= ramdisk)
0x02000000 boot loader uimage
boot loader heap (should be discarded later on)
... 256M-Kstack page hash table
... 256M kernel stack
kernel stack guard page
The kernel is mapped at KERNEL_BASE, all other stuff mapped by the
loader (kernel args, modules, driver settings, ...) comes after
0x80040000 which means that there is currently only 4 MB reserved for
the kernel itself (see kMaxKernelSize). FIXME: downsize kernel_ppc
*/
int32 of_address_cells(int package);
int32 of_size_cells(int package);
extern bool gIs440;
// XXX:use a base class for Book-E support?
extern status_t arch_mmu_setup_pinned_tlb_amcc440(phys_addr_t totalRam,
size_t &tableSize, size_t &tlbSize);
#define TRACE_MMU
#ifdef TRACE_MMU
# define TRACE(x) dprintf x
#else
# define TRACE(x) ;
#endif
#define TRACE_MEMORY_MAP
// Define this to print the memory map to serial debug.
static const size_t kMaxKernelSize = 0x400000; // 4 MB for the kernel
static addr_t sNextPhysicalAddress = kMaxKernelSize; //will be set by mmu_init
static addr_t sNextVirtualAddress = KERNEL_BASE + kMaxKernelSize;
//static addr_t sMaxVirtualAddress = KERNEL_BASE + kMaxKernelSize;
// working page directory and page table
static void *sPageTable = 0 ;
static addr_t
get_next_virtual_address(size_t size)
{
addr_t address = sNextVirtualAddress;
sNextPhysicalAddress += size;
sNextVirtualAddress += size;
return address;
}
static addr_t
get_next_physical_address(size_t size)
{
addr_t address = sNextPhysicalAddress;
sNextPhysicalAddress += size;
sNextVirtualAddress += size;
return address;
}
// #pragma mark -
extern "C" addr_t
mmu_map_physical_memory(addr_t physicalAddress, size_t size, uint32 flags)
{
panic("WRITEME");
return 0;
}
/*! Sets up the final and kernel accessible GDT and IDT tables.
BIOS calls won't work any longer after this function has
been called.
*/
extern "C" void
mmu_init_for_kernel(void)
{
TRACE(("mmu_init_for_kernel\n"));
// TODO: remove all U-Boot TLB
#ifdef TRACE_MEMORY_MAP
{
uint32 i;
dprintf("phys memory ranges:\n");
for (i = 0; i < gKernelArgs.num_physical_memory_ranges; i++) {
dprintf(" base 0x%"B_PRIxPHYSADDR
", length 0x%"B_PRIxPHYSADDR"\n",
gKernelArgs.physical_memory_range[i].start,
gKernelArgs.physical_memory_range[i].size);
}
dprintf("allocated phys memory ranges:\n");
for (i = 0; i < gKernelArgs.num_physical_allocated_ranges; i++) {
dprintf(" base 0x%"B_PRIxPHYSADDR
", length 0x%"B_PRIxPHYSADDR"\n",
gKernelArgs.physical_allocated_range[i].start,
gKernelArgs.physical_allocated_range[i].size);
}
dprintf("allocated virt memory ranges:\n");
for (i = 0; i < gKernelArgs.num_virtual_allocated_ranges; i++) {
dprintf(" base 0x%"B_PRIxPHYSADDR
", length 0x%"B_PRIxPHYSADDR"\n",
gKernelArgs.virtual_allocated_range[i].start,
gKernelArgs.virtual_allocated_range[i].size);
}
}
#endif
}
//TODO:move this to generic/ ?
static status_t
find_physical_memory_ranges(phys_addr_t &total)
{
int memory = -1;
int package;
dprintf("checking for memory...\n");
if (of_getprop(gChosen, "memory", &memory, sizeof(int)) == OF_FAILED)
package = of_finddevice("/memory");
else
package = of_instance_to_package(memory);
if (package == OF_FAILED)
return B_ERROR;
total = 0;
// Memory base addresses are provided in 32 or 64 bit flavors
// #address-cells and #size-cells matches the number of 32-bit 'cells'
// representing the length of the base address and size fields
int root = of_finddevice("/");
int32 regAddressCells = of_address_cells(root);
int32 regSizeCells = of_size_cells(root);
if (regAddressCells == OF_FAILED || regSizeCells == OF_FAILED) {
dprintf("finding base/size length counts failed, assume 32-bit.\n");
regAddressCells = 1;
regSizeCells = 1;
}
// NOTE : Size Cells of 2 is possible in theory... but I haven't seen it yet.
if (regAddressCells > 2 || regSizeCells > 1) {
panic("%s: Unsupported OpenFirmware cell count detected.\n"
"Address Cells: %" B_PRId32 "; Size Cells: %" B_PRId32
" (CPU > 64bit?).\n", __func__, regAddressCells, regSizeCells);
return B_ERROR;
}
// On 64-bit PowerPC systems (G5), our mem base range address is larger
if (regAddressCells == 2) {
struct of_region<uint64> regions[64];
int count = of_getprop(package, "reg", regions, sizeof(regions));
if (count == OF_FAILED)
count = of_getprop(memory, "reg", regions, sizeof(regions));
if (count == OF_FAILED)
return B_ERROR;
count /= sizeof(regions[0]);
for (int32 i = 0; i < count; i++) {
if (regions[i].size <= 0) {
dprintf("%ld: empty region\n", i);
continue;
}
dprintf("%" B_PRIu32 ": base = %" B_PRIu64 ","
"size = %" B_PRIu32 "\n", i, regions[i].base, regions[i].size);
total += regions[i].size;
if (insert_physical_memory_range((addr_t)regions[i].base,
regions[i].size) != B_OK) {
dprintf("cannot map physical memory range "
"(num ranges = %" B_PRIu32 ")!\n",
gKernelArgs.num_physical_memory_ranges);
return B_ERROR;
}
}
return B_OK;
}
// Otherwise, normal 32-bit PowerPC G3 or G4 have a smaller 32-bit one
struct of_region<uint32> regions[64];
int count = of_getprop(package, "reg", regions, sizeof(regions));
if (count == OF_FAILED)
count = of_getprop(memory, "reg", regions, sizeof(regions));
if (count == OF_FAILED)
return B_ERROR;
count /= sizeof(regions[0]);
for (int32 i = 0; i < count; i++) {
if (regions[i].size <= 0) {
dprintf("%ld: empty region\n", i);
continue;
}
dprintf("%" B_PRIu32 ": base = %" B_PRIu32 ","
"size = %" B_PRIu32 "\n", i, regions[i].base, regions[i].size);
total += regions[i].size;
if (insert_physical_memory_range((addr_t)regions[i].base,
regions[i].size) != B_OK) {
dprintf("cannot map physical memory range "
"(num ranges = %" B_PRIu32 ")!\n",
gKernelArgs.num_physical_memory_ranges);
return B_ERROR;
}
}
return B_OK;
}
extern "C" void
mmu_init(void)
{
size_t tableSize, tlbSize;
status_t err;
TRACE(("mmu_init\n"));
// get map of physical memory (fill in kernel_args structure)
phys_addr_t total;
if (find_physical_memory_ranges(total) != B_OK) {
dprintf("Error: could not find physical memory ranges!\n");
return /*B_ERROR*/;
}
dprintf("total physical memory = %" B_PRId64 "MB\n", total / (1024 * 1024));
// XXX: ugly, and wrong, there are several 440 mmu types... FIXME
if (gIs440) {
err = arch_mmu_setup_pinned_tlb_amcc440(total, tableSize, tlbSize);
dprintf("setup_pinned_tlb: 0x%08lx table %zdMB tlb %zdMB\n",
err, tableSize / (1024 * 1024), tlbSize / (1024 * 1024));
} else {
panic("Unknown MMU type!");
return;
}
// remember the start of the allocated physical pages
gKernelArgs.physical_allocated_range[0].start
= gKernelArgs.physical_memory_range[0].start;
gKernelArgs.physical_allocated_range[0].size = tlbSize;
gKernelArgs.num_physical_allocated_ranges = 1;
// Save the memory we've virtually allocated (for the kernel and other
// stuff)
gKernelArgs.virtual_allocated_range[0].start = KERNEL_BASE;
gKernelArgs.virtual_allocated_range[0].size
= tlbSize + KERNEL_STACK_GUARD_PAGES * B_PAGE_SIZE;
gKernelArgs.num_virtual_allocated_ranges = 1;
sPageTable = (void *)(tlbSize - tableSize - KERNEL_STACK_SIZE);
// we put the page table near the end of the pinned TLB
TRACE(("page table at 0x%p to 0x%p\n", sPageTable,
(uint8 *)sPageTable + tableSize));
// map in a kernel stack
gKernelArgs.cpu_kstack[0].start = (addr_t)(tlbSize - KERNEL_STACK_SIZE);
gKernelArgs.cpu_kstack[0].size = KERNEL_STACK_SIZE
+ KERNEL_STACK_GUARD_PAGES * B_PAGE_SIZE;
TRACE(("kernel stack at 0x%Lx to 0x%Lx\n", gKernelArgs.cpu_kstack[0].start,
gKernelArgs.cpu_kstack[0].start + gKernelArgs.cpu_kstack[0].size));
#ifdef __ARM__
init_page_directory();
// map the page directory on the next vpage
gKernelArgs.arch_args.vir_pgdir = mmu_map_physical_memory(
(addr_t)sPageDirectory, MMU_L1_TABLE_SIZE, kDefaultPageFlags);
#endif
}
// #pragma mark -
extern "C" status_t
platform_allocate_region(void **_address, size_t size, uint8 protection,
bool /*exactAddress*/)
{
TRACE(("platform_allocate_region(&%p, %zd)\n", *_address, size));
//get_next_virtual_address
size = (size + B_PAGE_SIZE - 1) / B_PAGE_SIZE * B_PAGE_SIZE;
// roundup to page size for clarity
if (*_address != NULL) {
// This special path is almost only useful for loading the
// kernel into memory; it will only allow you to map the
// 'kMaxKernelSize' bytes following the kernel base address.
// Also, it won't check for already mapped addresses, so
// you better know why you are here :)
addr_t address = (addr_t)*_address;
// is the address within the valid range?
if (address < KERNEL_BASE
|| address + size >= KERNEL_BASE + kMaxKernelSize) {
TRACE(("mmu_allocate in illegal range\n address: %lx"
" KERNELBASE: %lx KERNEL_BASE + kMaxKernelSize: %lx"
" address + size : %lx \n", (uint32)address, KERNEL_BASE,
KERNEL_BASE + kMaxKernelSize, (uint32)(address + size)));
return B_ERROR;
}
TRACE(("platform_allocate_region: allocated %zd bytes at %08lx\n", size,
address));
return B_OK;
}
void *address = (void *)get_next_virtual_address(size);
if (address == NULL)
return B_NO_MEMORY;
TRACE(("platform_allocate_region: allocated %zd bytes at %p\n", size,
address));
*_address = address;
return B_OK;
}
extern "C" status_t
platform_free_region(void *address, size_t size)
{
TRACE(("platform_free_region(%p, %zd)\n", address, size));
#ifdef __ARM__
mmu_free(address, size);
#endif
return B_OK;
}
void
platform_release_heap(struct stage2_args *args, void *base)
{
//XXX
// It will be freed automatically, since it is in the
// identity mapped region, and not stored in the kernel's
// page tables.
}
status_t
platform_init_heap(struct stage2_args *args, void **_base, void **_top)
{
// the heap is put right before the pagetable
void *heap = (uint8 *)sPageTable - args->heap_size;
//FIXME: use phys addresses to allow passing args to U-Boot?
*_base = heap;
*_top = (void *)((int8 *)heap + args->heap_size);
TRACE(("boot heap at 0x%p to 0x%p\n", *_base, *_top));
return B_OK;
}
@@ -0,0 +1,180 @@
/*
* Copyright 2004-2008, Axel Dörfler, axeld@pinc-software.de.
* Based on code written by Travis Geiselbrecht for NewOS.
*
* Distributed under the terms of the MIT License.
*/
#include "mmu.h"
#include <boot/platform.h>
#include <boot/stdio.h>
#include <boot/kernel_args.h>
#include <boot/stage2.h>
#include <arch/cpu.h>
#include <arch/ppc/arch_mmu_amcc440.h>
#include <arch_kernel.h>
#include <platform/openfirmware/openfirmware.h>
#ifdef __ARM__
#include <arm_mmu.h>
#endif
#include <kernel.h>
#include <board_config.h>
#include <OS.h>
#include <string.h>
int32 of_address_cells(int package);
int32 of_size_cells(int package);
#define TRACE_MMU
#ifdef TRACE_MMU
# define TRACE(x) dprintf x
#else
# define TRACE(x) ;
#endif
/*! Computes the recommended minimal page table size as
described in table 7-22 of the PowerPC "Programming
Environment for 32-Bit Microprocessors".
The page table size ranges from 64 kB (for 8 MB RAM)
to 32 MB (for 4 GB RAM).
FIXME: account for larger TLB descriptors for Book-E
*/
static size_t
suggested_page_table_size(phys_addr_t total)
{
uint32 max = 23;
// 2^23 == 8 MB
while (max < 32) {
if (total <= (1UL << max))
break;
max++;
}
return 1UL << (max - 7);
// 2^(23 - 7) == 64 kB
}
static void
read_TLB(int i, uint32 tlb[3], uint8 &pid)
{
//FIXME:read pid too
asm volatile(
"tlbre %0,%3,0\n"
"\ttlbre %1,%3,1\n"
"\ttlbre %2,%3,2"
: "=r"(tlb[0]),
"=r"(tlb[1]),
"=r"(tlb[2])
: "r"(i)
);
}
static void
write_TLB(int i, uint32 tlb[3], uint8 pid)
{
//FIXME:write pid too
asm volatile(
"tlbwe %0,%3,0\n"
"\ttlbwe %1,%3,1\n"
"\ttlbwe %2,%3,2"
: : "r"(tlb[0]),
"r"(tlb[1]),
"r"(tlb[2]),
"r"(i)
);
}
static void
dump_TLBs(void)
{
int i;
for (i = 0; i < TLB_COUNT; i++) {
uint32 tlb[3];// = { 0, 0, 0 };
uint8 pid;
read_TLB(i, tlb, pid);
dprintf("TLB[%02d]: %08lx %08lx %08lx %02x\n",
i, tlb[0], tlb[1], tlb[2], pid);
}
}
status_t
arch_mmu_setup_pinned_tlb_amcc440(phys_addr_t totalRam, size_t &tableSize,
size_t &tlbSize)
{
dump_TLBs();
tlb_length tlbLength = TLB_LENGTH_16MB;
//XXX:totalRam = 4LL*1024*1024*1024;
size_t suggestedTableSize = suggested_page_table_size(totalRam);
dprintf("suggested page table size = %" B_PRIuSIZE "\n",
suggestedTableSize);
tableSize = suggestedTableSize;
// add 4MB for kernel and some more for modules...
tlbSize = tableSize + 8 * 1024 * 1024;
// round up to realistic TLB lengths, either 16MB or 256MB
// the unused space will be filled with SLAB areas
if (tlbSize < 16 * 1024 * 1024)
tlbSize = 16 * 1024 * 1024;
else {
tlbSize = 256 * 1024 * 1024;
tlbLength = TLB_LENGTH_256MB;
}
uint32 tlb[3];
uint8 pid;
int i;
// Make sure the last TLB is free, else we are in trouble
// XXX: allow using a different TLB entry?
read_TLB(TLB_COUNT - 1, tlb, pid);
if ((tlb[0] & TLB_V) != 0) {
panic("Last TLB already in use. FIXME.");
return B_ERROR;
}
// TODO: remove existing mapping from U-Boot at KERNEL_BASE !!!
// (on Sam460ex it's pci mem)
// for now we just move it to AS1 which we don't use, until calling
// the kernel.
// we could probably swap it with our own KERNEL_BASE TLB to call U-Boot
// if required, but it'd be quite ugly.
for (i = 0; i < TLB_COUNT; i++) {
read_TLB(i, tlb, pid);
//dprintf("tlb[%d][0] = %08lx\n", i, tlb[0]);
// TODO: make the test more complete and correct
if ((tlb[0] & 0xfffffc00) == KERNEL_BASE) {
tlb[0] |= 0x100; // AS1
write_TLB(i, tlb, pid);
dprintf("Moved existing translation in TLB[%d] to AS1\n", i);
}
}
// pin the last TLB
//XXX:also maybe skip the FDT + initrd + loader ?
phys_addr_t physBase = gKernelArgs.physical_memory_range[0].start;
//TODO:make sure 1st range is large enough?
i = TLB_COUNT - 1; // last one
pid = 0; // the kernel's PID
tlb[0] = (KERNEL_BASE | tlbLength << 4 | TLB_V);
tlb[1] = ((physBase & 0xfffffc00) | (physBase >> 32));
tlb[2] = (0x0000003f); // user:RWX kernel:RWX
write_TLB(i, tlb, pid);
return B_OK;
}
@@ -3,7 +3,8 @@
* All rights reserved. Distributed under the terms of the MIT License.
*/
#define FUNCTION(x) .global x; .type x,@function; x
#include <asm_defs.h>
/* status_t arch_start_kernel(struct kernel_args *kernelArgs,
addr_t kernelEntry, addr_t kernelStackTop);
@@ -46,4 +47,5 @@ FUNCTION(arch_start_kernel):
mtlr %r0
addi %r1, %r1, 32
blr
FUNCTION_END(arch_start_kernel)
@@ -45,10 +45,12 @@ static SerialConsole sSerial;
FILE *stdin, *stdout, *stderr;
/*
static void
scroll_up()
{
}
*/
// #pragma mark -
+1 -1
View File
@@ -30,7 +30,7 @@ platform_add_boot_device(struct stage2_args *args, NodeList *devicesList)
if (!args->platform.boot_tgz_data || !args->platform.boot_tgz_size)
return B_DEVICE_NOT_FOUND;
TRACE("Memory Disk at: %lx size: %lx\n", args->platform.boot_tgz_data,
TRACE("Memory Disk at: %p size: %lx\n", args->platform.boot_tgz_data,
args->platform.boot_tgz_size);
MemoryDisk* disk = new(nothrow) MemoryDisk(
+3 -76
View File
@@ -24,6 +24,8 @@ extern "C" {
};
extern "C" DebugUART *debug_uart_from_fdt(const void *fdt);
DebugUART* gUART;
static int32 sSerialEnabled = 0;
@@ -96,86 +98,11 @@ serial_cleanup(void)
}
static void
serial_init_fdt(const void *fdt)
{
const char *name;
const char *type;
int node;
int len;
phys_addr_t regs;
int32 clock = 0;
int32 speed = 0;
const void *prop;
if (fdt == NULL)
return;
name = fdt_get_alias(fdt, "serial");
if (name == NULL)
name = fdt_get_alias(fdt, "serial0");
if (name == NULL)
name = fdt_get_alias(fdt, "serial1");
// TODO: else use /chosen linux,stdout-path
if (name == NULL)
return;
node = fdt_path_offset(fdt, name);
//dprintf("serial: using '%s', node %d\n", name, node);
if (node < 0)
return;
type = (const char *)fdt_getprop(fdt, node, "device_type", &len);
//dprintf("serial: type: '%s'\n", type);
if (type == NULL || strcmp(type, "serial"))
return;
// determine the MMIO address
// TODO: ppc640 use 64bit addressing, but U-Boot seems to map it below 4G,
// and the FDT is not very clear. libfdt is also getting 64bit addr support.
// so FIXME someday.
prop = fdt_getprop(fdt, node, "virtual-reg", &len);
if (prop && len == 4) {
regs = fdt32_to_cpu(*(uint32_t *)prop);
//dprintf("serial: virtual-reg 0x%08llx\n", (int64)regs);
} else {
prop = fdt_getprop(fdt, node, "reg", &len);
if (prop && len >= 4) {
regs = fdt32_to_cpu(*(uint32_t *)prop);
//dprintf("serial: reg 0x%08llx\n", (int64)regs);
} else
return;
}
// get the UART clock rate
prop = fdt_getprop(fdt, node, "clock-frequency", &len);
if (prop && len == 4) {
clock = fdt32_to_cpu(*(uint32_t *)prop);
//dprintf("serial: clock %ld\n", clock);
}
// get current speed (XXX: not yet passed over)
prop = fdt_getprop(fdt, node, "current-speed", &len);
if (prop && len == 4) {
speed = fdt32_to_cpu(*(uint32_t *)prop);
//dprintf("serial: speed %ld\n", speed);
}
if (fdt_node_check_compatible(fdt, node, "ns16550a") == 1
|| fdt_node_check_compatible(fdt, node, "ns16550") == 1) {
gUART = arch_get_uart_8250(regs, clock);
//dprintf("serial: using 8250\n");
return;
}
}
extern "C" void
serial_init(const void *fdt)
{
// first try with hints from the FDT
serial_init_fdt(fdt);
gUART = debug_uart_from_fdt(fdt);
#ifdef BOARD_UART_DEBUG
// fallback to hardcoded board UART
+11 -1
View File
@@ -18,6 +18,7 @@
#include <boot/stage2.h>
#include <arch/cpu.h>
#include <platform_arch.h>
#include <platform/openfirmware/openfirmware.h>
#include <string.h>
@@ -104,6 +105,12 @@ platform_start_kernel(void)
addr_t stackTop
= gKernelArgs.cpu_kstack[0].start + gKernelArgs.cpu_kstack[0].size;
if (gFDT) {
// clone the Flattened Device Tree blob
gKernelArgs.platform_args.fdt = kernel_args_malloc(fdt_totalsize(gFDT));
memcpy(gKernelArgs.platform_args.fdt, gFDT, fdt_totalsize(gFDT));
}
// smp_init_other_cpus();
serial_cleanup();
mmu_init_for_kernel();
@@ -114,7 +121,7 @@ platform_start_kernel(void)
status_t error = arch_start_kernel(&gKernelArgs, kernelEntry,
stackTop);
panic("kernel returned!\n");
panic("kernel returned %lx!\n", error);
}
@@ -190,6 +197,9 @@ start_raw(int argc, const char **argv)
serial_init(gFDT);
console_init();
// initialize the OpenFirmware wrapper
of_init(NULL);
cpu_init();
if (args.platform.fdt_data) {
+3 -2
View File
@@ -10,10 +10,8 @@ SEARCH_SOURCE += [ FDirName $(SUBDIR) paging 32bit ] ;
SEARCH_SOURCE += [ FDirName $(SUBDIR) $(DOTDOT) generic ] ;
KernelMergeObject kernel_arch_arm.o :
# arch_atomic.c
arch_commpage.cpp
arch_cpu.cpp
# arch_cpu_asm.S
arch_debug_console.cpp
arch_debug.cpp
arch_elf.cpp
@@ -33,6 +31,9 @@ KernelMergeObject kernel_arch_arm.o :
arch_uart_8250.cpp
arch_uart_pl011.cpp
arch_atomic64.cpp
arch_atomic32.cpp
# paging
arm_physical_page_mapper.cpp
arm_physical_page_mapper_large_memory.cpp
+34 -26
View File
@@ -82,21 +82,32 @@ FUNCTION(arm_context_switch):
bx lr
FUNCTION_END(arm_context_switch)
/* addr_t arm_get_fsr(void); */
FUNCTION(arm_get_fsr):
mrc p15, 0, r0, c5, c0, 0 @ get FSR
bx lr
FUNCTION_END(arm_get_fsr)
/* addr_t arm_get_far(void); */
FUNCTION(arm_get_far):
mrc p15, 0, r0, c6, c0, 0 @ get FAR
bx lr
FUNCTION_END(arm_get_far)
/* addr_t arm_get_fp(void); */
FUNCTION(arm_get_fp):
mov r0, fp @ get framepointer
bx lr
FUNCTION_END(arm_get_fp);
/* status_t arch_cpu_user_memcpy(void *to, const void *from, size_t size, addr_t *faultHandler) */
FUNCTION(arch_cpu_user_memcpy):
stmfd sp!, { r4-r6 }
stmfd sp!, { r4-r6, lr }
ldr r6, [r3]
ldr r4, =.L_user_memcpy_error
str r4, [r3] /* set fault handler */
@@ -106,33 +117,35 @@ FUNCTION(arch_cpu_user_memcpy):
str r5, [r0]
add r1, #4
add r0, #4
sub r4, #1
subs r4, #1
bne 1b
ands r4, r2, #3 /* size % 4 */
beq 3f
2:
and r4, r2, #3 /* size % 4 */
ldrb r5, [r1]
strb r5, [r0]
add r1, #1
add r0, #1
sub r4, #1
subs r4, #1
bne 2b
3:
str r6, [r3] /* restore fault handler */
mov r0, #0
ldmfd sp!, { r4-r6 }
bx lr
ldmfd sp!, { r4-r6, pc }
.L_user_memcpy_error:
str r6, [r3] /* restore fault handler */
mov r0, #-1
ldmfd sp!, { r4-r6 }
bx lr
ldmfd sp!, { r4-r6, pc }
FUNCTION_END(arch_cpu_user_memcpy)
/* status_t arch_cpu_user_memset(void *to, char c, size_t count, addr_t *faultHandler) */
FUNCTION(arch_cpu_user_memset):
stmfd sp!, { r4-r5 }
stmfd sp!, { r4-r5, lr }
ldr r5, [r3]
ldr r4, =.L_user_memset_error
str r4, [r3]
@@ -146,33 +159,31 @@ FUNCTION(arch_cpu_user_memset):
1:
str r1, [r0]
add r0, r0, #4
sub r4, r4, #1
subs r4, r4, #1
bne 1b
and r4, r2, #3 /* count % 4 */
2:
strb r1, [r0]
add r0, r0, #1
sub r4, r4, #1
subs r4, r4, #1
bne 2b
mov r0, #0
str r5, [r3]
ldmfd sp!, { r4-r5 }
bx lr
ldmfd sp!, { r4-r5, pc }
.L_user_memset_error:
mov r0, #-1
str r5, [r3]
ldmfd sp!, { r4-r5 }
bx lr
ldmfd sp!, { r4-r5, pc }
FUNCTION_END(arch_cpu_user_memset)
/* ssize_t arch_cpu_user_strlcpy(void *to, const void *from, size_t size, addr_t *faultHandler) */
FUNCTION(arch_cpu_user_strlcpy):
stmfd sp!, { r4-r6 }
stmfd sp!, { r4-r6, lr }
ldr r5, [r3]
ldr r4, =.L_user_strlcpy_error
str r4, [r3]
@@ -181,7 +192,7 @@ FUNCTION(arch_cpu_user_strlcpy):
ldrb r4, [r1, r6]
strb r4, [r0, r6]
add r6, r6, #1
and r4, #0xff /* done yet? */
cmp r4, #0
beq 2f
cmp r6, r2 /* reached max length? */
blt 1b
@@ -189,18 +200,16 @@ FUNCTION(arch_cpu_user_strlcpy):
mov r4, #0
strb r4, [r0, r6]
mov r0, r4 /* return B_OK */
mov r0, r6 /* return length */
str r5, [r3] /* restore fault handler */
ldmfd sp!, { r4-r6 }
bx lr
ldmfd sp!, { r4-r6, pc }
.L_user_strlcpy_error:
mov r0, #-1
str r5, [r3]
ldmfd sp!, { r4-r6 }
bx lr
ldmfd sp!, { r4-r6, pc }
FUNCTION_END(arch_cpu_user_strlcpy)
@@ -236,12 +245,11 @@ FUNCTION(arch_debug_call_with_fault_handler):
blx r2
// regular return
ldmfd sp!, { r4, lr }
bx lr
ldmfd sp!, { r4, pc }
// fault -- return via longjmp(jumpBuffer, 1)
1:
mov r0, r4
mov r0, r1
mov r1, #1
bl longjmp
FUNCTION_END(arch_debug_call_with_fault_handler)
@@ -0,0 +1,177 @@
/*
* Copyright 2013 Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* Ithamar R. Adema, ithamar@upgrade-android.com
*/
#include <KernelExport.h>
#include <kernel.h>
#include <user_atomic.h>
#include <util/AutoLock.h>
#ifdef ATOMIC_FUNCS_ARE_SYSCALLS
/*
* NOTE: These functions are _intentionally_ not using spinlocks, unlike
* the 64 bit versions. The reason for this is that they are used by the
* spinlock code itself, and therefore would deadlock.
*
* Since these are only really needed for ARMv5, which is not SMP anyway,
* this is an acceptable compromise.
*/
int32
atomic_set(vint32 *value, int32 newValue)
{
InterruptsLocker locker;
int32 oldValue = *value;
*value = newValue;
return oldValue;
}
int32
atomic_test_and_set(vint32 *value, int32 newValue, int32 testAgainst)
{
InterruptsLocker locker;
int32 oldValue = *value;
if (oldValue == testAgainst)
*value = newValue;
return oldValue;
}
int32
atomic_add(vint32 *value, int32 addValue)
{
InterruptsLocker locker;
int32 oldValue = *value;
*value += addValue;
return oldValue;
}
int32
atomic_and(vint32 *value, int32 andValue)
{
InterruptsLocker locker;
int32 oldValue = *value;
*value &= andValue;
return oldValue;
}
int32
atomic_or(vint32 *value, int32 orValue)
{
InterruptsLocker locker;
int32 oldValue = *value;
*value |= orValue;
return oldValue;
}
int32
atomic_get(vint32 *value)
{
InterruptsLocker locker;
int32 oldValue = *value;
return oldValue;
}
int32
_user_atomic_set(vint32 *value, int32 newValue)
{
if (IS_USER_ADDRESS(value)
&& lock_memory((void *)value, sizeof(int32), B_READ_DEVICE) == B_OK) {
int32 oldValue = atomic_set(value, newValue);
unlock_memory((void *)value, sizeof(int32), B_READ_DEVICE);
return oldValue;
}
access_violation:
// XXX kill application
return -1;
}
int32
_user_atomic_test_and_set(vint32 *value, int32 newValue, int32 testAgainst)
{
if (IS_USER_ADDRESS(value)
&& lock_memory((void *)value, sizeof(int32), B_READ_DEVICE) == B_OK) {
int32 oldValue = atomic_test_and_set(value, newValue, testAgainst);
unlock_memory((void *)value, sizeof(int32), B_READ_DEVICE);
return oldValue;
}
access_violation:
// XXX kill application
return -1;
}
int32
_user_atomic_add(vint32 *value, int32 addValue)
{
if (IS_USER_ADDRESS(value)
&& lock_memory((void *)value, sizeof(int32), B_READ_DEVICE) == B_OK) {
int32 oldValue = atomic_add(value, addValue);
unlock_memory((void *)value, sizeof(int32), B_READ_DEVICE);
return oldValue;
}
access_violation:
// XXX kill application
return -1;
}
int32
_user_atomic_and(vint32 *value, int32 andValue)
{
if (IS_USER_ADDRESS(value)
&& lock_memory((void *)value, sizeof(int32), B_READ_DEVICE) == B_OK) {
int32 oldValue = atomic_and(value, andValue);
unlock_memory((void *)value, sizeof(int32), B_READ_DEVICE);
return oldValue;
}
access_violation:
// XXX kill application
return -1;
}
int32
_user_atomic_or(vint32 *value, int32 orValue)
{
if (IS_USER_ADDRESS(value)
&& lock_memory((void *)value, sizeof(int32), B_READ_DEVICE) == B_OK) {
int32 oldValue = atomic_or(value, orValue);
unlock_memory((void *)value, sizeof(int32), B_READ_DEVICE);
return oldValue;
}
access_violation:
// XXX kill application
return -1;
}
int32
_user_atomic_get(vint32 *value)
{
if (IS_USER_ADDRESS(value)
&& lock_memory((void *)value, sizeof(int32), B_READ_DEVICE) == B_OK) {
int32 oldValue = atomic_get(value);
unlock_memory((void *)value, sizeof(int32), B_READ_DEVICE);
return oldValue;
}
access_violation:
// XXX kill application
return -1;
}
#endif /* ATOMIC_FUNCS_ARE_SYSCALLS */
@@ -0,0 +1,192 @@
/*
* Copyright 2013 Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* Ithamar R. Adema, ithamar@upgrade-android.com
*/
#include <KernelExport.h>
#include <kernel.h>
#include <user_atomic.h>
#include <util/AutoLock.h>
#ifdef ATOMIC64_FUNCS_ARE_SYSCALLS
/*
* NOTE: Unlike their 32-bit counterparts, these functions can use
* spinlocks safely currently, as no atomic 64-bit operations are
* done in the spinlock code. If this ever changes, this code will
* have to change.
*
* This code is here for ARMv6, which cannot do proper 64-bit atomic
* operations. Anything newer is capable, and does therefore not
* depend on this code.
*/
static spinlock atomic_lock = B_SPINLOCK_INITIALIZER;
int64
atomic_set64(vint64 *value, int64 newValue)
{
SpinLocker locker(&atomic_lock);
int64 oldValue = *value;
*value = newValue;
return oldValue;
}
int64
atomic_test_and_set64(vint64 *value, int64 newValue, int64 testAgainst)
{
SpinLocker locker(&atomic_lock);
int64 oldValue = *value;
if (oldValue == testAgainst)
*value = newValue;
return oldValue;
}
int64
atomic_add64(vint64 *value, int64 addValue)
{
SpinLocker locker(&atomic_lock);
int64 oldValue = *value;
*value += addValue;
return oldValue;
}
int64
atomic_and64(vint64 *value, int64 andValue)
{
SpinLocker locker(&atomic_lock);
int64 oldValue = *value;
*value &= andValue;
return oldValue;
}
int64
atomic_or64(vint64 *value, int64 orValue)
{
SpinLocker locker(&atomic_lock);
int64 oldValue = *value;
*value |= orValue;
return oldValue;
}
int64
atomic_get64(vint64 *value)
{
SpinLocker locker(&atomic_lock);
return *value;
}
int64
_user_atomic_set64(vint64 *value, int64 newValue)
{
if (IS_USER_ADDRESS(value)
&& lock_memory((void *)value, sizeof(int64), B_READ_DEVICE) == B_OK) {
int64 oldValue = atomic_set64(value, newValue);
unlock_memory((void *)value, sizeof(int64), B_READ_DEVICE);
return oldValue;
}
access_violation:
// XXX kill application
return -1;
}
int64
_user_atomic_test_and_set64(vint64 *value, int64 newValue, int64 testAgainst)
{
if (IS_USER_ADDRESS(value)
&& lock_memory((void *)value, sizeof(int64), B_READ_DEVICE) == B_OK) {
int64 oldValue = atomic_test_and_set64(value, newValue, testAgainst);
unlock_memory((void *)value, sizeof(int64), B_READ_DEVICE);
return oldValue;
}
access_violation:
// XXX kill application
return -1;
}
int64
_user_atomic_add64(vint64 *value, int64 addValue)
{
if (IS_USER_ADDRESS(value)
&& lock_memory((void *)value, sizeof(int64), B_READ_DEVICE) == B_OK) {
int64 oldValue = atomic_add64(value, addValue);
unlock_memory((void *)value, sizeof(int64), B_READ_DEVICE);
return oldValue;
}
access_violation:
// XXX kill application
return -1;
}
int64
_user_atomic_and64(vint64 *value, int64 andValue)
{
if (IS_USER_ADDRESS(value)
&& lock_memory((void *)value, sizeof(int64), B_READ_DEVICE) == B_OK) {
int64 oldValue = atomic_and64(value, andValue);
unlock_memory((void *)value, sizeof(int64), B_READ_DEVICE);
return oldValue;
}
access_violation:
// XXX kill application
return -1;
}
int64
_user_atomic_or64(vint64 *value, int64 orValue)
{
if (IS_USER_ADDRESS(value)
&& lock_memory((void *)value, sizeof(int64), B_READ_DEVICE) == B_OK) {
int64 oldValue = atomic_or64(value, orValue);
unlock_memory((void *)value, sizeof(int64), B_READ_DEVICE);
return oldValue;
}
access_violation:
// XXX kill application
return -1;
}
int64
_user_atomic_get64(vint64 *value)
{
if (IS_USER_ADDRESS(value)
&& lock_memory((void *)value, sizeof(int64), B_READ_DEVICE) == B_OK) {
int64 oldValue = atomic_get64(value);
unlock_memory((void *)value, sizeof(int64), B_READ_DEVICE);
return oldValue;
}
access_violation:
// XXX kill application
return -1;
}
#endif /* ATOMIC64_FUNCS_ARE_SYSCALLS */
+328 -108
View File
@@ -6,6 +6,8 @@
* Axel Dörfler <axeld@pinc-software.de>
* Ingo Weinhold <bonefish@cs.tu-berlin.de>
* François Revol <revol@free.fr>
* Ithamar R. Adema <ithamar@upgrade-android.com>
*
*/
@@ -13,25 +15,22 @@
#include <arch_cpu.h>
#include <debug.h>
#include <debug_heap.h>
#include <elf.h>
#include <kernel.h>
#include <kimage.h>
#include <thread.h>
struct stack_frame {
struct stack_frame *previous;
addr_t return_address;
};
#include <vm/vm_types.h>
#include <vm/VMAddressSpace.h>
#include <vm/VMArea.h>
#define NUM_PREVIOUS_LOCATIONS 32
extern struct iframe_stack gBootFrameStack;
/*
static bool
already_visited(uint32 *visited, int32 *_last, int32 *_num, uint32 framePointer)
already_visited(uint32 *visited, int32 *_last, int32 *_num, uint32 fp)
{
int32 last = *_last;
int32 num = *_num;
@@ -39,13 +38,13 @@ already_visited(uint32 *visited, int32 *_last, int32 *_num, uint32 framePointer)
for (i = 0; i < num; i++) {
if (visited[(NUM_PREVIOUS_LOCATIONS + last - i)
% NUM_PREVIOUS_LOCATIONS] == framePointer) {
% NUM_PREVIOUS_LOCATIONS] == fp) {
return true;
}
}
*_last = last = (last + 1) % NUM_PREVIOUS_LOCATIONS;
visited[last] = framePointer;
visited[last] = fp;
if (num < NUM_PREVIOUS_LOCATIONS)
*_num = num + 1;
@@ -54,99 +53,327 @@ already_visited(uint32 *visited, int32 *_last, int32 *_num, uint32 framePointer)
}
static inline stack_frame *
get_current_stack_frame()
static status_t
get_next_frame(addr_t fp, addr_t *next, addr_t *ip)
{
stack_frame *frame;
asm volatile("move.l %%fp,%0" : "=r"(frame));
return frame;
if (fp != 0) {
addr_t _fp = *(((addr_t*)fp) -3);
addr_t _sp = *(((addr_t*)fp) -2);
addr_t _lr = *(((addr_t*)fp) -1);
addr_t _pc = *(((addr_t*)fp) -0);
*ip = (_fp != 0) ? _lr : _pc;
*next = _fp;
return B_OK;
}
return B_BAD_VALUE;
}
static status_t
get_next_frame(addr_t framePointer, addr_t *next, addr_t *ip)
lookup_symbol(Thread* thread, addr_t address, addr_t* _baseAddress,
const char** _symbolName, const char** _imageName, bool* _exactMatch)
{
Thread *thread = thread_get_current_thread();
addr_t oldFaultHandler = thread->fault_handler;
status_t status = B_ENTRY_NOT_FOUND;
// set fault handler, so that we can safely access user stacks
if (thread) {
if (m68k_set_fault_handler(&thread->fault_handler, (addr_t)&&error))
goto error;
if (IS_KERNEL_ADDRESS(address)) {
// a kernel symbol
status = elf_debug_lookup_symbol_address(address, _baseAddress,
_symbolName, _imageName, _exactMatch);
} else if (thread != NULL && thread->team != NULL) {
// try a lookup using the userland runtime loader structures
status = elf_debug_lookup_user_symbol_address(thread->team, address,
_baseAddress, _symbolName, _imageName, _exactMatch);
if (status != B_OK) {
// try to locate the image in the images loaded into user space
status = image_debug_lookup_user_symbol_address(thread->team,
address, _baseAddress, _symbolName, _imageName, _exactMatch);
}
}
*ip = ((struct stack_frame *)framePointer)->return_address;
*next = (addr_t)((struct stack_frame *)framePointer)->previous;
if (thread)
thread->fault_handler = oldFaultHandler;
return B_OK;
error:
thread->fault_handler = oldFaultHandler;
return B_BAD_ADDRESS;
return status;
}
static void
print_stack_frame(Thread *thread, addr_t ip, addr_t framePointer,
addr_t nextFramePointer)
set_debug_argument_variable(int32 index, uint64 value)
{
addr_t diff = nextFramePointer - framePointer;
// kernel space/user space switch
if (diff & 0x80000000)
diff = 0;
// lookup symbol
const char *symbol, *image;
addr_t baseAddress;
bool exactMatch;
status_t status = elf_debug_lookup_symbol_address(ip, &baseAddress, &symbol,
&image, &exactMatch);
if (status != B_OK && !IS_KERNEL_ADDRESS(ip) && thread) {
// try to locate the image in the images loaded into user space
status = image_debug_lookup_user_symbol_address(thread->team, ip,
&baseAddress, &symbol, &image, &exactMatch);
}
if (status == B_OK) {
if (symbol != NULL) {
kprintf("%08lx (+%4ld) %08lx <%s>:%s + 0x%04lx%s\n", framePointer,
diff, ip, image, symbol, ip - baseAddress,
(exactMatch ? "" : " (nearest)"));
} else {
kprintf("%08lx (+%4ld) %08lx <%s@%p>:unknown + 0x%04lx\n",
framePointer, diff, ip, image, (void *)baseAddress,
ip - baseAddress);
}
} else
kprintf("%08lx (+%4ld) %08lx\n", framePointer, diff, ip);
char name[8];
snprintf(name, sizeof(name), "_arg%ld", index);
set_debug_variable(name, value);
}
template<typename Type>
static Type
read_function_argument_value(void* argument, bool& _valueKnown)
{
Type value;
if (debug_memcpy(B_CURRENT_TEAM, &value, argument, sizeof(Type)) == B_OK) {
_valueKnown = true;
return value;
}
_valueKnown = false;
return 0;
}
static status_t
print_demangled_call(const char* image, const char* symbol, addr_t args,
bool noObjectMethod, bool addDebugVariables)
{
static const size_t kBufferSize = 256;
char* buffer = (char*)debug_malloc(kBufferSize);
if (buffer == NULL)
return B_NO_MEMORY;
bool isObjectMethod;
const char* name = debug_demangle_symbol(symbol, buffer, kBufferSize,
&isObjectMethod);
if (name == NULL) {
debug_free(buffer);
return B_ERROR;
}
uint32* arg = (uint32*)args;
if (noObjectMethod)
isObjectMethod = false;
if (isObjectMethod) {
const char* lastName = strrchr(name, ':') - 1;
int namespaceLength = lastName - name;
uint32 argValue = 0;
if (debug_memcpy(B_CURRENT_TEAM, &argValue, arg, 4) == B_OK) {
kprintf("<%s> %.*s<\33[32m%#" B_PRIx32 "\33[0m>%s", image,
namespaceLength, name, argValue, lastName);
} else
kprintf("<%s> %.*s<???>%s", image, namespaceLength, name, lastName);
if (addDebugVariables)
set_debug_variable("_this", argValue);
arg++;
} else
kprintf("<%s> %s", image, name);
kprintf("(");
size_t length;
int32 type, i = 0;
uint32 cookie = 0;
while (debug_get_next_demangled_argument(&cookie, symbol, buffer,
kBufferSize, &type, &length) == B_OK) {
if (i++ > 0)
kprintf(", ");
// retrieve value and type identifier
uint64 value;
bool valueKnown = false;
switch (type) {
case B_INT64_TYPE:
value = read_function_argument_value<int64>(arg, valueKnown);
if (valueKnown)
kprintf("int64: \33[34m%Ld\33[0m", value);
break;
case B_INT32_TYPE:
value = read_function_argument_value<int32>(arg, valueKnown);
if (valueKnown)
kprintf("int32: \33[34m%ld\33[0m", (int32)value);
break;
case B_INT16_TYPE:
value = read_function_argument_value<int16>(arg, valueKnown);
if (valueKnown)
kprintf("int16: \33[34m%d\33[0m", (int16)value);
break;
case B_INT8_TYPE:
value = read_function_argument_value<int8>(arg, valueKnown);
if (valueKnown)
kprintf("int8: \33[34m%d\33[0m", (int8)value);
break;
case B_UINT64_TYPE:
value = read_function_argument_value<uint64>(arg, valueKnown);
if (valueKnown) {
kprintf("uint64: \33[34m%#Lx\33[0m", value);
if (value < 0x100000)
kprintf(" (\33[34m%Lu\33[0m)", value);
}
break;
case B_UINT32_TYPE:
value = read_function_argument_value<uint32>(arg, valueKnown);
if (valueKnown) {
kprintf("uint32: \33[34m%#lx\33[0m", (uint32)value);
if (value < 0x100000)
kprintf(" (\33[34m%lu\33[0m)", (uint32)value);
}
break;
case B_UINT16_TYPE:
value = read_function_argument_value<uint16>(arg, valueKnown);
if (valueKnown) {
kprintf("uint16: \33[34m%#x\33[0m (\33[34m%u\33[0m)",
(uint16)value, (uint16)value);
}
break;
case B_UINT8_TYPE:
value = read_function_argument_value<uint8>(arg, valueKnown);
if (valueKnown) {
kprintf("uint8: \33[34m%#x\33[0m (\33[34m%u\33[0m)",
(uint8)value, (uint8)value);
}
break;
case B_BOOL_TYPE:
value = read_function_argument_value<uint8>(arg, valueKnown);
if (valueKnown)
kprintf("\33[34m%s\33[0m", value ? "true" : "false");
break;
default:
if (buffer[0])
kprintf("%s: ", buffer);
if (length == 4) {
value = read_function_argument_value<uint32>(arg,
valueKnown);
if (valueKnown) {
if (value == 0
&& (type == B_POINTER_TYPE || type == B_REF_TYPE))
kprintf("NULL");
else
kprintf("\33[34m%#lx\33[0m", (uint32)value);
}
break;
}
if (length == 8) {
value = read_function_argument_value<uint64>(arg,
valueKnown);
} else
value = (uint64)arg;
if (valueKnown)
kprintf("\33[34m%#Lx\33[0m", value);
break;
}
if (!valueKnown)
kprintf("???");
if (valueKnown && type == B_STRING_TYPE) {
if (value == 0)
kprintf(" \33[31m\"<NULL>\"\33[0m");
else if (debug_strlcpy(B_CURRENT_TEAM, buffer, (char*)(addr_t)value,
kBufferSize) < B_OK) {
kprintf(" \33[31m\"<???>\"\33[0m");
} else
kprintf(" \33[36m\"%s\"\33[0m", buffer);
}
if (addDebugVariables)
set_debug_argument_variable(i, value);
arg = (uint32*)((uint8*)arg + length);
}
debug_free(buffer);
kprintf(")");
return B_OK;
}
static void
print_stack_frame(Thread *thread, addr_t ip, addr_t fp, addr_t next,
int32 callIndex, bool demangle)
{
const char* symbol;
const char* image;
addr_t baseAddress;
bool exactMatch;
status_t status;
addr_t diff;
diff = next - fp;
// MSB set = kernel space/user space switch
if (diff & ~((addr_t)-1 >> 1))
diff = 0;
status = lookup_symbol(thread, ip, &baseAddress, &symbol, &image,
&exactMatch);
kprintf("%2" B_PRId32 " %0*lx (+%4ld) %0*lx ", callIndex,
B_PRINTF_POINTER_WIDTH, fp, diff, B_PRINTF_POINTER_WIDTH, ip);
if (status == B_OK) {
if (exactMatch && demangle) {
status = print_demangled_call(image, symbol,
next, false, false);
}
if (!exactMatch || !demangle || status != B_OK) {
if (symbol != NULL) {
kprintf("<%s> %s%s", image, symbol,
exactMatch ? "" : " (nearest)");
} else
kprintf("<%s@%p> <unknown>", image, (void*)baseAddress);
}
kprintf(" + %#04lx\n", ip - baseAddress);
} else {
VMArea *area = NULL;
if (thread != NULL && thread->team != NULL
&& thread->team->address_space != NULL) {
area = thread->team->address_space->LookupArea(ip);
}
if (area != NULL) {
kprintf("%" B_PRId32 ":%s@%p + %#lx\n", area->id, area->name,
(void*)area->Base(), ip - area->Base());
} else
kprintf("\n");
}
}
static int
stack_trace(int argc, char **argv)
{
uint32 previousLocations[NUM_PREVIOUS_LOCATIONS];
struct iframe_stack *frameStack;
Thread *thread;
addr_t framePointer;
int32 i, num = 0, last = 0;
if (argc < 2) {
thread = thread_get_current_thread();
framePointer = (addr_t)get_current_stack_frame();
} else {
kprintf("Stack traces of other threads not supported yet!\n");
return 0;
static const char* usage = "usage: %s [-d] [ <thread id> ]\n"
"Prints a stack trace for the current, respectively the specified\n"
"thread.\n"
" -d - Disables the demangling of the symbols.\n"
" <thread id> - The ID of the thread for which to print the stack\n"
" trace.\n";
bool demangle = true;
int32 threadIndex = 1;
if (argc > 1 && !strcmp(argv[1], "-d")) {
demangle = false;
threadIndex++;
}
if (argc > threadIndex + 1
|| (argc == 2 && strcmp(argv[1], "--help") == 0)) {
kprintf(usage, argv[0]);
return 0;
}
addr_t previousLocations[NUM_PREVIOUS_LOCATIONS];
Thread* thread = NULL;
phys_addr_t oldPageDirectory = 0;
addr_t fp = arm_get_fp();
int32 num = 0, last = 0;
struct iframe_stack *frameStack;
// We don't have a thread pointer early in the boot process
if (thread != NULL)
frameStack = &thread->arch_info.iframes;
else
frameStack = &gBootFrameStack;
int32 i;
for (i = 0; i < frameStack->index; i++) {
kprintf("iframe %p (end = %p)\n",
frameStack->frames[i], frameStack->frames[i] + 1);
@@ -168,11 +395,11 @@ return 0;
kprintf("frame caller <image>:function + offset\n");
for (;;) {
for (int32 callIndex = 0;; callIndex++) {
// see if the frame pointer matches the iframe
struct iframe *frame = NULL;
for (i = 0; i < frameStack->index; i++) {
if (framePointer == (addr_t)frameStack->frames[i]) {
if (fp == (addr_t)frameStack->frames[i]) {
// it's an iframe
frame = frameStack->frames[i];
break;
@@ -181,49 +408,43 @@ return 0;
if (frame) {
kprintf("iframe at %p\n", frame);
kprintf(" d0 0x%08lx d1 0x%08lx d2 0x%08lx d3 0x%08lx\n",
frame->d[0], frame->d[1], frame->d[2], frame->d[3]);
kprintf(" d4 0x%08lx d5 0x%08lx d6 0x%08lx d7 0x%08lx\n",
frame->d[4], frame->d[5], frame->d[6], frame->d[7]);
kprintf(" a0 0x%08lx a1 0x%08lx a2 0x%08lx a3 0x%08lx\n",
frame->a[0], frame->a[1], frame->a[2], frame->a[3]);
kprintf(" a4 0x%08lx a5 0x%08lx a6 0x%08lx a7 0x%08lx (sp)\n",
#warning M68K: a7 in iframe ??
frame->a[4], frame->a[5], frame->a[6], -1L);
kprintf(" pc 0x%08lx sr 0x%04x\n",
frame->cpu.pc, frame->cpu.sr);
#warning M68K: missing regs
kprintf(" r0 0x%08lx r1 0x%08lx r2 0x%08lx r3 0x%08lx\n",
frame->r0, frame->r1, frame->r2, frame->r3);
kprintf(" r4 0x%08lx r5 0x%08lx r6 0x%08lx r7 0x%08lx\n",
frame->r4, frame->r5, frame->r6, frame->r7);
kprintf(" r8 0x%08lx r9 0x%08lx r10 0x%08lx r11 0x%08lx\n",
frame->r8, frame->r9, frame->r10, frame->r11);
kprintf(" r12 0x%08lx sp 0x%08lx lr 0x%08lx pc 0x%08lx\n",
frame->r12, frame->svc_sp, frame->svc_lr, frame->pc);
print_stack_frame(thread, frame->cpu.pc, framePointer, frame->a[6]);
framePointer = frame->a[6];
fp = frame->svc_sp;
print_stack_frame(thread, frame->pc, frame->svc_sp, frame->svc_lr, callIndex, demangle);
} else {
addr_t ip, nextFramePointer;
addr_t ip, next;
if (get_next_frame(framePointer, &nextFramePointer, &ip) != B_OK) {
kprintf("%08lx -- read fault\n", framePointer);
if (get_next_frame(fp, &next, &ip) != B_OK) {
kprintf("%08lx -- read fault\n", fp);
break;
}
if (ip == 0 || framePointer == 0)
if (ip == 0 || fp == 0)
break;
print_stack_frame(thread, ip, framePointer, nextFramePointer);
framePointer = nextFramePointer;
print_stack_frame(thread, ip, fp, next, callIndex, demangle);
fp = next;
}
if (already_visited(previousLocations, &last, &num, framePointer)) {
kprintf("circular stack frame: %p!\n", (void *)framePointer);
if (already_visited(previousLocations, &last, &num, fp)) {
kprintf("circular stack frame: %p!\n", (void *)fp);
break;
}
if (framePointer == 0)
if (fp == 0)
break;
}
return 0;
}
*/
// #pragma mark -
@@ -245,6 +466,7 @@ arch_debug_contains_call(Thread *thread, const char *symbol,
void
arch_debug_stack_trace(void)
{
stack_trace(0, NULL);
}
@@ -261,8 +483,7 @@ int32
arch_debug_get_stack_trace(addr_t* returnAddresses, int32 maxCount,
int32 skipIframes, int32 skipFrames, uint32 flags)
{
#warning ARM:IMPLEMENT
// TODO: Implement!
return 0;
}
@@ -302,10 +523,9 @@ arch_get_debug_variable(const char* variableName, uint64* value)
status_t
arch_debug_init(kernel_args *args)
{
// add_debugger_command("where", &stack_trace, "Same as \"sc\"");
// add_debugger_command("bt", &stack_trace, "Same as \"sc\" (as in gdb)");
// add_debugger_command("sc", &stack_trace, "Stack crawl for current thread");
#warning ARM:IMPLEMENT
add_debugger_command("where", &stack_trace, "Same as \"sc\"");
add_debugger_command("bt", &stack_trace, "Same as \"sc\" (as in gdb)");
add_debugger_command("sc", &stack_trace, "Stack crawl for current thread");
return B_NO_ERROR;
}
+39 -3
View File
@@ -31,7 +31,7 @@
#include <string.h>
//#define TRACE_ARCH_INT
#define TRACE_ARCH_INT
#ifdef TRACE_ARCH_INT
# define TRACE(x) dprintf x
#else
@@ -108,9 +108,9 @@ print_iframe(const char *event, struct iframe *frame)
frame->r0, frame->r1, frame->r2, frame->r3,
frame->r4, frame->r5, frame->r6, frame->r7);
dprintf("R08=%08lx R09=%08lx R10=%08lx R11=%08lx\n"
"R12=%08lx R13=%08lx R14=%08lx CPSR=%08lx\n",
"R12=%08lx SP=%08lx LR=%08lx PC=%08lx CPSR=%08lx\n",
frame->r8, frame->r9, frame->r10, frame->r11,
frame->r12, frame->usr_sp, frame->usr_lr, frame->spsr);
frame->r12, frame->svc_sp, frame->svc_lr, frame->pc, frame->spsr);
}
@@ -188,10 +188,36 @@ arch_int_init_post_device_manager(struct kernel_args *args)
}
// Little helper class for handling the
// iframe stack as used by KDL.
class IFrameScope {
public:
IFrameScope(struct iframe *iframe) {
fThread = thread_get_current_thread();
if (fThread)
arm_push_iframe(&fThread->arch_info.iframes, iframe);
else
arm_push_iframe(&gBootFrameStack, iframe);
}
virtual ~IFrameScope() {
// pop iframe
if (fThread)
arm_pop_iframe(&fThread->arch_info.iframes);
else
arm_pop_iframe(&gBootFrameStack);
}
private:
Thread* fThread;
};
extern "C" void
arch_arm_undefined(struct iframe *iframe)
{
print_iframe("Undefined Instruction", iframe);
IFrameScope scope(iframe); // push/pop iframe
panic("not handled!");
}
@@ -200,6 +226,7 @@ extern "C" void
arch_arm_syscall(struct iframe *iframe)
{
print_iframe("Software interrupt", iframe);
IFrameScope scope(iframe); // push/pop iframe
}
@@ -214,8 +241,11 @@ arch_arm_data_abort(struct iframe *frame)
#ifdef TRACE_ARCH_INT
print_iframe("Data Abort", frame);
dprintf("FAR: %08lx, thread: %s\n", far, thread->name);
#endif
IFrameScope scope(frame);
if (debug_debugger_running()) {
// If this CPU or this thread has a fault handler, we're allowed to be
// here.
@@ -291,6 +321,8 @@ extern "C" void
arch_arm_prefetch_abort(struct iframe *iframe)
{
print_iframe("Prefetch Abort", iframe);
IFrameScope scope(iframe);
panic("not handled!");
}
@@ -298,6 +330,8 @@ arch_arm_prefetch_abort(struct iframe *iframe)
extern "C" void
arch_arm_irq(struct iframe *iframe)
{
IFrameScope scope(iframe);
for (int i=0; i < 32; i++) {
if (sPxaInterruptBase[PXA_ICIP] & (1 << i))
int_io_interrupt_handler(i, true);
@@ -308,6 +342,8 @@ arch_arm_irq(struct iframe *iframe)
extern "C" void
arch_arm_fiq(struct iframe *iframe)
{
IFrameScope scope(iframe);
for (int i=0; i < 32; i++) {
if (sPxaInterruptBase[PXA_ICIP] & (1 << i)) {
dprintf("arch_arm_fiq: help me, FIQ %d was triggered but no "
@@ -42,6 +42,23 @@ static struct arch_thread sInitialState;
Thread *gCurrentThread;
void
arm_push_iframe(struct iframe_stack *stack, struct iframe *frame)
{
ASSERT(stack->index < IFRAME_TRACE_DEPTH);
stack->frames[stack->index++] = frame;
}
void
arm_pop_iframe(struct iframe_stack *stack)
{
ASSERT(stack->index > 0);
stack->index--;
}
status_t
arch_thread_init(struct kernel_args *args)
{
+6 -2
View File
@@ -29,7 +29,7 @@
#define PXA_TIMERS_PHYS_BASE 0x40A00000
#define PXA_TIMERS_SIZE 0x000000C0
#define PXA_TIMERS_SIZE B_PAGE_SIZE
#define PXA_TIMERS_INTERRUPT 7 /* OST_4_11 */
#define PXA_OSSR 0x05
@@ -48,7 +48,7 @@
#define US2S(bt) ((bt) / 1000000ULL)
#define US2MS(bt) ((bt) / 1000ULL)
static area_id sPxaTimersArea = B_ERROR;
static area_id sPxaTimersArea = -1;
static uint32 *sPxaTimersBase = NULL;
static bigtime_t sSystemTime = 0;
@@ -107,6 +107,7 @@ arch_timer_clear_hardware_timer()
int
arch_init_timer(kernel_args *args)
{
TRACE(("%s\n", __func__));
sPxaTimersArea = map_physical_memory("pxa_timers", PXA_TIMERS_PHYS_BASE,
PXA_TIMERS_SIZE, 0, B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA, (void**)&sPxaTimersBase);
@@ -126,6 +127,9 @@ arch_init_timer(kernel_args *args)
bigtime_t
system_time(void)
{
if (sPxaTimersArea < 0)
return 0;
return (sPxaTimersBase != NULL) ?
sSystemTime + sPxaTimersBase[PXA_OSCR5] :
0ULL;
+3
View File
@@ -14,6 +14,7 @@ KernelMergeObject kernel_arch_ppc.o :
arch_debug.cpp
arch_elf.cpp
arch_exceptions.S
arch_exceptions_44x.S
arch_int.cpp
arch_mmu.cpp
arch_platform.cpp
@@ -26,6 +27,8 @@ KernelMergeObject kernel_arch_ppc.o :
arch_vm.cpp
arch_vm_translation_map.cpp
arch_asm.S
debug_uart_8250.cpp
arch_uart_8250.cpp
generic_vm_physical_page_mapper.cpp
generic_vm_physical_page_ops.cpp
+1 -2
View File
@@ -5,8 +5,7 @@
* Copyright 2003, Travis Geiselbrecht. All rights reserved.
* Distributed under the terms of the NewOS License.
*/
#define FUNCTION(x) .global x; .type x,@function; x
#define LOCAL_FUNCTION(x) .type x,@function; x
#include <asm_defs.h>
/* General exception handling concept:
@@ -0,0 +1,441 @@
/*
* Copyright 2013, François Revol <revol@free.fr>.
* All rights reserved. Distributed under the terms of the MIT License.
*
* Copyright 2006, Ingo Weinhold <bonefish@cs.tu-berlin.de>.
* All rights reserved. Distributed under the terms of the MIT License.
*
* Copyright 2003, Travis Geiselbrecht. All rights reserved.
* Distributed under the terms of the NewOS License.
*/
#include <asm_defs.h>
/* General exception handling concept:
The PPC architecture specifies entry point offsets for the various
exceptions in the first two physical pages. We put a short piece of code
(VEC_ENTRY()) into each exception vector. It calls exception_vector_common,
which is defined in the unused space at the beginning of the first physical
page. It re-enables address translation and calls ppc_exception_tail which
lies in the kernel. It dumps an iframe and invokes ppc_exception_entry()
(arch_int.cpp), which handles the exception and returns eventually.
The registers are restored from the iframe and we return from the
interrupt.
algorithm overview:
* VEC_ENTRY
* ppc_44x_exception_vector_common
* ppc_44x_exception_tail
- dump iframe
- ppc_exception_entry()
- restore registers and return from interrupt
Here we use the following SPRG registers, which are at the disposal of the
operating system:
* SPRG0: Physical address pointer to a struct cpu_exception_context
for the current CPU. The structure contains helpful pointers
as well as some scratch memory for temporarily saving registers.
* SPRG1: Scratch.
struct cpu_exception_context (defined in arch_int.h):
offset 0: virtual address of the exception handler routine in the kernel
offset 4: virtual address of the exception context
offset 8: kernel stack for the current thread
offset 12: start of scratch memory for saving registers etc.
algorithm in detail:
* VEC_ENTRY
- save r1 in SPRG1 and load cpu_exception_context into r1
- save r0, save LR in r0
* ppc_44x_exception_vector_common
- params:
. r0: old LR
. r1: exception context (physical address)
. SPRG1: original r1
- save r0-3
- load virtual exception context address to r1
- turn on BAT for exception vector code
- turn on address translation
- get exception vector offset from LR
* ppc_44x_exception_tail
- params:
. r1: exception context (virtual address)
. r3: exception vector offset
. SPRG1: original r1
- turn off BAT
- get kernel stack pointer
- dump iframe
- ppc_exception_entry()
- restore registers and return from interrupt
*/
/* exception vector definitions */
/* code in each exception vector */
#define VEC_ENTRY() \
mtsprg1 %r1 ; /* temporarily save r1 in SPRG1 */ \
mfsprg0 %r1 ; /* ppc_cpu_exception_context* -> r1 */ \
stw %r0, 16(%r1) ; /* save r0 */ \
mflr %r0 ; /* save LR in r0 */ \
bl ppc_44x_exception_vector_common ; /* continue with the common part */
/* defines an exception vector */
#define DEFINE_VECTOR(offset, name) \
.skip offset - (. - __44x_irqvec_start); \
FUNCTION(ppc_44x_##name): \
VEC_ENTRY()
.global __44x_irqvec_start
__44x_irqvec_start:
.long 0
/* Called by the exception vector code.
* LR: Points to the end of the exception vector code we're coming from.
* r0: original LR
* r1: ppc_cpu_exception_context* (physical address)
* SPRG1: original r1
*/
ppc_44x_exception_vector_common:
stw %r0, 20(%r1) /* save original LR */
stw %r2, 24(%r1) /* save r2 */
stw %r3, 28(%r1) /* save r3 */
/* load the virtual address of the ppc_cpu_exception_context for this CPU */
lwz %r1, 4(%r1)
/* Address translation is turned off. We map this code via BAT, turn on
address translation, and continue in the kernel proper. */
li %r0, 0x10|0x2 /* BATL_MC | BATL_PP_RW */
mtibatl 0, %r0 /* load lower word of the instruction BAT */
li %r0, 0x2 /* BEPI = 0, BL = 0 (128 KB), BATU_VS */
mtibatu 0, %r0 /* load upper word of the instruction BAT */
isync
sync
/* turn on address translation */
mfsrr1 %r0 /* load saved msr */
rlwinm %r0, %r0, 28, 30, 31 /* extract mmu bits */
mfmsr %r3 /* load the current msr */
rlwimi %r3, %r0, 4, 26, 27 /* merge the mmu bits with the current msr */
li %r0, 1
rlwimi %r3, %r0, 13, 18, 18 /* turn on FPU, too */
mtmsr %r3 /* load new msr (turning the mmu back on) */
isync
/* Get LR -- it points to the end of the exception vector code. We adjust it
to point to the beginning and can use it to identify the vector later. */
mflr %r3
subi %r3, %r3, 20 /* 5 instructions */
/* jump to kernel code (ppc_exception_tail) */
lwz %r2, 0(%r1)
mtlr %r2
blr
DEFINE_VECTOR(0x100, system_reset_exception)
DEFINE_VECTOR(0x200, machine_check_exception)
DEFINE_VECTOR(0x300, DSI_exception)
DEFINE_VECTOR(0x400, ISI_exception)
DEFINE_VECTOR(0x500, external_interrupt_exception)
DEFINE_VECTOR(0x600, alignment_exception)
DEFINE_VECTOR(0x700, program_exception)
DEFINE_VECTOR(0x800, FP_unavailable_exception)
DEFINE_VECTOR(0x900, decrementer_exception)
DEFINE_VECTOR(0xc00, system_call_exception)
DEFINE_VECTOR(0xd00, trace_exception)
DEFINE_VECTOR(0xe00, FP_assist_exception)
DEFINE_VECTOR(0xf00, perf_monitor_exception)
DEFINE_VECTOR(0xf20, altivec_unavailable_exception)
DEFINE_VECTOR(0x1000, ITLB_miss_exception)
DEFINE_VECTOR(0x1100, DTLB_miss_on_load_exception)
DEFINE_VECTOR(0x1200, DTLB_miss_on_store_exception)
DEFINE_VECTOR(0x1300, instruction_address_breakpoint_exception)
DEFINE_VECTOR(0x1400, system_management_exception)
DEFINE_VECTOR(0x1600, altivec_assist_exception)
DEFINE_VECTOR(0x1700, thermal_management_exception)
.global __44x_irqvec_end
__44x_irqvec_end:
/* This is where ppc_44x_exception_vector_common continues. We're in the kernel here.
r1: ppc_cpu_exception_context* (virtual address)
r3: exception vector offset
SPRG1: original r1
*/
FUNCTION(ppc_44x_exception_tail):
/* turn off BAT */
li %r2, 0
mtibatu 0, %r2
mtibatl 0, %r2
isync
sync
/* save CR */
mfcr %r0
mfsrr1 %r2 /* load saved msr */
andi. %r2, %r2, (1 << 14) /* see if it was in kernel mode */
beq .kernel /* yep */
/* We come from userland. Load the kernel stack top address for the current
userland thread. */
mr %r2, %r1
lwz %r1, 8(%r1)
b .restore_stack_end
.kernel:
mr %r2, %r1
mfsprg1 %r1
.restore_stack_end:
/* now r2 points to the ppc_cpu_exception_context, r1 to the kernel stack */
/* restore the CR, it was messed up in the previous compare */
mtcrf 0xff, %r0
/* align r1 to 8 bytes, so the iframe will be aligned too */
rlwinm %r1, %r1, 0, 0, 28
/* save the registers */
bl __44x_save_regs
/* iframe pointer to r4 and a backup to r20 */
mr %r4, %r1
mr %r20, %r1
/* adjust the stack pointer for ABI compatibility */
subi %r1, %r1, 8 /* make sure there's space for the previous
frame pointer and the return address */
rlwinm %r1, %r1, 0, 0, 27 /* 16 byte align the stack pointer */
li %r0, 0
stw %r0, 0(%r1) /* previous frame pointer: NULL */
/* 4(%r1) is room for the return address to be filled in by the
called function. */
/* r3: exception vector offset
r4: iframe pointer */
bl ppc_exception_entry
/* move the iframe to r1 */
mr %r1, %r20
b __44x_restore_regs_and_rfi
/* called by ppc_44x_exception_tail
* register expectations:
* r1: stack
* r2: ppc_cpu_exception_context*
* SPRG1: original r1
* r0,r3, LR: scrambled, but saved in scratch memory
* all other regs should have been unmodified by the exception handler,
* and ready to be saved
*/
__44x_save_regs:
/* Note: The iframe must be 8 byte aligned. The stack pointer we are passed
in r1 is aligned. So we store the floating point registers first and
need to take care that an even number of 4 byte registers is stored,
or insert padding respectively. */
/* push f0-f31 */
stfdu %f0, -8(%r1)
stfdu %f1, -8(%r1)
stfdu %f2, -8(%r1)
stfdu %f3, -8(%r1)
stfdu %f4, -8(%r1)
stfdu %f5, -8(%r1)
stfdu %f6, -8(%r1)
stfdu %f7, -8(%r1)
stfdu %f8, -8(%r1)
stfdu %f9, -8(%r1)
stfdu %f10, -8(%r1)
stfdu %f11, -8(%r1)
stfdu %f12, -8(%r1)
stfdu %f13, -8(%r1)
stfdu %f14, -8(%r1)
stfdu %f15, -8(%r1)
stfdu %f16, -8(%r1)
stfdu %f17, -8(%r1)
stfdu %f18, -8(%r1)
stfdu %f19, -8(%r1)
stfdu %f20, -8(%r1)
stfdu %f21, -8(%r1)
stfdu %f22, -8(%r1)
stfdu %f23, -8(%r1)
stfdu %f24, -8(%r1)
stfdu %f25, -8(%r1)
stfdu %f26, -8(%r1)
stfdu %f27, -8(%r1)
stfdu %f28, -8(%r1)
stfdu %f29, -8(%r1)
stfdu %f30, -8(%r1)
stfdu %f31, -8(%r1)
/* push r0-r3 */
lwz %r0, 16(%r2) /* original r0 */
stwu %r0, -4(%r1) /* push r0 */
mfsprg1 %r0 /* original r1 */
stwu %r0, -4(%r1) /* push r1 */
lwz %r0, 24(%r2) /* original r2 */
stwu %r0, -4(%r1) /* push r2 */
lwz %r0, 28(%r2) /* original r3 */
stwu %r0, -4(%r1) /* push r3 */
/* push r4-r31 */
stwu %r4, -4(%r1)
stwu %r5, -4(%r1)
stwu %r6, -4(%r1)
stwu %r7, -4(%r1)
stwu %r8, -4(%r1)
stwu %r9, -4(%r1)
stwu %r10, -4(%r1)
stwu %r11, -4(%r1)
stwu %r12, -4(%r1)
stwu %r13, -4(%r1)
stwu %r14, -4(%r1)
stwu %r15, -4(%r1)
stwu %r16, -4(%r1)
stwu %r17, -4(%r1)
stwu %r18, -4(%r1)
stwu %r19, -4(%r1)
stwu %r20, -4(%r1)
stwu %r21, -4(%r1)
stwu %r22, -4(%r1)
stwu %r23, -4(%r1)
stwu %r24, -4(%r1)
stwu %r25, -4(%r1)
stwu %r26, -4(%r1)
stwu %r27, -4(%r1)
stwu %r28, -4(%r1)
stwu %r29, -4(%r1)
stwu %r30, -4(%r1)
stwu %r31, -4(%r1)
/* save some of the other regs */
mffs %f0
stfsu %f0, -4(%r1) /* push FPSCR */
mfctr %r0
stwu %r0, -4(%r1) /* push CTR */
mfxer %r0
stwu %r0, -4(%r1) /* push XER */
mfcr %r0
stwu %r0, -4(%r1) /* push CR */
lwz %r0, 20(%r2) /* original LR */
stwu %r0, -4(%r1) /* push LR */
mfspr %r0, %dsisr
stwu %r0, -4(%r1) /* push DSISR */
mfspr %r0, %dar
stwu %r0, -4(%r1) /* push DAR */
mfspr %r0, %srr1
stwu %r0, -4(%r1) /* push SRR1 */
mfspr %r0, %srr0
stwu %r0, -4(%r1) /* push SRR0 */
stwu %r3, -4(%r1) /* exception vector offset */
blr
/* called at the tail end of each of the exceptions
* r1: iframe pointer
*/
__44x_restore_regs_and_rfi:
lwzu %r0, 4(%r1) /* SRR0 (skip vector offset) */
mtspr %srr0, %r0
lwzu %r0, 4(%r1) /* SRR1 */
mtspr %srr1, %r0
lwzu %r0, 4(%r1) /* DAR */
mtspr %dar, %r0
lwzu %r0, 4(%r1) /* DSISR */
mtspr %dsisr, %r0
lwzu %r0, 4(%r1) /* LR */
mtlr %r0
lwzu %r0, 4(%r1) /* CR */
mtcr %r0
lwzu %r0, 4(%r1) /* XER */
mtxer %r0
lwzu %r0, 4(%r1) /* CTR */
mtctr %r0
lfsu %f0, 4(%r1) /* FPSCR */
mtfsf 0xff, %f0
lwzu %r31, 4(%r1)
lwzu %r30, 4(%r1)
lwzu %r29, 4(%r1)
lwzu %r28, 4(%r1)
lwzu %r27, 4(%r1)
lwzu %r26, 4(%r1)
lwzu %r25, 4(%r1)
lwzu %r24, 4(%r1)
lwzu %r23, 4(%r1)
lwzu %r22, 4(%r1)
lwzu %r21, 4(%r1)
lwzu %r20, 4(%r1)
lwzu %r19, 4(%r1)
lwzu %r18, 4(%r1)
lwzu %r17, 4(%r1)
lwzu %r16, 4(%r1)
lwzu %r15, 4(%r1)
lwzu %r14, 4(%r1)
lwzu %r13, 4(%r1)
lwzu %r12, 4(%r1)
lwzu %r11, 4(%r1)
lwzu %r10, 4(%r1)
lwzu %r9, 4(%r1)
lwzu %r8, 4(%r1)
lwzu %r7, 4(%r1)
lwzu %r6, 4(%r1)
lwzu %r5, 4(%r1)
lwzu %r4, 4(%r1)
lwzu %r3, 4(%r1)
/* Stop here, before we overwrite r1, and continue with the floating point
registers first. */
addi %r2, %r1, 16 /* skip r3-r0 */
/* f31-f0 */
lfd %f31, 0(%r2)
lfdu %f30, 8(%r2)
lfdu %f29, 8(%r2)
lfdu %f28, 8(%r2)
lfdu %f27, 8(%r2)
lfdu %f26, 8(%r2)
lfdu %f25, 8(%r2)
lfdu %f24, 8(%r2)
lfdu %f23, 8(%r2)
lfdu %f22, 8(%r2)
lfdu %f21, 8(%r2)
lfdu %f20, 8(%r2)
lfdu %f19, 8(%r2)
lfdu %f18, 8(%r2)
lfdu %f17, 8(%r2)
lfdu %f16, 8(%r2)
lfdu %f15, 8(%r2)
lfdu %f14, 8(%r2)
lfdu %f13, 8(%r2)
lfdu %f12, 8(%r2)
lfdu %f11, 8(%r2)
lfdu %f10, 8(%r2)
lfdu %f9, 8(%r2)
lfdu %f8, 8(%r2)
lfdu %f7, 8(%r2)
lfdu %f6, 8(%r2)
lfdu %f5, 8(%r2)
lfdu %f4, 8(%r2)
lfdu %f3, 8(%r2)
lfdu %f2, 8(%r2)
lfdu %f1, 8(%r2)
lfd %f0, 8(%r2)
/* r2-r0 */
lwzu %r2, 4(%r1)
lwz %r0, 8(%r1)
lwz %r1, 4(%r1)
/* return from interrupt */
rfi
+139 -3
View File
@@ -9,12 +9,17 @@
#include <KernelExport.h>
#include <arch/generic/debug_uart.h>
#include <boot/kernel_args.h>
#include <platform/openfirmware/openfirmware.h>
#include <real_time_clock.h>
#include <util/kernel_cpp.h>
// TODO: declare this in some header
extern void *gFDT;
extern "C" DebugUART *debug_uart_from_fdt(const void *fdt);
static PPCPlatform *sPPCPlatform;
@@ -225,18 +230,149 @@ PPCOpenFirmware::ShutDown(bool reboot)
}
// #pragma mark - U-Boot + FDT
namespace BPrivate {
class PPCUBoot : public PPCPlatform {
public:
PPCUBoot();
virtual ~PPCUBoot();
virtual status_t Init(struct kernel_args *kernelArgs);
virtual status_t InitSerialDebug(struct kernel_args *kernelArgs);
virtual status_t InitPostVM(struct kernel_args *kernelArgs);
virtual status_t InitRTC(struct kernel_args *kernelArgs,
struct real_time_data *data);
virtual char SerialDebugGetChar();
virtual void SerialDebugPutChar(char c);
virtual void SetHardwareRTC(uint32 seconds);
virtual uint32 GetHardwareRTC();
virtual void ShutDown(bool reboot);
private:
int fInput;
int fOutput;
int fRTC;
DebugUART *fDebugUART;
};
} // namespace BPrivate
using BPrivate::PPCUBoot;
// constructor
PPCUBoot::PPCUBoot()
: PPCPlatform(PPC_PLATFORM_U_BOOT),
fInput(-1),
fOutput(-1),
fRTC(-1),
fDebugUART(NULL)
{
}
// destructor
PPCUBoot::~PPCUBoot()
{
}
// Init
status_t
PPCUBoot::Init(struct kernel_args *kernelArgs)
{
gFDT = kernelArgs->platform_args.fdt;
// XXX: do we error out if no FDT?
return B_OK;
}
// InitSerialDebug
status_t
PPCUBoot::InitSerialDebug(struct kernel_args *kernelArgs)
{
fDebugUART = debug_uart_from_fdt(gFDT);
if (fDebugUART == NULL)
return B_ERROR;
return B_OK;
}
// InitPostVM
status_t
PPCUBoot::InitPostVM(struct kernel_args *kernelArgs)
{
return B_ERROR;
}
// InitRTC
status_t
PPCUBoot::InitRTC(struct kernel_args *kernelArgs,
struct real_time_data *data)
{
return B_ERROR;
}
// DebugSerialGetChar
char
PPCUBoot::SerialDebugGetChar()
{
if (fDebugUART)
return fDebugUART->GetChar(false);
return 0;
}
// DebugSerialPutChar
void
PPCUBoot::SerialDebugPutChar(char c)
{
if (fDebugUART)
fDebugUART->PutChar(c);
}
// SetHardwareRTC
void
PPCUBoot::SetHardwareRTC(uint32 seconds)
{
}
// GetHardwareRTC
uint32
PPCUBoot::GetHardwareRTC()
{
return 0;
}
// ShutDown
void
PPCUBoot::ShutDown(bool reboot)
{
}
// # pragma mark -
#define PLATFORM_BUFFER_SIZE MAX(sizeof(PPCOpenFirmware),sizeof(PPCUBoot))
// static buffer for constructing the actual PPCPlatform
static char *sPPCPlatformBuffer[sizeof(PPCOpenFirmware)];
static char *sPPCPlatformBuffer[PLATFORM_BUFFER_SIZE];
status_t
arch_platform_init(struct kernel_args *kernelArgs)
{
// only OpenFirmware supported for now
if (true)
sPPCPlatform = new(sPPCPlatformBuffer) PPCOpenFirmware;
switch (kernelArgs->arch_args.platform) {
case PPC_PLATFORM_OPEN_FIRMWARE:
sPPCPlatform = new(sPPCPlatformBuffer) PPCOpenFirmware;
break;
case PPC_PLATFORM_U_BOOT:
sPPCPlatform = new(sPPCPlatformBuffer) PPCUBoot;
break;
default:
return B_ERROR;
}
return sPPCPlatform->Init(kernelArgs);
}
+11 -10
View File
@@ -110,6 +110,15 @@ x86_set_tls_context(Thread *thread)
}
static addr_t
arch_randomize_stack_pointer(addr_t value)
{
STATIC_ASSERT(MAX_RANDOM_VALUE >= B_PAGE_SIZE - 1);
value -= random_value() & (B_PAGE_SIZE - 1);
return value & ~addr_t(0xf);
}
static uint8*
get_signal_stack(Thread* thread, struct iframe* frame, struct sigaction* action)
{
@@ -119,7 +128,8 @@ get_signal_stack(Thread* thread, struct iframe* frame, struct sigaction* action)
&& (frame->user_sp < thread->signal_stack_base
|| frame->user_sp >= thread->signal_stack_base
+ thread->signal_stack_size)) {
return (uint8*)(thread->signal_stack_base + thread->signal_stack_size);
addr_t stackTop = thread->signal_stack_base + thread->signal_stack_size;
return (uint8*)arch_randomize_stack_pointer(stackTop);
}
return (uint8*)frame->user_sp;
@@ -202,15 +212,6 @@ arch_thread_dump_info(void *info)
}
static addr_t
arch_randomize_stack_pointer(addr_t value)
{
STATIC_ASSERT(MAX_RANDOM_VALUE >= B_PAGE_SIZE - 1);
value -= random_value() & (B_PAGE_SIZE - 1);
return value & ~addr_t(0xf);
}
/*! Sets up initial thread context and enters user space
*/
status_t
+11 -10
View File
@@ -95,6 +95,15 @@ x86_set_tls_context(Thread* thread)
}
static addr_t
arch_randomize_stack_pointer(addr_t value)
{
STATIC_ASSERT(MAX_RANDOM_VALUE >= B_PAGE_SIZE - 1);
value -= random_value() & (B_PAGE_SIZE - 1);
return value & ~addr_t(0xf);
}
static uint8*
get_signal_stack(Thread* thread, iframe* frame, struct sigaction* action)
{
@@ -104,7 +113,8 @@ get_signal_stack(Thread* thread, iframe* frame, struct sigaction* action)
&& (frame->user_sp < thread->signal_stack_base
|| frame->user_sp >= thread->signal_stack_base
+ thread->signal_stack_size)) {
return (uint8*)(thread->signal_stack_base + thread->signal_stack_size);
addr_t stackTop = thread->signal_stack_base + thread->signal_stack_size;
return (uint8*)arch_randomize_stack_pointer(stackTop);
}
// We are going to use the stack that we are already on. We must not touch
@@ -198,15 +208,6 @@ arch_thread_dump_info(void* info)
}
static addr_t
arch_randomize_stack_pointer(addr_t value)
{
STATIC_ASSERT(MAX_RANDOM_VALUE >= B_PAGE_SIZE - 1);
value -= random_value() & (B_PAGE_SIZE - 1);
return value & ~addr_t(0xf);
}
/*! Sets up initial thread context and enters user space
*/
status_t
+18
View File
@@ -3,6 +3,24 @@ SubDir HAIKU_TOP src system kernel platform u-boot ;
SubDirCcFlags $(TARGET_KERNEL_PIC_CCFLAGS) ;
SubDirC++Flags $(TARGET_KERNEL_PIC_CCFLAGS) ;
UseLibraryHeaders [ FDirName libfdt ] ;
local libFDTSources =
fdt.c
fdt_ro.c
fdt_rw.c
fdt_strerror.c
fdt_sw.c
fdt_wip.c
;
KernelMergeObject kernel_platform_u-boot.o :
platform.cpp
fdt_support.cpp
openfirmware.cpp
$(libFDTSources)
;
SEARCH on [ FGristFiles $(libFDTSources) ]
= [ FDirName $(HAIKU_TOP) src libs libfdt ] ;
@@ -9,14 +9,22 @@
#include <stdio.h>
#include <sys/cdefs.h>
#include <arch/generic/debug_uart.h>
#include <arch/generic/debug_uart_8250.h>
extern "C" {
#include <fdt.h>
#include <libfdt.h>
#include <libfdt_env.h>
};
#ifndef _BOOT_MODE
/* the bootloader has it in asm code to avoid it ending up in .bss */
void *gFDT;
#endif
extern "C" void dump_fdt(const void *fdt);
extern "C" DebugUART *debug_uart_from_fdt(const void *fdt);
//#define FDT_DUMP_NODES
//#define FDT_DUMP_PROPS
@@ -61,7 +69,7 @@ void dump_fdt(const void *fdt)
int err;
dprintf("FDT @ %p:\n", fdt);
if (!fdt)
return;
@@ -113,3 +121,84 @@ void dump_fdt(const void *fdt)
}
DebugUART *
debug_uart_from_fdt(const void *fdt)
{
const char *name;
const char *type;
int node;
int len;
phys_addr_t regs;
int32 clock = 0;
int32 speed = 0;
const void *prop;
DebugUART *uart = NULL;
if (fdt == NULL)
return NULL;
name = fdt_get_alias(fdt, "serial");
if (name == NULL)
name = fdt_get_alias(fdt, "serial0");
if (name == NULL)
name = fdt_get_alias(fdt, "serial1");
// TODO: else use /chosen linux,stdout-path
if (name == NULL)
return NULL;
node = fdt_path_offset(fdt, name);
//dprintf("serial: using '%s', node %d\n", name, node);
if (node < 0)
return NULL;
type = (const char *)fdt_getprop(fdt, node, "device_type", &len);
//dprintf("serial: type: '%s'\n", type);
if (type == NULL || strcmp(type, "serial"))
return NULL;
// determine the MMIO address
// TODO: ppc460 use 64bit addressing, but U-Boot seems to map it below 4G,
// and the FDT is not very clear. libfdt is also getting 64bit addr support.
// so FIXME someday.
prop = fdt_getprop(fdt, node, "virtual-reg", &len);
if (prop && len == 4) {
regs = fdt32_to_cpu(*(uint32_t *)prop);
//dprintf("serial: virtual-reg 0x%08llx\n", (int64)regs);
} else {
prop = fdt_getprop(fdt, node, "reg", &len);
if (prop && len >= 4) {
regs = fdt32_to_cpu(*(uint32_t *)prop);
//dprintf("serial: reg 0x%08llx\n", (int64)regs);
} else
return NULL;
}
// get the UART clock rate
prop = fdt_getprop(fdt, node, "clock-frequency", &len);
if (prop && len == 4) {
clock = fdt32_to_cpu(*(uint32_t *)prop);
//dprintf("serial: clock %ld\n", clock);
}
// get current speed (XXX: not yet passed over)
prop = fdt_getprop(fdt, node, "current-speed", &len);
if (prop && len == 4) {
speed = fdt32_to_cpu(*(uint32_t *)prop);
//dprintf("serial: speed %ld\n", speed);
}
if (fdt_node_check_compatible(fdt, node, "ns16550a") == 1
|| fdt_node_check_compatible(fdt, node, "ns16550") == 1) {
uart = arch_get_uart_8250(regs, clock);
//dprintf("serial: using 8250\n");
// XXX:assume speed is already set
(void)speed;
} else {
// TODO: handle more UART types
// for when we can use U-Boot's console
panic("Unknown UART type %s", type);
}
return uart;
}
@@ -0,0 +1,344 @@
/*
* Copyright 2003, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#include <platform/openfirmware/devices.h>
#include <platform/openfirmware/openfirmware.h>
#include <stdarg.h>
#include <KernelExport.h>
extern "C" {
#include <fdt.h>
#include <libfdt.h>
#include <libfdt_env.h>
};
#define TRACE_OF
#ifdef TRACE_OF
# define TRACE(x) dprintf x
#else
# define TRACE(x) ;
#endif
// FIXME: HACK: until we support multiple platforms at once in the kernel.
extern void *gFDT;
int gChosen;
static int fdt2of(int err)
{
if (err >= 0)
return err;
switch (err) {
case -FDT_ERR_NOTFOUND:
case -FDT_ERR_EXISTS:
case -FDT_ERR_NOSPACE:
case -FDT_ERR_BADOFFSET:
case -FDT_ERR_BADPATH:
case -FDT_ERR_BADPHANDLE:
case -FDT_ERR_BADSTATE:
case -FDT_ERR_TRUNCATED:
case -FDT_ERR_BADMAGIC:
case -FDT_ERR_BADVERSION:
case -FDT_ERR_BADSTRUCTURE:
case -FDT_ERR_BADLAYOUT:
case -FDT_ERR_INTERNAL:
default:
return OF_FAILED;
}
}
status_t
of_init(int (*openFirmwareEntry)(void *))
{
if (gFDT == NULL)
return OF_FAILED;
gChosen = fdt2of(fdt_path_offset(gFDT, "/chosen"));
if (gChosen == OF_FAILED)
return B_ERROR;
return B_OK;
}
int
of_call_client_function(const char *method, int numArgs, int numReturns, ...)
{
return OF_FAILED;
}
int
of_interpret(const char *command, int numArgs, int numReturns, ...)
{
return OF_FAILED;
}
int
of_call_method(int handle, const char *method, int numArgs, int numReturns, ...)
{
return OF_FAILED;
}
int
of_finddevice(const char *device)
{
const char *name = device;
int node;
if (device == NULL)
return OF_FAILED;
if (device[0] != '/' && fdt_get_alias(gFDT, device))
name = fdt_get_alias(gFDT, device);
node = fdt_path_offset(gFDT, name);
TRACE(("of_finddevice('%s') name='%s' node=%d ret=%d\n", device, name, node,
fdt2of(node)));
return fdt2of(node);
}
status_t
of_get_next_device(int *_cookie, int root, const char *type, char *path,
size_t pathSize)
{
int next;
int err;
int startoffset = *_cookie ? *_cookie : -1;
// iterate by property value
next = fdt_node_offset_by_prop_value(gFDT, startoffset, "device_type",
type, strlen(type) + 1);
TRACE(("of_get_next_device(c:%d, %d, '%s', %p, %zd) soffset=%d next=%d\n",
*_cookie, root, type, path, pathSize, startoffset, fdt2of(next)));
if (next < 0)
return B_ENTRY_NOT_FOUND;
// make sure root is the parent
int parent = next;
while (root && parent) {
parent = fdt_parent_offset(gFDT, parent);
if (parent == root)
break;
if (parent <= 0)
return B_ENTRY_NOT_FOUND;
}
*_cookie = next;
err = fdt_get_path(gFDT, next, path, pathSize);
if (err < 0)
return B_ERROR;
return B_OK;
}
/** Returns the first child of the given node
*/
int
of_child(int node)
{
return OF_FAILED;
}
/** Returns the next sibling of the given node
*/
int
of_peer(int node)
{
return OF_FAILED;
}
/** Returns the parent of the given node
*/
int
of_parent(int node)
{
return OF_FAILED;
}
int
of_instance_to_path(int instance, char *pathBuffer, int bufferSize)
{
return OF_FAILED;
}
int
of_instance_to_package(int instance)
{
return OF_FAILED;
}
int
of_getprop(int package, const char *property, void *buffer, int bufferSize)
{
int oldSize = bufferSize;
const void *p = fdt_getprop(gFDT, package, property, &bufferSize);
TRACE(("of_getprop(%d, '%s', , %d) =%p sz=%d ret=%d\n", package, property,
oldSize, p, bufferSize, fdt2of(bufferSize)));
if (p == NULL)
return fdt2of(bufferSize);
memcpy(buffer, p, bufferSize);
return bufferSize;
}
int
of_setprop(int package, const char *property, const void *buffer, int bufferSize)
{
return OF_FAILED;
}
int
of_getproplen(int package, const char *property)
{
return OF_FAILED;
}
int
of_nextprop(int package, const char *previousProperty, char *nextProperty)
{
return OF_FAILED;
}
int
of_package_to_path(int package, char *pathBuffer, int bufferSize)
{
return OF_FAILED;
}
/** given the package provided, get the number of cells
+ in the reg property
+ */
int32
of_address_cells(int package) {
uint32 address_cells;
if (of_getprop(package, "#address-cells",
&address_cells, sizeof(address_cells)) == OF_FAILED)
return OF_FAILED;
return address_cells;
}
int32
of_size_cells(int package) {
uint32 size_cells;
if (of_getprop(package, "#size-cells",
&size_cells, sizeof(size_cells)) == OF_FAILED)
return OF_FAILED;
return size_cells;
}
// I/O functions
int
of_open(const char *nodeName)
{
return OF_FAILED;
}
void
of_close(int handle)
{
}
int
of_read(int handle, void *buffer, int bufferSize)
{
return OF_FAILED;
}
int
of_write(int handle, const void *buffer, int bufferSize)
{
return OF_FAILED;
}
int
of_seek(int handle, long long pos)
{
return OF_FAILED;
}
// memory functions
int
of_release(void *virtualAddress, int size)
{
return OF_FAILED;
}
void *
of_claim(void *virtualAddress, int size, int align)
{
return NULL;
}
// misc functions
/** tests if the given service is missing
*/
int
of_test(const char *service)
{
return OF_FAILED;
}
/** Returns the millisecond counter
*/
int
of_milliseconds(void)
{
return OF_FAILED;
}
void
of_exit(void)
{
}
+30
View File
@@ -91,6 +91,36 @@ SECTIONS
_end = . ;
/* Stabs debugging sections. */
.stab 0 : { *(.stab) }
.stabstr 0 : { *(.stabstr) }
/* DWARF debug sections.
Symbols in the DWARF debugging sections are relative to the beginning
of the section so we begin them at 0. */
/* DWARF 1 */
.debug 0 : { *(.debug) }
.line 0 : { *(.line) }
/* GNU DWARF 1 extensions */
.debug_srcinfo 0 : { *(.debug_srcinfo) }
.debug_sfnames 0 : { *(.debug_sfnames) }
/* DWARF 1.1 and DWARF 2 */
.debug_aranges 0 : { *(.debug_aranges) }
.debug_pubnames 0 : { *(.debug_pubnames) }
/* DWARF 2 */
.debug_info 0 : { *(.debug_info) }
.debug_abbrev 0 : { *(.debug_abbrev) }
.debug_line 0 : { *(.debug_line) }
.debug_frame 0 : { *(.debug_frame) }
.debug_str 0 : { *(.debug_str) }
.debug_loc 0 : { *(.debug_loc) }
.debug_macinfo 0 : { *(.debug_macinfo) }
/* SGI/MIPS DWARF 2 extensions */
.debug_weaknames 0 : { *(.debug_weaknames) }
.debug_funcnames 0 : { *(.debug_funcnames) }
.debug_typenames 0 : { *(.debug_typenames) }
.debug_varnames 0 : { *(.debug_varnames) }
/* These must appear regardless of . */
/* Strip unnecessary stuff */
/DISCARD/ : { *(.comment .note .eh_frame .dtors .debug_*) }
+9 -86
View File
@@ -4,14 +4,15 @@
*/
#include <asm_defs.h>
#include <arch_config.h>
.text
#ifndef ATOMIC_FUNCS_ARE_SYSCALLS
/* int atomic_add(int *value, int increment)
*/
FUNCTION(atomic_add):
#if __ARM_ARCH__ >= 6
miss1: ldrex r12, [r0]
add r2, r12, r1
strex r3, r2, [r0]
@@ -19,25 +20,6 @@ miss1: ldrex r12, [r0]
bne miss1
mov r0, r12
bx lr
#else
/* disable interrupts, do the add, and reenable */
mrs r2, cpsr
mov r12, r2
orr r2, r2, #(3<<6)
msr cpsr_c, r2
/* ints disabled, old cpsr state in r12 */
/* do the add, leave the previous value in r0 */
mov r3, r0
ldr r0, [r3]
add r2, r0, r1
str r2, [r3]
/* restore interrupts and exit */
msr cpsr_c, r12
bx lr
#endif
FUNCTION_END(atomic_add)
@@ -46,7 +28,6 @@ FUNCTION_END(atomic_add)
/* int atomic_and(int *value, int andValue)
*/
FUNCTION(atomic_and):
#if __ARM_ARCH__ >= 6
miss2: ldrex r12, [r0]
and r2, r12, r1
strex r3, r2, [r0]
@@ -54,33 +35,11 @@ miss2: ldrex r12, [r0]
bne miss2
mov r0, r12
bx lr
#else
/* disable interrupts, do the and, and reenable */
mrs r2, cpsr
mov r12, r2
orr r2, r2, #(3<<6)
msr cpsr_c, r2
/* ints disabled, old cpsr state in r12 */
/* do the and, leave the previous value in r0 */
mov r3, r0
ldr r0, [r3]
and r2, r0, r1
str r2, [r3]
/* restore interrupts and exit */
msr cpsr_c, r12
bx lr
#endif
FUNCTION_END(atomic_and)
/* int atomic_or(int *value, int orValue)
*/
FUNCTION(atomic_or):
#if __ARM_ARCH__ >= 6
miss3: ldrex r12, [r0]
eor r2, r12, r1
strex r3, r2, [r0]
@@ -88,48 +47,21 @@ miss3: ldrex r12, [r0]
bne miss3
mov r0, r12
bx lr
#else
/* disable interrupts, do the or, and reenable */
mrs r2, cpsr
mov r12, r2
orr r2, r2, #(3<<6)
msr cpsr_c, r2
/* ints disabled, old cpsr state in r12 */
/* do the or, leave the previous value in r0 */
mov r3, r0
ldr r0, [r3]
orr r2, r0, r1
str r2, [r3]
/* restore interrupts and exit */
msr cpsr_c, r12
bx lr
#endif
FUNCTION_END(atomic_or)
/* int atomic_set(int *value, int setTo)
*/
FUNCTION(atomic_set):
#if __ARM_ARCH__ >= 6
miss4: ldrex r12, [r0]
strex r3, r1, [r0]
teq r3, #0
bne miss4
bx lr
#else
mov r3, r0
swp r0, r1, [r3]
bx lr
#endif
FUNCTION_END(atomic_set)
/* int atomic_test_and_set(int *value, int setTo, int testValue)
*/
FUNCTION(atomic_test_and_set):
#if __ARM_ARCH__ >= 6
miss5: ldrex r12, [r0] @ load from the address and mark it exclusive
cmp r12, r2 @ compare the value with the comperand(r2)
strexeq r3, r1, [r0] @ if they were equal, attempt to store the new value (r1)
@@ -139,21 +71,6 @@ miss5: ldrex r12, [r0] @ load from the address and
bne same @ if it succeeded, jump to (same) and return. there is no need to clrex if strex succeeded
differ: clrex @ clrex
same: mov r0, r12
#else
/* disable interrupts, and save state */
mrs r3, cpsr
mov r12, r3
orr r3, r3, #(3<<6)
msr cpsr_c, r3
mov r3, r0
ldr r0, [r3]
cmp r0, r2
streq r1, [r3]
/* restore interrupts and exit */
msr cpsr_c, r12
#endif
bx lr
FUNCTION_END(atomic_test_and_set)
@@ -168,6 +85,10 @@ FUNCTION(__sync_fetch_and_add_4):
bx lr
FUNCTION_END(__sync_fetch_and_add_4)
#endif
#ifndef ATOMIC64_FUNCS_ARE_SYSCALLS
/* int64 atomic_add64(vint64 *value, int64 addValue) */
FUNCTION(atomic_add64):
bx lr
@@ -197,3 +118,5 @@ FUNCTION_END(atomic_test_and_set64)
FUNCTION(atomic_get64):
bx lr
FUNCTION_END(atomic_get64)
#endif /* ATOMIC64_FUNCS_ARE_SYSCALLS */
+1 -1
View File
@@ -110,6 +110,7 @@ spawn_thread(thread_func entry, const char *name, int32 priority, void *data)
__pthread_init_creation_attributes(NULL, thread, &thread_entry, entry,
thread, name, &attributes);
thread->flags |= THREAD_DETACHED;
attributes.priority = priority;
@@ -256,4 +257,3 @@ snooze_until(bigtime_t timeout, int timeBase)
{
return _kern_snooze_etc(timeout, timeBase, B_ABSOLUTE_TIMEOUT, NULL);
}
@@ -5,16 +5,13 @@
#include <asm_defs.h>
//#include "setjmp_internal.h"
/* int __siglongjmp(jmp_buf buffer, int value) */
FUNCTION(siglongjmp):
FUNCTION(longjmp):
FUNCTION(_longjmp):
str r1,[r0]
ldmia r0,{r0-r14}
bx lr
// bl __longjmp_return
str r1, [r0, #4]
ldmia r0, {r0-r14}
b __longjmp_return
FUNCTION_END(siglongjmp)
FUNCTION_END(longjmp)
FUNCTION_END(_longjmp)
+11 -19
View File
@@ -5,33 +5,25 @@
#include <asm_defs.h>
//#include "setjmp_internal.h"
/* int sigsetjmp(jmp_buf buffer, int saveMask) */
FUNCTION(__sigsetjmp):
FUNCTION(sigsetjmp):
stmdb sp!, {r4, lr}
stmia r0, {r0-r14}
str lr,[r0, #60]
mrs r1,cpsr
str r1,[r0,#64]
ldr r1,[r0,#4]
mov r0, #0
bl __setjmp_save_sigs
ldmia sp!, {r4, pc}
FUNCTION_END(__sigsetjmp)
stmia r0, {r0-r14}
mrs r1, cpsr
str r1, [r0, #64]
ldr r1, [r0, #4]
b __setjmp_save_sigs
FUNCTION_END(sigsetjmp)
FUNCTION_END(__sigsetjmp)
/* int setjmp(jmp_buf buffer) */
FUNCTION(setjmp):
stmia r0, {r0-r14}
str lr,[r0, #60]
mrs r1,cpsr
str r1,[r0,#64]
ldr r1,[r0,#4]
mov r0, #0
stmia r0, {r0-r14}
mrs r1, cpsr
str r1, [r0, #64]
ldr r1, [r0, #4]
mov r0, #0
bx lr
FUNCTION_END(setjmp)