Created residual data for the PCI bus, serial port and SCSI adapter. This is the minimal set to boot AIX. And AIX is booting using this residual data, not the hard coded ones. So now I have a reference firmware which works on a physical machine. Here is the complete boot log (mostly for search engines, and digital archaeologists):
The next step would be to get it working under QEMU.
Under QEMU it gets pretty far, it does find the PCI- and the ISA buses and even the SCSI host.
Unfortunately it doesn't find SCSI disks. Here it is tricky, it may be a problem with the interrupt routing, or DMA or SCSI host emulation.
/Stay tuned
MOT PowerStack2 (e0), Serial #0, 62 MiB memory installed Open Firmware , Built August 25, 2017 23:09:26 Copyright (c) 1995-2000, FirmWorks. Copyright (c) 2014,2017, Artyom Tarasenko. ok boot /scsi/disk@6 -s prompt Boot device: /scsi/disk@6 Arguments: -s prompt 0) - DISABLE_PARITY 16) - ENABLE_END_STOP 1) - DISABLE_DCACHE 17) - ENABLE_DEBUG 2) - DISABLE_ICACHE 18) + DISABLE_VME 3) - DISABLE_L2 19) + ENABLE_BH_IDE_DMA 4) - DISABLE_SSCALAR 20) + WINBOND_PATCH 5) - DISABLE_BHIST 21) - MANUAL_SCSI_TYPE 6) - DISABLE_CPU_EMCP 7) - DISABLE_EAGLE_CF_DPARK 8) - DISABLE_EAGLE_CF_APARK 9) - DISABLE_LEDS 10) - EAGLE_ERR_STATUS_RESET 11) + DISABLE_MASTER_ABORT 12) - AIX_USES_BUG 13) + JUNO_DISCONTIGUOUS 14) - LLDB_STOP 15) - SERVICE_MODE 31) - DISABLE_HARDSTOPS Enter bit # to toggle (just <CR> to end): 17 0) - Top level debug - function names 1) - Main line debug messages 2) - Subroutine internal messages 3) - PCI Bridge settings 10) - GEV Data debug 12) - IPLCB data 15) - IPL control block offsets Enter bit #(s) to toggle, '*' for ALL enabled, 'C' to clear ALL, or just <CR> to return): * 0) - DISABLE_PARITY 16) - ENABLE_END_STOP 1) - DISABLE_DCACHE 17) + ENABLE_DEBUG 2) - DISABLE_ICACHE 18) + DISABLE_VME 3) - DISABLE_L2 19) + ENABLE_BH_IDE_DMA 4) - DISABLE_SSCALAR 20) + WINBOND_PATCH 5) - DISABLE_BHIST 21) - MANUAL_SCSI_TYPE 6) - DISABLE_CPU_EMCP 7) - DISABLE_EAGLE_CF_DPARK 8) - DISABLE_EAGLE_CF_APARK 9) - DISABLE_LEDS 10) - EAGLE_ERR_STATUS_RESET 11) + DISABLE_MASTER_ABORT 12) - AIX_USES_BUG 13) + JUNO_DISCONTIGUOUS 14) - LLDB_STOP 15) - SERVICE_MODE 31) - DISABLE_HARDSTOPS Enter bit # to toggle (just <CR> to end): 0x4fd0 Hints relocation 0x5000 SoftROS start() after relocation 0x39728 SoftROS end after relocations 0x3951c SoftROS start of bss 0x39727 SoftROS end of bss 0x39750 Current sbrk(0) 0x596ac Current stack Space reserved for kernel when IPLCB is being built @ 0x59728 Original bootimage located @ 0x400000 hi->signature = 0x4149584d hi->resid_data_address = 0x3dd7970 hi->bss_offset = 0x3951c hi->bss_length = 0x20c hi->jump_offset = 0x38c hi->load_exec_address = 0x400430 hi->header_size = 0x400 hi->header_block_size = 0x25e hi->image_length = 0x4b75b hi->Spare = 0x3cb419c hi->res_mem_size = 0x0 hi->mode_control = 0xdead00c0 LED(MOTLED_CHECKING_HARDSTOPS)=0x130c Magic is 0x01DF0004 Image size .............. 0x0035A000 Boot image loaded at .... 0x0044BC00 Saved address for jump .. 0x0000038C LED(MOTLED_INVALID_BOOT_IMAGE)=0x1310 LED(MOTLED_FIRST_KERNEL_MOVE)=0x1308 LED(MOTLED_HARDWARE_INIT)=0x130b mot_gencmd.c ====> pj_motorola mot_gencmd.c ====> Machine Check Pin was disabled by F/W LED(MOTLED_ENABLING_CPU_EMCP)=0x1318 LED(MOTLED_ENABLING_DCACHE)=0x131a LED(MOTLED_ENABLING_604_SSCALAR)=0x131c LED(MOTLED_ENABLING_604_BHIST)=0x131d LED(MOTLED_HARDWARE_INIT_COMPLETE)=0x1320 LED(MOTLED_IPLCB_INIT)=0x1309 iplcb_init.c ====> - iplcb_init() iplcb_init.c ====> - mem_find() Mem_addr = 0x3c74000, byte_index = 0x1ef, bit_index = 0x4 Returned from mem_find: IPLCB addr: ..... 0x03C74000 len = 49152 DMA buffer addr: 0x00FF8000 Memory bitmap addr0x03C7FE10 Serial # from residual data: 4d 4f 54 30 45 32 33 34 41 43 20 20 20 20 20 20 nvram_addr = 0x0074, nvram_data = 0x0077 Name = board-init? <--> Value = true Match = FALSE Name = use-default-vals? <--> Value = true Match = FALSE Name = edo-memory? <--> Value = false Match = FALSE Name = pboot-probe? <--> Value = false Match = FALSE Name = pboot-device-default <--> Value = fdisk0 hdisk0 enet0 Match = FALSE Name = fcode-debug? <--> Value = true<FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF> <FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF><FF> <FF><FF> Match = FALSE Name = fw-boot-device <--> Value = /pci@80000000/pci1000,3@2,0/harddisk@6,0 Match = TRUE The IPLCB previpl_device string is: !!^A/pci@80000000/pci1000,3@2,0/harddisk@6,0 processor = 0x00000009 presoftros.c ====> - __mot_eth_addr() Memory address of IPL Control Block = 0x03C74000 Directory: ......... 0x03C74080 offset: 0x00000080 IPL_info: .......... 0x03C742E0 offset: 0x000002E0 System area: ....... 0x03C74878 offset: 0x00000878 Buc Data area: ..... 0x03C749F4 offset: 0x00000914 Processor data area: 0x03C74A64 offset: 0x00000A64 Network data area: . 0x03C74D7C offset: 0x00000D7C Memory data area: .. 0x03C7677C offset: 0x0000277C L2_cache data area: 0x03C768B4 offset: 0x000028B4 Residual data area: 0x03C76974 offset: 0x00002974 ros_table area: .... 0x03C7D3E0 NVRAM cache area: .. 0x03C7D4C8 offset: 0x000094C8 Parameters passed to kernel boot image: 0x3c74000, 0xbe10, 0x4000, 0x1f0 LED(MOTLED_IPLCB_DUMP)=0x130a IPLD.ipl_info_offset = 0x2e0 IPLD.ipl_info_size = 0x598 IPLD.system_info_offset = 0x878 IPLD.system_info_size = 0x9c IPLD.buc_info_offset = 0x914 IPLD.buc_info_size = 0x150 IPLD.processor_info_offset = 0xa64 IPLD.processor_info_size = 0x318 IPLD.mem_data_offset = 0x277c IPLD.mem_data_size = 0x138 IPLD.l2_data_offset = 0x28b4 IPLD.l2_data_size = 0xc0 IPLD.bit_map_offset = 0xbe10 IPLD.bit_map_size = 0x1f0 (IPLD.processor_info_size == sizeof(PROCESSOR_DATA)) failed IPLD.user_struct_offset = 0x9380 IPLD.user_struct_size = 0x10 user_info->user_data_offset = 0x9390 user_info->user_data_len = 0x50 IPLD.nvram_cache_offset = 0x94c8 IPLD.nvram_cache_size = 0x2000 ipl_info->model = 0x80000e0 ipl_info->ram_size = 0x3e00000 ipl_info->bit_map_bytes_per_bit = 0x4000 ipl_info->ros_entry_table_ptr = 0x3c7d3e0 ipl_info->ros_entry_table_size = 0xe8 ipl_info->nvram_section_1_valid = 0x1 ipl_info->vpd_processor_serial_number = "00E20000" ipl_info->previpl_device[0] = 0x21 ipl_info->previpl_device[1] = 0x21 ipl_info->previpl_device[2] = 0x1 ipl_info->previpl_device[3] = 0x2f ipl_info->previpl_device[4] = 0x70 ipl_info->previpl_device[5] = 0x63 ipl_info->previpl_device[6] = 0x69 ipl_info->previpl_device[7] = 0x40 ipl_info->previpl_device[8] = 0x38 ipl_info->previpl_device[9] = 0x30 ipl_info->previpl_device[10] = 0x30 ipl_info->previpl_device[11] = 0x30 ipl_info->previpl_device[12] = 0x30 ipl_info->previpl_device[13] = 0x30 ipl_info->previpl_device[14] = 0x30 ipl_info->previpl_device[15] = 0x30 ipl_info->previpl_device[16] = 0x2f ipl_info->previpl_device[17] = 0x70 ipl_info->previpl_device[18] = 0x63 ipl_info->previpl_device[19] = 0x69 ipl_info->previpl_device[20] = 0x31 ipl_info->previpl_device[21] = 0x30 ipl_info->previpl_device[22] = 0x30 ipl_info->previpl_device[23] = 0x30 ipl_info->previpl_device[24] = 0x2c ipl_info->previpl_device[25] = 0x33 ipl_info->Power_Status_and_keylock_reg = 0x3 buc_info_ptr->num_of_structs = 0x3 buc_info_ptr->index = 0x1 buc_info_ptr->struct_size = 0x70 buc_info_ptr->bsrr_offset = 0x0 buc_info_ptr->bsrr_mask = 0x0 buc_info_ptr->bscr_value = 0x0 buc_info_ptr->cfg_status = 0x2 buc_info_ptr->device_type = 0x5 buc_info_ptr->num_of_buids = 0x0 buc_info_ptr->buid_data[0].buid_value = 0xffffffff buc_info_ptr->buid_data[0].buid_Sptr = 0x0 buc_info_ptr->buid_data[1].buid_value = 0xffffffff buc_info_ptr->buid_data[1].buid_Sptr = 0x0 buc_info_ptr->buid_data[2].buid_value = 0xffffffff buc_info_ptr->buid_data[2].buid_Sptr = 0x0 buc_info_ptr->buid_data[3].buid_value = 0xffffffff buc_info_ptr->buid_data[3].buid_Sptr = 0x0 buc_info_ptr->mem_alloc1 = 0x8000 buc_info_ptr->mem_addr1 = 0xff8000 buc_info_ptr->mem_alloc2 = 0x0 buc_info_ptr->mem_addr2 = 0x0 buc_info_ptr->vpd_rom_width = 0xffffffff buc_info_ptr->cfg_addr_inc = 0x0 buc_info_ptr->device_id_reg = 0x2040 buc_info_ptr->aux_info_offset = 0x0 buc_info_ptr->feature_rom_code = 0x0 buc_info_ptr->IOCC_flag = 0x0 buc_info_ptr->location[0] = 0x30 buc_info_ptr->location[1] = 0x30 buc_info_ptr->location[2] = 0x30 buc_info_ptr->location[3] = 0x30 buc_info_ptr->num_of_structs = 0x3 buc_info_ptr->index = 0x2 buc_info_ptr->struct_size = 0x70 buc_info_ptr->bsrr_offset = 0x0 buc_info_ptr->bsrr_mask = 0x0 buc_info_ptr->bscr_value = 0x0 buc_info_ptr->cfg_status = 0x2 buc_info_ptr->device_type = 0x5 buc_info_ptr->num_of_buids = 0x2 buc_info_ptr->buid_data[0].buid_value = 0x100 buc_info_ptr->buid_data[0].buid_Sptr = 0x80000000 buc_info_ptr->buid_data[1].buid_value = 0x10100 buc_info_ptr->buid_data[1].buid_Sptr = 0xc0000000 buc_info_ptr->buid_data[2].buid_value = 0xffffffff buc_info_ptr->buid_data[2].buid_Sptr = 0x0 buc_info_ptr->buid_data[3].buid_value = 0xffffffff buc_info_ptr->buid_data[3].buid_Sptr = 0x0 buc_info_ptr->mem_alloc1 = 0x0 buc_info_ptr->mem_addr1 = 0x0 buc_info_ptr->mem_alloc2 = 0x0 buc_info_ptr->mem_addr2 = 0x0 buc_info_ptr->vpd_rom_width = 0xffffffff buc_info_ptr->cfg_addr_inc = 0x0 buc_info_ptr->device_id_reg = 0x2020 buc_info_ptr->aux_info_offset = 0x0 buc_info_ptr->feature_rom_code = 0x0 buc_info_ptr->IOCC_flag = 0x1 buc_info_ptr->location[0] = 0x30 buc_info_ptr->location[1] = 0x30 buc_info_ptr->location[2] = 0x31 buc_info_ptr->location[3] = 0x30 sys_info->nvram_size = 0x0 sys_info->nvram_addr = 0x0 sys_info->todr_addr = 0x0 sys_info->architecture = 0x2 sys_info->implementation = 0x3 sys_info->pkg_descriptor="MOT3F00" proc_info->num_of_structs = 0x1 proc_info->index = 0x0 proc_info->struct_size = 0xc8 proc_info->per_buc_info_offset = 0x3c749f4 proc_info->proc_int_area = 0x0 proc_info->proc_int_area_size = 0x0 proc_info->processor_present = 0x1 proc_info->test_run = 0xd5 proc_info->test_stat = 0x0 proc_info->link = 0x0 proc_info->link_address = 0x0 proc_info->phys_id = 0x0 proc_info->priv_lck_cnt = 0x0 proc_info->prob_lck_cnt = 0x0 proc_info->architecture = 0x2 proc_info->implementation = 0x10 proc_info->width = 0x20 proc_info->cache_attrib = 0x1 proc_info->icache_size = 0x8000 proc_info->dcache_size = 0x8000 proc_info->icache_asc = 0x4 proc_info->dcache_asc = 0x4 proc_info->tlb_attrib = 0x1 proc_info->itlb_size = 0x80 proc_info->dtlb_size = 0x80 proc_info->itlb_asc = 0x2 proc_info->dtlb_asc = 0x2 proc_info->slb_attrib = 0x0 proc_info->islb_size = 0x0 proc_info->dslb_size = 0x0 proc_info->islb_asc = 0x0 proc_info->dslb_asc = 0x0 proc_info->rtc_type = 0x2 proc_info->rtcXint = 0x0 proc_info->rtcXfrac = 0x0 proc_info->tbCfreq_HZ = 0x7f2815 proc_info->busCfreq_HZ = 0x0 proc_info->version = 0x50000 proc_info->L2_cache_size = 0x0 proc_info->L2_cache_asc = 0x0 proc_info->coherency_size = 0x20 proc_info->resv_size = 0x20 proc_info->icache_block = 0x20 proc_info->dcache_block = 0x20 proc_info->icache_line = 0x20 proc_info->dcache_line = 0x20 proc_info->proc_descriptor = "PowerPC_604" l2_data->num_of_structs = 0x1 l2_data->index = 0x0 l2_data->struct_size = 0xc0 l2_data->shared_L2_cache = 0x0 l2_data->using_resource_offset = 0xa64 l2_data->mode = 0x0 l2_data->installed_size = 0x0 l2_data->configured_size = 0x0 l2_data->size[0] = 0x0 l2_data->type[0] = 0x30 l2_data->type[1] = 0x30 l2_data->adapter_present = 0x0 l2_data->adapter_bad = 0x0 mem_data[i].num_of_structs = 0x6 mem_data[i].struct_size = 0x34 mem_data[i].card_or_SIMM_size = 0x3e mem_data[i].state = 0x1 mem_data[i].num_of_bad_simms = 0x0 mem_data[i].card_or_simm_indicator = 0x1 mem_data[i].EC_level = 0x0 mem_data[i].PD_bits = 0x0 mem_data[i].location [0][0] = 0x30 mem_data[i].location [0][1] = 0x30 mem_data[i].location [0][2] = 0x30 mem_data[i].num_of_structs = 0x6 mem_data[i].struct_size = 0x34 mem_data[i].card_or_SIMM_size = 0x0 mem_data[i].state = 0x0 mem_data[i].num_of_bad_simms = 0x0 mem_data[i].card_or_simm_indicator = 0x1 mem_data[i].EC_level = 0x0 mem_data[i].PD_bits = 0x0 mem_data[i].location [0][0] = 0x30 mem_data[i].location [0][1] = 0x30 mem_data[i].location [0][2] = 0x30 mem_data[i].location [0][3] = 0x42 mem_data[i].num_of_structs = 0x6 mem_data[i].struct_size = 0x34 mem_data[i].card_or_SIMM_size = 0x0 mem_data[i].state = 0x0 mem_data[i].num_of_bad_simms = 0x0 mem_data[i].card_or_simm_indicator = 0x1 mem_data[i].EC_level = 0x0 mem_data[i].PD_bits = 0x0 mem_data[i].location [0][0] = 0x30 mem_data[i].location [0][1] = 0x30 mem_data[i].location [0][2] = 0x30 mem_data[i].location [0][3] = 0x43 mem_data[i].num_of_structs = 0x6 mem_data[i].struct_size = 0x34 mem_data[i].card_or_SIMM_size = 0x0 mem_data[i].state = 0x0 mem_data[i].num_of_bad_simms = 0x0 mem_data[i].card_or_simm_indicator = 0x1 mem_data[i].EC_level = 0x0 mem_data[i].PD_bits = 0x0 mem_data[i].location [0][0] = 0x30 mem_data[i].location [0][1] = 0x30 mem_data[i].location [0][2] = 0x30 mem_data[i].location [0][3] = 0x44 mem_data[i].num_of_structs = 0x6 mem_data[i].struct_size = 0x34 mem_data[i].card_or_SIMM_size = 0x0 mem_data[i].state = 0x0 mem_data[i].num_of_bad_simms = 0x0 mem_data[i].card_or_simm_indicator = 0x1 mem_data[i].EC_level = 0x0 mem_data[i].PD_bits = 0x0 mem_data[i].location [0][0] = 0x30 mem_data[i].location [0][1] = 0x30 mem_data[i].location [0][2] = 0x30 mem_data[i].location [0][3] = 0x45 mem_data[i].num_of_structs = 0x6 mem_data[i].struct_size = 0x34 mem_data[i].card_or_SIMM_size = 0x0 mem_data[i].state = 0x0 mem_data[i].num_of_bad_simms = 0x0 mem_data[i].card_or_simm_indicator = 0x1 mem_data[i].EC_level = 0x0 mem_data[i].PD_bits = 0x0 mem_data[i].location [0][0] = 0x30 mem_data[i].location [0][1] = 0x30 mem_data[i].location [0][2] = 0x30 mem_data[i].location [0][3] = 0x46 user_info->user_data_len = 0x50 user_info->user_id_offset = 0x9390 user_info->next_offset = 0x0 mot_data->company = "Motorola Computer Group" mot_data->board_model = 0x6 mot_data->board_revision = 0x42 mot_data->ethernet_na = 45 55 55 55 45 55 LED(MOTLED_RELOCATING_KERNEL)=0x13e0 + swcons -c Saving Base Customize Data to boot disk Starting the sync daemon Starting the error daemon System initialization completed. Starting Multi-user Initialization Performing auto-varyon of Volume Groups Activating all paging spaces swapon: Paging device /dev/hd6 activated. Performing all automatic mounts mount: 1831-010 server a2231s01 not responding: RPC: 1832-018 Port mapper failure - RPC: 1832-006 Unable to send mount: backgrounding a2231s01:/home Multi-user initialization completed Checking for srcmstr active...complete Starting tcpip daemons: 0513-059 The syslogd Subsystem has been started. Subsystem PID is 3434. 0513-059 The sendmail Subsystem has been started. Subsystem PID is 5232. 0513-059 The portmap Subsystem has been started. Subsystem PID is 5494. 0513-059 The inetd Subsystem has been started. Subsystem PID is 5756. 0513-059 The snmpd Subsystem has been started. Subsystem PID is 6018. 0513-059 The dpid2 Subsystem has been started. Subsystem PID is 6280. 0513-059 The muxatmd Subsystem has been started. Subsystem PID is 6542. 0513-059 The fibred Subsystem has been started. Subsystem PID is 6804. vmtune: current values: -p -P -r -R -f -F -N -W minperm maxperm minpgahead maxpgahead minfree maxfree pd_npages maxrandwrt 2968 11872 2 8 115 123 524288 0 -M -w -k -c -b -B -u maxpin npswarn npskill numclust numfsbufs hd_pbuf_cnt lvm_bufcnt 12692 1536 384 0 93 64 9 number of valid memory pages = 15864 maxperm=74.8% of real memory maximum pinable=80.0% of real memory minperm=18.7% of real memory number of file memory pages = 1445 numperm=9.1% of real memory
The next step would be to get it working under QEMU.
Under QEMU it gets pretty far, it does find the PCI- and the ISA buses and even the SCSI host.
Unfortunately it doesn't find SCSI disks. Here it is tricky, it may be a problem with the interrupt routing, or DMA or SCSI host emulation.
/Stay tuned
2 comments:
Holy cow dude! You are making amazing progress!!
First Solaris, now AIX! You are the Unix slayer! :)
Thanks, Jason. Well, here it still works on a physical machine. But at least it's a starting point.
Post a Comment