Skip to content
Snippets Groups Projects
  1. Jul 10, 2013
    • Simon Glass's avatar
      bootm: Disable interrupts only when loading · 385501d3
      Simon Glass authored
      
      With the move of the interrupt code to earlier in the sequence, we
      exposed a problem where the interrupts are disabled at each bootm
      stage. This is not correct - it should be done only once. Let's disable
      interrupts in the LOAD stage. Put the code in a function for clarity.
      
      Also, bootz lost its interrupt code altogether, so reinstate it.
      
      Signed-off-by: default avatarSimon Glass <sjg@chromium.org>
      385501d3
  2. Jul 04, 2013
  3. Jun 28, 2013
    • Simon Glass's avatar
      bootm: Disable interrupts before loading OS · 5ff0d083
      Simon Glass authored
      
      This restores the ordering of interrupt disable to what it what before
      commit 35fc84fa. It seems that on some archiectures (e.g. PowerPC) the
      OS is loaded into an interrupt region, which can cause problems if
      interrupts are still running.
      
      Tested-by: default avatarStefan Roese <sr@denx.de>
      Signed-off-by: default avatarSimon Glass <sjg@chromium.org>
      5ff0d083
    • Tom Rini's avatar
      cmd_bootm.c: Correct BOOTM_ERR_OVERLAP handling · d366438d
      Tom Rini authored
      
      With 35fc84fa [Refactor the bootm command to reduce code duplication]
      we stopped checking the return value of bootm_load_os (unintentionally!)
      and simply returned if we had a non-zero return value from the function.
      This broke the valid case of a legacy image file of a single kernel
      loaded into an overlapping memory area (the default way of booting
      nearly all TI platforms).
      
      The best way to fix this problem in the new code is to make
      bootm_load_os be the one to see if we have a problem with this, and if
      it's fatal return BOOTM_ERR_RESET and if it's not BOOTM_ERR_OVERLAP, so
      that we can avoid calling lmb_reserve() but continue with booting.  We
      however still need to handle the other BOOTM_ERR values so re-work
      do_bootm_states so that we have an error handler at the bottom we can
      goto for problems from bootm_load_os, or problems from the other callers
      (as the code was before).  Add a comment to do_bootm_states noting the
      existing restriction on negative return values.
      
      Signed-off-by: default avatarTom Rini <trini@ti.com>
      
      ---
      Changes in v2:
      - Rework so that only bootm_load_os and boot_selected_os head down into
        the err case code, and other errors simply return back to the caller.
        Fixes 'spl export'.
      d366438d
  4. Jun 26, 2013
    • Steven Stallion's avatar
      cmd_bootm: Add command line arguments to Plan 9 · eeaef5e4
      Steven Stallion authored
      
      This patch introduces support for command line arguments to Plan 9.
      Plan 9 generally dedicates a small region of kernel memory (known
      as CONFADDR) for runtime configuration.  A new environment variable
      named confaddr was introduced to indicate this location when copying
      arguments.
      
      Signed-off-by: default avatarSteven Stallion <sstallion@gmail.com>
      [trini: Adapt for Simon's changes about correcting argc, no need to bump
      by 2 now]
      Signed-off-by: default avatarTom Rini <trini@ti.com>
      eeaef5e4
    • Simon Glass's avatar
      Add a 'fake' go command to the bootm command · d0ae31eb
      Simon Glass authored
      
      For tracing it is useful to run as much of U-Boot as possible so as to get
      a complete picture. Quite a bit of work happens in bootm, and we don't want
      to have to stop tracing before bootm starts.
      
      Add a way of doing a 'fake' boot of the OS - which does everything up to
      the point where U-Boot is about to jump to the OS image. This allows
      tracing to record right until the end.
      
      This requires arch support to work.
      
      Signed-off-by: default avatarSimon Glass <sjg@chromium.org>
      d0ae31eb
    • Simon Glass's avatar
      Refactor the bootm command to reduce code duplication · 35fc84fa
      Simon Glass authored
      
      At present the bootm code is mostly duplicated for the plain 'bootm'
      command and its sub-command variant. This makes the code harder to
      maintain and means that changes must be made to several places.
      
      Introduce do_bootm_states() which performs selected portions of the bootm
      work, so that both plain 'bootm' and 'bootm <sub_command>' can use the
      same code.
      
      Additional duplication exists in bootz, so tidy that up as well. This
      is not intended to change behaviour, apart from minor fixes where the
      previously-duplicated code missed some chunks of code.
      
      Signed-off-by: default avatarSimon Glass <sjg@chromium.org>
      35fc84fa
    • Simon Glass's avatar
      Clarify bootm OS arguments · 983c72f4
      Simon Glass authored
      
      At present the arguments to bootm are processed in a somewhat confusing
      way. Sub-functions must know how many arguments their calling functions
      have processed, and the OS boot function must also have this information.
      Also it isn't obvious that 'bootm' and 'bootm start' provide arguments in
      the same way.
      
      Adjust the code so that arguments are removed from the list before calling
      a sub-function. This means that all functions can know that argv[0] is the
      first argument of which they need to take notice.
      
      Signed-off-by: default avatarSimon Glass <sjg@chromium.org>
      983c72f4
  5. Jun 25, 2013
  6. Jun 04, 2013
  7. May 17, 2013
  8. May 14, 2013
  9. Mar 27, 2013
  10. Mar 11, 2013
  11. Mar 04, 2013
  12. Mar 01, 2013
  13. Feb 22, 2013
  14. Feb 08, 2013
  15. Feb 04, 2013
    • Gabor Juhos's avatar
      common/cmd_bootm.c: prevent running of subcommands before 'bootm start' · 0f307343
      Gabor Juhos authored
      
      The execution order of the bootm subcommands is fixed.
      Although here is a sanity check in the state machine
      which should prevent running the subcommands in wrong
      order but it does not catch all possible errors.
      
      It is possible to run any subcommand without running
      'bootm start' first which leads to unexpected behaviour.
      For example, running 'bootm loados' without 'bootm start'
      causes a hang:
      
          U-Boot> bootm loados
             XIP Invalid Image ... OK
          OK
      
      Add a sanity check to 'do_bootm_subcommand' in order
      to ensure that no subcommands can be executed before
      'bootm start'.
      
      After the patch running of any subcommand without running
      'bootm start' will cause an error like this:
      
          U-Boot> bootm loados
          Trying to execute a command out of order
          bootm - boot application image from memory
      
          Usage:
          bootm [addr [arg ...]]
              - boot application image stored in memory
          ...
      
      Signed-off-by: default avatarGabor Juhos <juhosg@openwrt.org>
      0f307343
  16. Jan 10, 2013
  17. Dec 11, 2012
  18. Nov 13, 2012
    • Gabe Black's avatar
      fdt: Add option to default to most compatible conf in a fit image · d95f6ec7
      Gabe Black authored
      
      When booting a fit image with multiple configurations, the user either has to
      specify which configuration to use explicitly, or there has to be a default
      defined which is chosen automatically. This change adds an option to change
      that behavior so that a configuration can be selected explicitly, or the
      configuration which has the device tree that claims to be compatible with the
      earliest item in U-Boot's device tree.
      
      In other words, if U-Boot claimed to be compatible with A, B, and then C, and
      the configurations claimed to be compatible with A, D and B, D and D, E, the
      first configuration, A, D, would be chosen. Both the first and second
      configurations match, but the first one matches a more specific entry in
      U-Boot's device tree. The order in the kernel's device tree is ignored.
      
      Signed-off-by: default avatarGabe Black <gabeblack@google.com>
      
      Commit-Ready: Gabe Black <gabeblack@chromium.org>
      Signed-off-by: default avatarSimon Glass <sjg@chromium.org>
      d95f6ec7
  19. Nov 04, 2012
    • Kim Phillips's avatar
      common/cmd_*.c: sparse fixes · 088f1b19
      Kim Phillips authored
      
      cmd_boot.c:40:5: warning: symbol 'do_go' was not declared. Should it be static?
      cmd_bootm.c:164:6: warning: symbol '__arch_preboot_os' was not declared. Should it be static?
      cmd_bootm.c:477:5: warning: symbol 'do_bootm_subcommand' was not declared. Should it be static?
      cmd_bootm.c:1022:1: error: directive in argument list
      cmd_bootm.c:1028:1: error: directive in argument list
      cmd_bootm.c:1029:1: error: directive in argument list
      cmd_bootm.c:1036:1: error: directive in argument list
      cmd_bootm.c:1042:1: error: directive in argument list
      cmd_bootm.c:1044:1: error: directive in argument list
      cmd_bootm.c:1045:1: error: directive in argument list
      cmd_bootm.c:1047:1: error: directive in argument list
      cmd_bootm.c:1089:5: warning: symbol 'do_iminfo' was not declared. Should it be static?
      cmd_bootm.c:1176:5: warning: symbol 'do_imls' was not declared. Should it be static?
      cmd_bootm.c:1654:1: error: directive in argument list
      cmd_bootm.c:1660:1: error: directive in argument list
      cmd_console.c:32:5: warning: symbol 'do_coninfo' was not declared. Should it be s
      cmd_date.c:46:5: warning: symbol 'do_date' was not declared. Should it be static?
      cmd_echo.c:27:5: warning: symbol 'do_echo' was not declared. Should it be static?
      cmd_exit.c:27:5: warning: symbol 'do_exit' was not declared. Should it be static?
      cmd_fat.c:97:5: warning: symbol 'do_fat_ls' was not declared. Should it be static?
      cmd_fat.c:136:5: warning: symbol 'do_fat_fsinfo' was not declared. Should it be s
      cmd_fdt.c:66:5: warning: symbol 'do_fdt' was not declared. Should it be static?
      cmd_fdt.c:542:43: warning: incorrect type in assignment (different base types)
      cmd_fdt.c:542:43:    expected unsigned int [unsigned] [usertype] <noident>
      cmd_fdt.c:542:43:    got restricted __be32 [usertype] <noident>
      cmd_fdt.c:679:42: warning: cast to restricted __be32
      cmd_fdt.c:820:1: error: directive in argument list
      cmd_fdt.c:822:1: error: directive in argument list
      cmd_flash.c:292:5: warning: symbol 'do_flinfo' was not declared. Should it be static?
      cmd_flash.c:324:5: warning: symbol 'do_flerase' was not declared. Should it be static?
      cmd_flash.c:457:5: warning: symbol 'do_protect' was not declared. Should it be st
      cmd_help.c:27:5: warning: symbol 'do_help' was not declared. Should it be static?
      cmd_i2c.c:136:6: warning: symbol '__def_i2c_init_board' was not declared. Should it be static?
      cmd_i2c.c:144:14: warning: symbol '__def_i2c_get_bus_speed' was not declared. Should it be static?
      cmd_i2c.c:151:5: warning: symbol '__def_i2c_set_bus_speed' was not declared. Should it be static?
      cmd_i2c.c:1322:1: error: directive in argument list
      cmd_i2c.c:1324:1: error: directive in argument list
      cmd_i2c.c:1326:1: error: directive in argument list
      cmd_i2c.c:1328:1: error: directive in argument list
      cmd_i2c.c:1337:1: error: directive in argument list
      cmd_i2c.c:1339:1: error: directive in argument list
      cmd_irq.c:27:5: warning: symbol 'do_interrupts' was not declared. Should it be static?
      cmd_itest.c:133:5: warning: symbol 'binary_test' was not declared. Should it be static?
      cmd_itest.c:158:5: warning: symbol 'do_itest' was not declared. Should it be stat
      cmd_load.c:54:5: warning: symbol 'do_load_serial' was not declared. Should it be static?
      cmd_load.c:431:6: warning: symbol 'his_eol' was not declared. Should it be static?
      cmd_load.c:432:6: warning: symbol 'his_pad_count' was not declared. Should it be static?
      cmd_load.c:433:6: warning: symbol 'his_pad_char' was not declared. Should it be static?
      cmd_load.c:434:6: warning: symbol 'his_quote' was not declared. Should it be static?
      cmd_load.c:436:5: warning: symbol 'do_load_serial_bin' was not declared. Should it be static?
      cmd_load.c:549:6: warning: symbol 'send_pad' was not declared. Should it be static?
      cmd_load.c:558:6: warning: symbol 'ktrans' was not declared. Should it be static?
      cmd_load.c:568:5: warning: symbol 'chk1' was not declared. Should it be static?
      cmd_load.c:578:6: warning: symbol 's1_sendpacket' was not declared. Should it be static?
      cmd_load.c:587:6: warning: symbol 'send_ack' was not declared. Should it be static?
      cmd_load.c:600:6: warning: symbol 'send_nack' was not declared. Should it be static?
      cmd_load.c:614:6: warning: symbol 'os_data_init' was not declared. Should it be static?
      cmd_load.c:615:6: warning: symbol 'os_data_char' was not declared. Should it be static?
      cmd_load.c:657:6: warning: symbol 'k_data_init' was not declared. Should it be static?
      cmd_load.c:663:6: warning: symbol 'k_data_save' was not declared. Should it be static?
      cmd_load.c:669:6: warning: symbol 'k_data_restore' was not declared. Should it be static?
      cmd_load.c:675:6: warning: symbol 'k_data_char' was not declared. Should it be static?
      cmd_load.c:693:6: warning: symbol 'send_parms' was not declared. Should it be static?
      cmd_load.c:694:6: warning: symbol 'send_ptr' was not declared. Should it be static?
      cmd_load.c:698:6: warning: symbol 'handle_send_packet' was not declared. Should i
      cmd_mdio.c:60:5: warning: symbol 'mdio_write_ranges' was not declared. Should it be static?
      cmd_mdio.c:82:5: warning: symbol 'mdio_read_ranges' was not declared. Should it be static?
      cmd_mdio.c:115:5: warning: symbol 'extract_reg_range' was not declared. Should it be static?
      cmd_mdio.c:144:5: warning: symbol 'extract_phy_range' was not declared. Should it
      cmd_mem.c:54:5: warning: symbol 'do_mem_md' was not declared. Should it be static?
      cmd_mem.c:150:5: warning: symbol 'do_mem_mm' was not declared. Should it be static?
      cmd_mem.c:154:5: warning: symbol 'do_mem_nm' was not declared. Should it be static?
      cmd_mem.c:159:5: warning: symbol 'do_mem_mw' was not declared. Should it be static?
      cmd_mem.c:256:5: warning: symbol 'do_mem_cmp' was not declared. Should it be static?
      cmd_mem.c:326:5: warning: symbol 'do_mem_cp' was not declared. Should it be static?
      cmd_mem.c:436:5: warning: symbol 'do_mem_base' was not declared. Should it be static?
      cmd_mem.c:449:5: warning: symbol 'do_mem_loop' was not declared. Should it be static?
      cmd_mem.c:595:5: warning: symbol 'do_mem_mtest' was not declared. Should it be static?
      cmd_mem.c:618:26: warning: Using plain integer as NULL pointer
      cmd_mem.c:1057:5: warning: symbol 'do_mem_crc' was not declared. Should it be static?
      cmd_misc.c:30:5: warning: symbol 'do_sleep' was not declared. Should it be static
      cmd_mmc.c:118:5: warning: symbol 'do_mmcinfo' was not declared. Should it be static?
      cmd_mmc.c:272:32: warning: Using plain integer as NULL pointer
      cmd_mmc.c:150:5: warning: symbol 'do_mmcops' was not declared. Should it be stati
      cmd_mp.c:27:1: warning: symbol 'cpu_cmd' was not declared. Should it be static?
      cmd_mp.c:85:1: error: directive in argument list
      cmd_mp.c:88:1: error: directive in argument list
      cmd_mtdparts.c:150:18: warning: symbol 'mtdids' was not declared. Should it be static?
      cmd_mtdparts.c:153:18: warning: symbol 'devices' was not declared. Should it be static?
      cmd_mtdparts.c:713:5: warning: symbol 'mtd_device_validate' was not declared. Should it be static?
      cmd_mtdparts.c:1887:5: warning: symbol 'do_chpart' was not declared. Should it be static?
      cmd_mtdparts.c:1925:5: warning: symbol 'do_mtdparts' was not declared. Should it be static?
      cmd_mtdparts.c:2060:1: error: directive in argument list
      cmd_mtdparts.c:2063:1: error: directive in argument list
      cmd_mtdparts.c:2066:1: error: directive in argument list
      cmd_mtdparts.c:2071:1: error: directive in argument list
      cmd_mtdparts.c:2073:1: error: directive in argument list
      cmd_nand.c:377:18: error: bad constant expression
      cmd_nand.c:431:5: warning: symbol 'do_nand' was not declared. Should it be static?
      cmd_nand.c:796:1: error: directive in argument list
      cmd_nand.c:801:1: error: directive in argument list
      cmd_nand.c:802:1: error: directive in argument list
      cmd_nand.c:806:1: error: directive in argument list
      cmd_nand.c:819:1: error: directive in argument list
      cmd_nand.c:824:1: error: directive in argument list
      cmd_nand.c:825:1: error: directive in argument list
      cmd_nand.c:831:1: error: directive in argument list
      cmd_nand.c:918:5: warning: symbol 'do_nandboot' was not declared. Should it be static?
      cmd_net.c:33:5: warning: symbol 'do_bootp' was not declared. Should it be static?
      cmd_net.c:107:5: warning: symbol 'do_dhcp' was not declared. Should it be static?
      cmd_net.c:120:5: warning: symbol 'do_nfs' was not declared. Should it be static?
      cmd_nvedit.c:138:5: warning: symbol 'do_env_print' was not declared. Should it be static?
      cmd_nvedit.c:323:5: warning: symbol '_do_env_set' was not declared. Should it be static?
      cmd_nvedit.c:435:5: warning: symbol 'do_env_set' was not declared. Should it be static?
      cmd_nvedit.c:514:5: warning: symbol 'do_env_edit' was not declared. Should it be static?
      cmd_nvedit.c:620:5: warning: symbol 'do_env_save' was not declared. Should it be static?
      cmd_nvedit.c:1016:1: error: directive in argument list
      cmd_nvedit.c:1018:1: error: directive in argument list
      cmd_nvedit.c:1021:1: error: directive in argument list
      cmd_nvedit.c:1023:1: error: directive in argument list
      cmd_nvedit.c:1024:1: error: directive in argument list
      cmd_nvedit.c:1026:1: error: directive in argument list
      cmd_nvedit.c:1027:1: error: directive in argument list
      cmd_nvedit.c:1029:1: error: directive in argument list
      cmd_nvedit.c:1030:1: error: directive in argument list
      cmd_nvedit.c:1032:1: error: directive in argument list
      cmd_nvedit.c:1034:1: error: directive in argument list
      cmd_nvedit.c:1036:1: error: directive in argument list
      cmd_nvedit.c:1037:1: error: directive in argument list
      cmd_nvedit.c:1039:1: error: directive in argument list
      cmd_pci.c:38:17: warning: symbol 'ShortPCIListing' was not declared. Should it be static?
      cmd_pci.c:38:22: warning: 'ShortPCIListing' defined but not used [-Wunused-variable]
      cmd_pci.c:411:5: warning: symbol 'do_pci' was not declared. Should it be static?
      cmd_pci.c:494:1: error: directive in argument list
      cmd_pci.c:497:1: error: directive in argument list
      cmd_reginfo.c:40:5: warning: symbol 'do_reginfo' was not declared. Should it be static?
      cmd_sata.c:31:5: warning: symbol 'sata_curr_device' was not declared. Should it be static?
       note -> ata_piix.c doesn't seem to use 'sata_curr_device'; deleted.
      cmd_sata.c:32:18: warning: symbol 'sata_dev_desc' was not declared. Should it be static?
      cmd_sata.c:70:5: warning: symbol 'do_sata' was not declared. Should it be static?
      cmd_setexpr.c:53:5: warning: symbol 'do_setexpr' was not declared. Should it be static?
      cmd_source.c:186:1: error: directive in argument list
      cmd_source.c:190:1: error: directive in argument list
      cmd_test.c:27:5: warning: symbol 'do_test' was not declared. Should it be static?
      cmd_test.c:153:5: warning: symbol 'do_false' was not declared. Should it be static?
      cmd_test.c:164:5: warning: symbol 'do_true' was not declared. Should it be static
      cmd_usb.c:43:6: warning: symbol 'usb_get_class_desc' was not declared. Should it be static?
      cmd_usb.c:69:6: warning: symbol 'usb_display_class_sub' was not declared. Should it be static?
      cmd_usb.c:151:6: warning: symbol 'usb_display_string' was not declared. Should it be static?
      cmd_usb.c:161:6: warning: symbol 'usb_display_desc' was not declared. Should it be static?
      cmd_usb.c:195:6: warning: symbol 'usb_display_conf_desc' was not declared. Should it be static?
      cmd_usb.c:210:6: warning: symbol 'usb_display_if_desc' was not declared. Should it be static?
      cmd_usb.c:227:6: warning: symbol 'usb_display_ep_desc' was not declared. Should it be static?
      cmd_usb.c:252:6: warning: symbol 'usb_display_config' was not declared. Should it be static?
      cmd_usb.c:283:6: warning: symbol 'usb_show_tree_graph' was not declared. Should it be static?
      cmd_usb.c:343:6: warning: symbol 'usb_show_tree' was not declared. Should it be static?
      cmd_usb.c:356:5: warning: symbol 'do_usbboot' was not declared. Should it be static?
      cmd_usb.c:366:5: warning: symbol 'do_usb' was not declared. Should it be static?
      cmd_version.c:31:5: warning: symbol 'do_version' was not declared. Should it be s
      cmd_ximg.c:46:1: warning: symbol 'do_imgextract' was not declared. Should it be static?
      cmd_ximg.c:272:1: error: directive in argument list
      cmd_ximg.c:276:1: error: directive in argument list
      
      Signed-off-by: default avatarKim Phillips <kim.phillips@freescale.com>
      088f1b19
  20. Sep 24, 2012
    • Joe Hershberger's avatar
      net: Improve the speed of netconsole · f8be7d65
      Joe Hershberger authored
      
      Previously u-boot would initialize the network interface for every
      network operation and then shut it down again.  This makes sense for
      most operations where the network in not known to be needed soon after
      the operation is complete.  In the case of netconsole, it will use the
      network for every interaction with the shell or every printf.  This
      means that the network is being reinitialized very often.  On many
      devices, this intialization is very slow.
      
      This patch checks for consecutive netconsole actions and leaves the
      ethernet hardware initialized between them.  It will still behave the
      same old way for all other network operations and any time another
      network operation happens between netconsole operations.
      
      Signed-off-by: default avatarJoe Hershberger <joe.hershberger@ni.com>
      Cc: Stefano Babic <sbabic@denx.de>
      Acked-by: default avatarStefano Babic <sbabic@denx.de>
      f8be7d65
  21. May 22, 2012
  22. Apr 09, 2012
  23. Apr 02, 2012
  24. Mar 30, 2012
    • Marek Vasut's avatar
      BOOT: Add RAW ramdisk support to bootz · 017e1f3f
      Marek Vasut authored
      
      This patch allows loading RAW ramdisk via bootz command. The raw ramdisk is
      loaded only in case it's size is specified:
      
        bootz <kernel addr> <ramdisk addr>:<ramdisk size> <fdt addr>
      
      For example:
      
        bootz 0x42000000 0x43000000:0x12345 0x44000000
      
      Signed-off-by: default avatarMarek Vasut <marex@denx.de>
      Signed-off-by: default avatarRob Herring <rob.herring@calxeda.com>
      Cc: Tom Warren <TWarren@nvidia.com>
      Cc: albert.u.boot@aribaud.net
      Cc: afleming@gmail.com
      Cc: Simon Glass <sjg@chromium.org>
      Cc: Stephen Warren <swarren@nvidia.com>
      Cc: Nicolas Pitre <nico@fluxnic.net>
      Cc: Wolfgang Denk <wd@denx.de>
      Cc: Detlev Zundel <dzu@denx.de>
      017e1f3f
    • Marek Vasut's avatar
      BOOT: Add "bootz" command to boot Linux zImage on ARM · 44f074c7
      Marek Vasut authored
      
      This command boots Linux zImage from where the zImage is loaded to. Passing
      initrd and fdt is supported.
      
      Tested on i.MX28 based DENX M28EVK
      Tested on PXA270 based Voipac PXA270.
      
      NOTE: This currently only supports ARM, but other architectures can be easily
      added by defining bootz_setup().
      
      Signed-off-by: default avatarMarek Vasut <marek.vasut@gmail.com>
      Cc: Tom Warren <TWarren@nvidia.com>
      Cc: albert.u.boot@aribaud.net
      Cc: afleming@gmail.com,
      Cc: Simon Glass <sjg@chromium.org>,
      Cc: Stephen Warren <swarren@nvidia.com>
      Cc: Nicolas Pitre <nico@fluxnic.net>
      Cc: Wolfgang Denk <wd@denx.de>
      Cc: Detlev Zundel <dzu@denx.de>
      44f074c7
  25. Mar 18, 2012
  26. Mar 06, 2012
Loading